一维数据可视化:直方图(Histogram)

对于一维数据的可视化,散点图仅适用于数据量较小的情况;当数据量稍大时,散点图就不适用了。对于以下接近200个点的CPU使用率数据:

//181个CPU使用率采样数据
14, 31, 16, ..., 23  

绘制成散点图(抖动图)的话是这样的: dotplot

可以看到,该散点图虽然可以清晰地表示数据聚集区域(20附近),但由于该区域内数据点太多,导致点的重合度过大,从而难以分辨该区域与其它区域在聚集度上的差异。

为了解决这个问题,可以使用直方图(Histogram)。

直方图(Histogram)

所谓直方图,就是将数据值所在范围分成若干个区间,然后在图上描画每个区间中数据点的个数。仍以上述CPU使用率数据为例,下面是其直方图: histogram

与散点图相比,直方图可以清晰地展示数据聚集区域,以及各区域之间聚集度的差异。

对一个数据集进行直方图绘制时,最终的直方图结果不是唯一的,选择不同的参数将生成不同形状的直方图。究其原因,是由于直方图绘制时会丢失部分数据信息;比如在上面的直方图中,数据点14和数据点16之间的差异就被抹掉了。

在绘制直方图的参数中,最重要的参数是数据区间的宽度 — 只有选择合适的区间宽度才能得到满意的结果。以上面的CPU使用率数据为例,如果选择的区间宽度过宽,那么绘制出来的直方图就会丢失过多的信息并误导观察者: histogram-error

如果选择的区间宽度过窄,那么绘制出来的直方图中就会有大量的空白区间,整个图形也会显得比较杂乱,从而给观察数据点的分布带来困难: histogram-narrow

在R语言中,默认采用Sturges算法来选择直方图的区间宽度。

直方图可分为两种:归一化的,以及非归一化的。上述所有的直方图都是非归一化的:描画在图上的是区间中数据点的个数。如果将该数据点个数除以数据点总数,并将该频率值描画在图上,那么该直方图就是归一化的。

R中直方图的绘制

在R语言中,直方图的绘制是很简单的,只要调用hist()函数即可:

cpu <- scan("cpu_data.txt")  
hist(cpu)  

默认情况下,该函数会使用Sturges算法来计算出区间宽度并绘制直方图。如果需要使用别的算法,可以设置breaks参数:

hist(cpu, breaks="otherAlgorithm")  

或者,也可以直接指定直方图中区间的个数:

hist(cpu, breaks=10)  

Chuan Shao

Read more posts by this author.

Shanghai

Subscribe to Chuan's blog

Get the latest posts delivered right to your inbox.

or subscribe via RSS with Feedly!