我想使用 pgfplots 绘制每个 x 坐标有多个值的数据文件,每个文件的时间跨度为一个月(最多 31 天)。问题是,如果我不将这些值堆叠或叠放在一起绘制,那么对于一张 A4 纸的宽度来说,它们就太多了。最初我每天有 9 个值,但现在我将其减少到 3 个,问题仍然存在。
以下是示例数据文件:
用户数据:
Day UsrsBnnd UsrsRprtd UsrsRegd
1 0 0 3
2 0 0 1
3 0 0 1
4 1 0 3
5 1 0 5
6 0 0 1
7 0 0 43
8 0 0 75
9 2 0 40
10 0 0 8
11 0 0 9
12 1 1 4
13 1 1 5
14 0 0 10
15 0 0 8
16 2 1 3
17 0 0 4
18 1 0 5
19 0 0 3
20 0 0 18
21 0 0 8
22 0 0 3
23 0 0 15
24 2 1 2
25 2 2 2
26 0 0 3
27 0 0 5
28 0 0 4
29 0 0 13
30 0 0 21
31 0 0 12
目前,我通过将列绘制在彼此之上并以 33% 的不透明度进行绘制来绘制它,但这并不能创建可读的、更不用说排列整齐的图形。
移动终端:
\documentclass{article}
\usepackage{pgfplots}
\usepackage[margin=2cm]{geometry}
\begin{document}
\pagestyle{empty}
\begin{tikzpicture}
\begin{axis}[/tikz/ybar, ybar legend, ymin=0, ylabel=Amount, bar width=12pt, axis x line*=left, nodes near coords=\rotatebox{90}{\scriptsize\pgfmathprintnumber\pgfplotspointmeta}, enlarge x limits=0.02, xlabel=Days, xtick=data, width=\textwidth]
\addplot[red,fill=red!40!white,opacity=0.33] table[y index = 1] {userdata.dat};
\addplot[yellow,fill=yellow!40!white,opacity=0.33] table[y index = 2] {userdata.dat};
\addplot[green,fill=green!40!white,opacity=0.33] table[y index = 3] {userdata.dat};
\legend{Users Banned, Users Reported, Users Registered}
\end{axis}
\end{tikzpicture}
\end{document}
我希望得到一些关于如何处理此数据文件和类似数据文件的绘图以获得最佳效果的建议,因为将我目前在论文中得到的东西嵌入到论文中对读者来说是违反直觉的。我希望将生成的图形保持尽可能窄,因为多个绘图应该出现在文本中,而文本不应构成内容的大部分。
答案1
我将为此使用三个不同的轴,例如使用groupplots
库:
\documentclass{article}
\usepackage{pgfplots}
\usepgfplotslibrary{groupplots}
\usepackage{filecontents}
\begin{filecontents}{userdata.dat}
Day UsrsBnnd UsrsRprtd UsrsRegd
1 0 0 3
2 0 0 1
3 0 0 1
4 1 0 3
5 1 0 5
6 0 0 1
7 0 0 43
8 0 0 75
9 2 0 40
10 0 0 8
11 0 0 9
12 1 1 4
13 1 1 5
14 0 0 10
15 0 0 8
16 2 1 3
17 0 0 4
18 1 0 5
19 0 0 3
20 0 0 18
21 0 0 8
22 0 0 3
23 0 0 15
24 2 1 2
25 2 2 2
26 0 0 3
27 0 0 5
28 0 0 4
29 0 0 13
30 0 0 21
31 0 0 12
\end{filecontents}
\begin{document}
\pagestyle{empty}
\pgfplotsset{compat=1.9}
\begin{tikzpicture}
\begin{groupplot}[
ybar=0pt,
/pgf/bar width=1,
ymin=0, xmin=0.5, xmax=31.5,
y=1.5mm,
width=\textwidth,
group style={
group size=1 by 3,
xticklabels at=edge bottom,
yticklabels at=edge left,
vertical sep=5pt,
},
ylabel style={rotate=-90},
axis x line*=left,
point meta=explicit symbolic,
every node near coord/.append style={font=\small},
nodes near coords={\ifnum\pgfplotspointmeta>0 \pgfplotspointmeta\fi},
cycle list={fill=gray!50, draw=black}
]
\nextgroupplot [ylabel=Registered]
\addplot +[fill=green!50] table [y index=3, meta index=3] {userdata.dat};
\nextgroupplot [ymax=6, try min ticks=2, ylabel=Reported]
\addplot +[fill=yellow!50] table [y index=1, meta index=1] {userdata.dat};
\nextgroupplot [ymax=6, try min ticks=2, ylabel=Banned]
\addplot +[fill=red!50] table [y index=2, meta index=2] {userdata.dat};
\end{groupplot}
\end{tikzpicture}
\end{document}