为离散数据选择图形
如果你想绘制离散定量变量,则需要注意以下几点。因为数据点属于固定的值,所以将分箱边缘设为数据实际值之间的某个值可以减少不确定性。你的用户可能不知道分箱边缘上的值进入右侧分箱中,所以这样的做法可以避免用户感到困惑。
请比较下列两个图形,这是两个关于 100 次随机掷骰结果的图形 (die_rolls
),分箱边缘在数据值上时,是放在左侧;分箱边缘在数据值之间时,是放在右侧。
plt.figure(figsize = [10, 5])
# histogram on the left, bin edges on integers
plt.subplot(1, 2, 1)
bin_edges = np.arange(2, 12+1.1, 1) # note `+1.1`, see below
plt.hist(die_rolls, bins = bin_edges)
plt.xticks(np.arange(2, 12+1, 1))
# histogram on the right, bin edges between integers
plt.subplot(1, 2, 2)
bin_edges = np.arange(1.5, 12.5+1, 1)
plt.hist(die_rolls, bins = bin_edges)
plt.xticks(np.arange(2, 12+1, 1))
image.png
你将发现,对于左侧直方图,和之前的示例不同,在设置分箱边缘时,我在最大值 (12) 的基础上加了 1.1,而不是分箱宽度 1。我们提到,等于最右侧分箱边缘的数据点会进入最后一个分箱。这样就会出现一个潜在问题,有可能有很多数据点的值是最大值,尤其当数据为离散值时。1.1 在最后加了一个分箱,用于单独存储值 12,避免最后一个分箱同时存储了 11 和 12。
还有一步,考虑非连接分箱条形图是否能更好地满足需求。下面的图形采用了之前的代码,但是添加了 "rwidth" 参数,用于设置将被每个直方图长条填充的分箱宽度的比例。
bin_edges = np.arange(1.5, 12.5+1, 1)
plt.hist(die_rolls, bins = bin_edges, rwidth = 0.7)
plt.xticks(np.arange(2, 12+1, 1))
image.png
通过在长条之间增加空隙,强调数据的值是离散的。另一方面,以这种方式绘制定量数据可能会被理解为数据是有序数据,这样会对整体的理解带来影响。
对于连续数字数据,不应使用 "rwidth" 参数,因为空隙暗示值是离散的。另外注意,你可能很希望使用 seaborn 的 countplot
函数将离散数字变量的分布情况绘制成长条。这么操作时要小心,因为每个唯一数字值都对应一个长条。此外,即使数据是离散数字,也不要考虑此页面上描述的直方图变体版本,除非唯一值的数量很小,使半个单位的转变或离散长条可解释。如果有大量唯一值并且分布在很大的范围内,则最好采用标准直方图,而不要冒着出现可解释性问题的风险。
虽然你可以使用条形图绘制离散数字数据,但是你很难充分地解释以下对立面,即:将有序数据绘制为直方图。条形图中的长条之间的空隙可以提醒读者,值不是连续的,属于一种 "间隔" 形式:只是级别是有序的。在直方图中删除空隙后,则很难记得这一重要的解释。
网友评论