ybar/xbar
可以使用环境属性轻松创建条形图“组” axis
。当\addplot
使用相同的 x/y 坐标发出多个命令时,一个坐标的整个条形图组将以该坐标为中心。但是,这似乎要求每个组使用相同数量的条形图。有什么方法可以放宽这个条件吗?
来自 pgfplots 文档的修改示例:
\documentclass{standalone}
\usepackage{tikz}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
width=0.95*\textwidth,
x tick label style={/pgf/number format/1000 sep=},
ylabel=Population,
enlargelimits=0.15,
legend style={at={(0.5,-0.15)},
anchor=north,legend columns=-1},
ybar,
bar width=7pt,
]
\addplot
coordinates {(1930,50e6) (1940,33e6) (1950,40e6) (1960,50e6) (1970,70e6)};
\addplot
coordinates {(1930,38e6) (1950,43e6) (1960,45e6) (1970,65e6)};
\addplot
coordinates {(1930,15e6) (1940,12e6) (1950,13e6) (1970,35e6)};
\legend{Far,Near,Here,Annot}
\end{axis}
\end{tikzpicture}
\end{document}
遗漏的数字在条形图组内显示为间隙。有什么方法可以改变这种现象吗?
答案1
为了自动查找和关闭“间隙”,需要为每个坐标重新评估单个条形图的偏移(结合一些在 pgfplots 中相当简单的琐碎计数操作)。但是,pgfplots 仅支持统一的bar shift
,即对单个条形图的所有坐标进行一次偏移(\addplot
命令)。此限制是从继承而来的pgf
(需要更多时间来解决)。
一个简单的替代方法是重新分组并手动配置您的组。解决方案可能是
\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=1.3}
\pgfplotsset{
% #1: index in the group(0,1,2,...)
% #2: number of plots of that group
bar group size/.style 2 args={
/pgf/bar shift={%
% total width = n*w + (n-1)*skip
% -> subtract half for centering
-0.5*(#2*\pgfplotbarwidth + (#2-1)*\pgfkeysvalueof{/pgfplots/bar group skip}) +
% the '0.5*w' is for centering
(.5+#1)*\pgfplotbarwidth + #1*\pgfkeysvalueof{/pgfplots/bar group skip}},%
},
bar group skip/.initial=2pt,
plot 0/.style={blue,fill=blue!30!white,mark=none},%
plot 1/.style={red,fill=red!30!white,mark=none},%
plot 2/.style={brown!60!black,fill=brown!30!white,mark=none},%
}
\begin{document}
\thispagestyle{empty}
\begin{tikzpicture}
\begin{axis}[
width=0.95*\textwidth,
x tick label style={/pgf/number format/1000 sep=},
ylabel=Population,
enlargelimits=0.15,
legend style={at={(0.5,-0.15)},
anchor=north,legend columns=-1},
ybar,
bar width=7pt,
xtick={1930,1940,1950,1960,1970},
]
\addplot[plot 0,bar group size={0}{3}]
coordinates {(1930,50e6) (1950,40e6) (1970,70e6)};
\addplot[plot 1,bar group size={1}{3}]
coordinates {(1930,38e6) (1950,43e6) (1970,65e6)};
\addplot[plot 2,bar group size={2}{3}]
coordinates {(1930,15e6) (1950,13e6) (1970,35e6)};
\addplot[plot 0,bar group size={0}{2}]
coordinates { (1940,33e6) };
%SKIP second
%
\addplot[plot 2,bar group size={1}{2}]
coordinates { (1940,12e6) };
\addplot[plot 0,bar group size={0}{2}]
coordinates { (1960,50e6) };
\addplot[plot 1,bar group size={1}{2}]
coordinates { (1960,45e6) };
%SKIP third
%
\legend{Far,Near,Here}
\end{axis}
\end{tikzpicture}
\end{document}
我对您的代码进行了以下更改:
我介绍了一下风格
bar group size={index}{group size}
。我将您的 3 个条形图重新分组为不同的
\addplot
命令,以便每个组都有相同的一组 x 坐标。我禁用了
cycle list
并明确提供了选项。
请注意,相邻条形之间的计算bar shift
和间隙已从 pgfplots 手册(比较文档/pgfplots/ybar
)复制而来(带有明显的修改)。