使用 tikz 创建堆叠直方图

使用 tikz 创建堆叠直方图

我尝试创建一个堆叠直方图。像这样: 在此处输入图片描述

我的数据由类(0-4)和每个类的浮点值组成。

我已经有了所有平均值的直方图。但我想根据每个条形中的类别数量对条形进行着色。

我拥有的:

在此处输入图片描述

代码:

\documentclass{article}
\usepackage{filecontents}
\usepackage{pgfplots, pgfplotstable}
% first number is a class (0-4), second float number is the mean of the data
\begin{filecontents*}{data.csv}
                1,0.177597344546
                1,0.18105947348
                1,0.177429493018
                2,0.244377481246
                4,0.185496836789
                0,0.180714004683
                4,0.187928321127
                3,0.188037364067
                4,0.187302774169
                3,0.188172520266
\end{filecontents*}
\begin{document}
\begin{tikzpicture}
    \begin{axis}[
            ybar stacked,
            ymin=0,
        ]
        \addplot +[
            hist={
                bins=20,
            }   
        ] table [x, y, col sep=comma] {data.csv};
    \end{axis}
\end{tikzpicture}
\end{document}

答案1

我找到了一个解决方案,但我不得不分割我的数据。我为达到等级 (0-4) 创建了一个数据文件,这可以用 grep 轻松完成。grep 0, data.csv > mean0.csv

如果可以在加载数据时添加条件(例如,仅加载 x=0 的行),则此步骤将变得过时。

! 必须定义 xmin 和 xmax,以便每个直方图都使用相同的范围。

\documentclass{article}
\usepackage{filecontents}
\usepackage{pgfplots, pgfplotstable}
% first number is a class (1-4), second float number is the mean of the data
\begin{filecontents*}{mean0.csv}
                0,0.180714004683
\end{filecontents*}
\begin{filecontents*}{mean1.csv}
                1,0.177597344546
                1,0.18105947348
                1,0.177429493018
\end{filecontents*}
\begin{filecontents*}{mean2.csv}
                2,0.244377481246
\end{filecontents*}
\begin{filecontents*}{mean3.csv}
                3,0.188037364067
                3,0.188172520266
\end{filecontents*}
\begin{filecontents*}{mean4.csv}
                4,0.185496836789
                4,0.187928321127
                4,0.187302774169
\end{filecontents*}
\begin{document}
\begin{figure}
    \centering
        \begin{tikzpicture}
            \begin{axis}[
                    ybar stacked,
                    ybar legend,
                    ylabel={\# traces},
                    xlabel={mean},
                    ymin=0,
                    xmin=0.17,
                    xmax=0.25,
                    legend style={at={(0.5,-0.20)},
                    anchor=north,legend columns=-1},
                ]
                \addplot +[hist={bins=20}]table [x, y, col sep=comma] {mean0.csv};
                \addplot +[hist={bins=20}]table [x, y, col sep=comma] {mean1.csv};
                \addplot +[hist={bins=20}]table [x, y, col sep=comma] {mean2.csv};
                \addplot +[hist={bins=20}]table [x, y, col sep=comma] {mean3.csv};
                \addplot +[hist={bins=20}]table [x, y, col sep=comma] {mean4.csv};
                \legend{pro1, pro2, pro3, pro4, pro5}
            \end{axis}
        \end{tikzpicture}
    \caption{caption}
\end{figure}
\end{document}

直方图现在看起来像这样。

在此处输入图片描述

答案2

只是为了完整性。我还创建了另一个解决方案,其中我使用 Python 脚本预先计算了直方图箱。

之前我的数据是这样的:

<class, mean_value>    
1,0.177597344546
1,0.18105947348
1,0.177429493018
...

经过python脚本之后数据是这样的:

<bin_value   class1  class2 class3 class4 class5>
0.177093 471 882 0 0 0
0.180632 538 127 0 135 0
0.184171 0 0 0 691 556
....

最后的乳胶示例:

\documentclass{article}
\usepackage{filecontents}
\usepackage{pgfplots, pgfplotstable}
\begin{filecontents*}{data2.csv}
0.177093 471 882 0 0 0
0.180632 538 127 0 135 0
0.184171 0 0 0 691 556
0.187710 0 0 0 183 453
0.191249 0 0 0 0 0
0.194788 0 0 0 0 0
0.198327 0 0 0 0 0
0.201866 0 0 0 0 0
0.205405 0 0 0 0 0
0.208944 0 0 0 0 0
0.212483 0 0 0 0 0
0.216022 0 0 0 0 0
0.219561 0 0 0 0 0
0.223100 0 0 0 0 0
0.226639 0 0 0 0 0
0.230178 0 0 0 0 0
0.233717 0 0 0 0 0
0.237256 0 0 0 0 0
0.240795 0 0 124 0 0
0.244334 0 0 885 0 0
\end{filecontents*}
\begin{document}
        \begin{tikzpicture}
            \begin{axis}[
                    ybar stacked,
                    ylabel={\# traces},
                    xlabel={mean},
                    ymin=0,
                    legend style={at={(0.5,-0.20)},
                    anchor=north,legend columns=-1},
                ]  
                \addplot +[ybar]table [x index=0,y index=1] {data2.csv};
                \addplot +[ybar]table [x index=0,y index=2] {data2.csv};
                \addplot +[ybar]table [x index=0,y index=3] {data2.csv};
                \addplot +[ybar]table [x index=0,y index=4] {data2.csv};
                \addplot +[ybar]table [x index=0,y index=5] {data2.csv};
                \legend{pro1, pro2, pro3, pro4, pro5}
            \end{axis}
        \end{tikzpicture}
\end{document}

得到的图表与上面的相同。

如果有人要求,我也可以发布 python 脚本。

相关内容