![pgfplots 堆积条形图中的不同条形宽度](https://linux22.com/image/468068/pgfplots%20%E5%A0%86%E7%A7%AF%E6%9D%A1%E5%BD%A2%E5%9B%BE%E4%B8%AD%E7%9A%84%E4%B8%8D%E5%90%8C%E6%9D%A1%E5%BD%A2%E5%AE%BD%E5%BA%A6.png)
下面是来自 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}