我尝试创建一个堆叠直方图。像这样:
我的数据由类(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 脚本。