这个问题让我抓狂,我整天都坐着尝试所有我能想到的方法,却没有任何有用的结果。我有一个这样的 csv 文件:
3001, 3001, 15001, 7206, 7217, 7617, 15001, 7215, 7536, 7206, 7557, 7212, 7158, 7833, 8394, 15001, 8103, 10736, 15001...
我想绘制不同数字出现的频率并制作直方图。总共有大约 100 万个数字。如果 tikzpicture 无法处理,我还制作了一个如下的 csv 文件:
data,count
1361,8
1377,8
1385,2
1389,2
2001,20
...
数据已经统计过。此文件只有 540 行。问题是许多数字彼此非常接近,因此条形图中的条形最终会相互重叠。因此,我制作了另一个 csv 文件,其中的箱体如下所示:
data,count
1000,20
2000,20
3000,5195
...
但我也不知道该如何绘制它...我没什么主意了。我该如何绘制这些数据???
这是我迄今为止最好的尝试:完整数据:
data,count
1000,20
2000,20
3000,5195
4000,0
5000,0
6000,501392
7000,1481
8000,495
9000,163
10000,683
15000,114
20000,0
30000,0
40000,0
50000,2240
60000,0
70000,0
80000,0
90000,0
100000,213734
110000,0
120000,0
130000,2923
200000,37
代码:
\begin{figure}[H]
\centering
\begin{tikzpicture}
\begin{loglogaxis}[
ybar,
bar width=1pt,
ymin=0,
x=2cm,
scaled x ticks=false,
x tick label style={rotate=45, anchor=east},
xtick=data,
xticklabels={1 000 - 1 999,2 000 - 2 999,3 000 - 3 999,6 000 - 6 999,7 000 - 7 999,8 000 - 8 999,9 000 - 9 999,10 000 - 14 999,15 000 - 19 999,50 000 - 59 999,100 000 - 109 999,130 000 - 199 999,200 000 - 304 969},
xlabel=Sampling Rate (Hz),
ylabel=Count]
\addplot table[x=data,y=count,col sep=comma] {dataset_stats/all_files_length_samples_binned2.csv};
\end{loglogaxis}
\end{tikzpicture}
\end{figure}
感谢您的帮助
答案1
我建议两个选项,一个用于分组数据,一个用于离散值的计数列表。
首先,对于分组数据,我认为ybar interval
这可能是最好的可视化。这样,间隔宽度已经由条形宽度与相关刻度标签的组合给出。我仍然遇到了 100 和 130 kHz 的小重叠/关闭标签问题,我只能通过省略其中一个刻度来解决这个问题。此外,零loglogaxis
不能很好地处理,所以我不得不解决这个问题。我假设,可能有更好的方法来处理刻度,但这是我目前得到的结果:
\documentclass{standalone}
\usepackage{pgfplots}
\begin{filecontents}{adjusted_data.csv}
data,count
1000,20
2000,20
3000,5195
4000,1e-1
5000,1e-1
6000,501392
7000,1481
8000,495
9000,163
10000,683
15000,114
20000,1e-1
30000,1e-1
40000,1e-1
50000,2240
60000,1e-1
70000,1e-1
80000,1e-1
90000,1e-1
100000,213734
110000,1e-1
120000,1e-1
130000,2923
200000,37
304696,1e-1
\end{filecontents}
\begin{document}
\begin{tikzpicture}
\begin{loglogaxis}[
ybar interval,
ymin=1,
x=2cm,
xtick=data,
x tick label as interval=false,
% xticklabels={1,2,3,4,5,6,7,8,9,10,15,20,30,40,50,60,70,80,90,100,110,120,130,200},
xticklabels={1,2,3,4,{},6,{},8,{},10,15,20,{},{},50,{},{},{},{},100,{},{},{},200},
xlabel=Sampling Rate (kHz),
ylabel=Count,
fill=blue]
\addplot table[x=data,y=count,col sep=comma] {adjusted_data.csv};%
\end{loglogaxis}
\end{tikzpicture}
\end{document}
请注意,我必须使用一个小技巧,用一个小数字覆盖数据中的零,并通过 截断 1 以下的所有内容ymin
。我还为最后一个间隔添加了一个最终点 304969。
或者,在计算离散值时,类似于 MATLAB 中的 stem 图可能是条形图的良好替代方案,并且不存在重叠问题。这可以通过以下选项ycomb
实现:addplot
\documentclass{standalone}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{loglogaxis}[%
xmin=1300,
xmax=305000,
ymin=1,
ymax=1e6,
xlabel=Sampling Rate (Hz),
ylabel=Count
]
\addplot[ycomb, color=blue, forget plot] table[row sep=crcr] {%
1361 8\\
1377 8\\
1385 2\\
1389 2\\
2001 20\\
};
\end{loglogaxis}
\end{tikzpicture}%
\end{document}
这里,我不确定完整数据的图表是否好/可读性。区分接近值的线可能仍然存在一些问题,如下面前几个数据点所示。