一维数据可视化:散点图(dot plot)

在统计分析过程中,有时需要对一维数据(单变量数据)进行可视化,以方便观察数据点分布的特征,并提出基于直观感受的预测。

一维数据

一维数据(单变量数据),顾名思义,就是可以用一个变量来表示的数据集。比如,对CPU的使用率进行随机采样所得到的数据集就是一维数据:

//一维数据示例,CPU使用率
27, 22, 30, 30, 25, 28, 28, 30, 78, 88, 86, 29, 17, 19, 23, 26, 27, 30, 31, 27  

散点图

对于一维数据,可以通过散点图来进行可视化。所谓散点图,就是把所有的数据点都描绘在一条直线上(一般使用水平直线),数据点的值决定其在直线上的位置。以上述CPU使用率数据为例,下面就是该数据的散点图: dotplot

可以观察到,CPU数据聚集在30附近,并在接近90的地方有几个离散点。

上面的散点图有个问题:数据聚集的地方无法清晰地分辨出聚集程度,而值相同的数据点则会互相遮蔽从而引起误解。

对于散点图的这个问题,一个解决方案是将数据点进行分离,比如将值相同的数据点进行层叠: dotplot2

可以看到,与之前的散点图相比,数据点分离后的散点图更容易分辨聚集程度。

另一个解决方案则是对所有的散点进行随机离散化(抖动图 jitter plot): jitterplot

与之前的散点图相比,抖动图在表示数据点的分布和聚集程度上显得更加自然。我个人也更倾向于使用抖动图来展示一维散点数据。

在使用抖动图时,有2点值得注意:

  1. 抖动幅度的设置。抖动幅度过小,则散点过于聚集;抖动幅度过大,则散点过于分离。两者都不利于对散点数据进行观察。
  2. 数据点符号的选择。除了上述例子中的空心小圆环,抖动图可以用别的符号来表示数据点,比如实心小三角形等。不过在数据量稍大的情况下,空心小圆环是一个很不错的选择,因为即使发生数据点的部分重合,抖动图的观察者都可以轻松地分辨出这两个数据点。

R中一维数据的导入

在R中,一维数据是用Vector来存放的,可以在R控制台中通过键盘输入来进行创建:

//创建包含三个数据的Vector
cpu <- c(27, 22, 30)  

更实用的方法则是读取数据文件并将文件中的一维数据导入到R中。比如,对于以空格分隔的数据文件:

//cpu_data.txt, 以空格分隔多个CPU使用率数据
27 22 30 30 25 28 28 30 78 88 86 29 17 19 23 26 27 30 31 27  

可以通过scan()函数将上述文件中的数据读取到Vector中:

cpu <- scan("cpu_data.txt")  

R中散点图的制作

在R中,散点图的制作是通过使用stripchart()函数来实现的。比如,以下语句将生成图1(散点图):

stripchart(cpu, pch=1)  

其中,cpu是一个Vector变量,保存了从数据文件中导入的一维数据;pch=1指定了数据点的符号为空心小圆环(如果不指定则使用默认值:空心小方块)。

如果需要生成图2(层叠散点图),则需在stripchart()函数的使用中定义method为”stack”:

stripchart(cpu, method="stack", pch=1)  

如果需要生成图3(抖动图),则需在stripchart()函数的使用中定义method为”jitter”:

stripchart(cpu, method="jitter", pch=1)  

关于stripchart()函数,可以在R中用help(stripchart)来读取帮助文档,也可以直接访问网上的在线文档: http://stat.ethz.ch/R-manual/R-devel/library/graphics/html/stripchart.html