用 pgfplots 绘制帕累托图?

用 pgfplots 绘制帕累托图?

我一直在关注pgfplots 文档制作一些基本的条形图,主要遵循这个例子:

\begin{tikzpicture}
  \begin{axis}[
    ybar, ymin=0,
    width=12cm, height=3.5cm, enlarge x limits=0.5,
    ylabel={\#participants},
    symbolic x coords={no,yes},
    xtick=data,
    nodes near coords, nodes near coords align={horizontal},
    ]
    \addplot coordinates {(3,no) (7,yes)};
  \end{axis}
\end{tikzpicture}

现在我想在生成的条形图上叠加一条线图,以便创建一个帕累托图(使用线条显示累积数据)。 pgfplots 可以将这两个东西放在同一个轴上吗?

答案1

您可以使用 添加具有不同绘图类型的新绘图\addplot [<plot type>] ...;

如果您想在柱状图中添加线图,可以使用\addplot [sharp plot] ...;

如果要保持当前颜色循环不中断,请+在选项前面添加:\addplot +[sharp plot] ...;

要自动计算累计总和,您可以使用 PGFplots 附带的 PGFplotstable 包。它允许您将数据保存到表中,然后可以使用将其输入到 PGFplots \addplot table {<\tablemacro>}。您可以使用创建表

\pgfplotstableread{
Answer Count
no 7
yes 3
undecided 1
}\results

其中第一个数据行是指定列名的标题,是\results保存表的宏。要创建包含累积结果的新列,请执行

\pgfplotstableset{
    create on use/Cumulated/.style={
        create col/expr={
            \pgfmathaccuma + \thisrow{Count}
        }
    }
}

它告诉 PGFplotstable,每当您访问该列Cumulated(尚不存在)时,它将自动创建一个由\pgfmathaccuma(最初为空)的总和和的当前值组成的新列Count

在你的情节中你只需要说

\addplot [sharp plot] table [y=Cumulated] {\results};

完整代码如下:

\documentclass[11pt]{amsart}
\usepackage{pgfplots}
\usepackage{pgfplotstable}

\begin{document}

\pgfplotstableread{
Answer Count
no 7
yes 3
undecided 1
}\results

\pgfplotstableset{
    create on use/Cumulated/.style={
        create col/expr={
            \pgfmathaccuma + \thisrow{Count}
        }
    }
}

\begin{tikzpicture}
  \begin{axis}[
    ybar, ymin=0,
    ylabel={\#participants},
    symbolic x coords={no,yes,undecided},
    xtick=data
    ]
    \addplot [fill=gray!30, nodes near coords] table {\results};
    \addplot [sharp plot,mark=*] table [y=Cumulated] {\results};
  \end{axis}
\end{tikzpicture}

\end{document}  

相关内容