如何在 pgfplots 中创建不同大小的条形图组?

如何在 pgfplots 中创建不同大小的条形图组?

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}

我对您的代码进行了以下更改:

  1. 我介绍了一下风格bar group size={index}{group size}

  2. 我将您的 3 个条形图重新分组为不同的\addplot命令,以便每个组都有相同的一组 x 坐标。

  3. 我禁用了cycle list并明确提供了选项。

请注意,相邻条形之间的计算bar shift和间隙已从 pgfplots 手册(比较文档/pgfplots/ybar)复制而来(带有明显的修改)。

相关内容