pgfplots 堆积条形图中的不同条形宽度

pgfplots 堆积条形图中的不同条形宽度

下面是来自 pgfplots 手册的堆积条形图的一个简单示例。

在我的例子中,y 轴代表百分比,所有列中的百分比加起来为 100(因此像本例一样,所有条形图的高度相同)。但是,每个组中项目的绝对数量不同。例如,我有 200 个工具 1 的样本,但有 500 个工具 2 的样本。我想根据每个组中的样本总数修改条形图的宽度,以便较大组的条形图更宽。

我知道bar width。但是,\addplot宏定义了所有坐标,例如蓝色部分,因此bar width在第一个上设置\addplot会更改所有蓝色条形部分的宽度。我想要的是一种设置整个列宽度的方法。

有办法吗?理想情况下,宽度是自动计算的,但如果我必须手动设置每列的宽度,那就没问题了。

在此处输入图片描述

\documentclass{article}

\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{width=7cm,compat=1.18}

\begin{document}

\begin{tikzpicture}
  \begin{axis}[
    ybar stacked,
    symbolic x coords={tool1,tool2,tool3,tool4,tool5,tool6,tool7},
    xtick=data,
    x tick label style={rotate=45,anchor=east}]
  \addplot+ [ybar] coordinates {(tool1,0) (tool2,2) (tool3,2) (tool4,3) (tool5,0) (tool6,2) (tool7,0)};
  \addplot+ [ybar] coordinates {(tool1,0) (tool2,0) (tool3,0) (tool4,3) (tool5,1) (tool6,1) (tool7,0)};
  \addplot+ [ybar] coordinates {(tool1,6) (tool2,6) (tool3,8) (tool4,2) (tool5,6) (tool6,5) (tool7,6)};
  \addplot+ [ybar] coordinates {(tool1,4) (tool2,2) (tool3,0) (tool4,2) (tool5,3) (tool6,2) (tool7,4)};
  \end{axis}
\end{tikzpicture}

\end{document}

答案1

这是一种可行的方法,但并不是很巧妙,需要进行一些手动调整。

我使用常规bar图表,并使用 将多个条形图放在彼此后面bar shift=0pt。我为每个条形图部分定义一个图(在此示例中总共有 4*7 个图),以便每个图的宽度都可以单独操纵。\addbar添加单个数据酒吧,而不是阴谋,并允许单独设置宽度。

我需要重新定义cycle list以使用与每个条形图数量相同的项目数。cycle list也与其默认定义相反,因为在此方法中,最高的条形图部分位于首位。

请注意,与 不同ybar stacked,当数据为 0 时,会有一个高度为 0 的条形部分可见(例如,tool1、tool5 和 tool7 的蓝色部分)。这种方法无疑还存在其他问题,我仍然欢迎其他解决方案,但也许这对某些人有用。

在此处输入图片描述

\documentclass{article}

\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{width=7cm,compat=1.18}

\begin{document}

\begin{tikzpicture}
  \begin{axis}[
      ybar,
      % X axis
      % We cannot use symbolic x coords because then we cannot use math expressions in coordinate definitions.
      xtick={1,2,3,4,5,6,7},
      xticklabels={tool1,tool2,tool3,tool4,tool5,tool6,tool7},
      x tick label style={rotate=45,anchor=east},
      cycle list={%
        {black,fill=gray,mark=none},%
        {brown!60!black,fill=brown!30!white,mark=none},%
        {red,fill=red!30!white,mark=none},%
        {blue,fill=blue!30!white,mark=none}%
        }]

    \def\addbar#1#2#3#4#5#6{% #1: index, #2: width, #3-6: values
      \addplot+[bar shift=0pt,bar width=#2] coordinates { (#1,#3+#4+#5+#6) };
      \addplot+[bar shift=0pt,bar width=#2] coordinates { (#1,#3+#4+#5) };
      \addplot+[bar shift=0pt,bar width=#2] coordinates { (#1,#3+#4) };
      \addplot+[bar shift=0pt,bar width=#2] coordinates { (#1,#3) };
    }

    \addbar{1}{10pt}{0}{0}{6}{4}
    \addbar{2}{20pt}{2}{0}{6}{2}
    \addbar{3}{10pt}{2}{0}{8}{0}
    \addbar{4}{20pt}{3}{3}{2}{2}
    \addbar{5}{10pt}{0}{1}{6}{3}
    \addbar{6}{20pt}{2}{1}{5}{2}
    \addbar{7}{10pt}{0}{0}{6}{4}
  \end{axis}
\end{tikzpicture}

\end{document}

相关内容