如何使用大量数据的 tikzpicture 制作直方图?

如何使用大量数据的 tikzpicture 制作直方图?

这个问题让我抓狂,我整天都坐着尝试所有我能想到的方法,却没有任何有用的结果。我有一个这样的 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}

分组数据的 ybar 间隔

请注意,我必须使用一个小技巧,用一个小数字覆盖数据中的零,并通过 截断 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}

这里,我不确定完整数据的图表是否好/可读性。区分接近值的线可能仍然存在一些问题,如下面前几个数据点所示。

类茎图

相关内容