Matplotlib和Seaborn之绝对频率与相对频率
2020-04-23 本文已影响0人
IntoTheVoid
绝对频率与相对频率
默认情况下,seaborn 的 countplot
函数将以绝对频率(或纯粹计数)总结和绘制数据。在某些情形下,你可能需要了解数据分布或者用在总体中所占的比例比较级别。在这种情形下,你需要用相对频率绘制数据,高度表示数据在每个级别的比例,而不是绝对计数。
在条形图中用相对频率绘制数据的一种方式是用比例重新标记计数坐标轴。底层数据不变,只是轴刻度的比例会发生变化。
# get proportion taken by most common group for derivation
# of tick marks
n_points = df.shape[0]
max_count = df['cat_var'].value_counts().max()
max_prop = max_count / n_points
# generate tick mark locations and names
tick_props = np.arange(0, max_prop, 0.05)
tick_names = ['{:0.2f}'.format(v) for v in tick_props]
# create the plot
base_color = sb.color_palette()[0]
sb.countplot(data = df, x = 'cat_var', color = base_color)
plt.yticks(tick_props * n_points, tick_names)
plt.ylabel('proportion')
xticks
和 yticks
函数不仅仅会旋转刻度标签。你还可以获取和设置它们的位置及标签。第一个参数表示刻度位置:在此例中,刻度比例翻倍后变回计数比例。第二个参数表示刻度名称:在此例中,刻度比例的格式为精确到两位小数的字符串。
我还添加了 ylabel
调用,表明我们不再使用绝对计数。
其他版本
你可以在长条上使用文本注释标记频率,而不是以相对频率标尺绘制数据。这需要编写一个循环来遍历刻度位置和标签,并为每个长条添加一个文本元素。
# create the plot
base_color = sb.color_palette()[0]
sb.countplot(data = df, x = 'cat_var', color = base_color)
# add annotations
n_points = df.shape[0]
cat_counts = df['cat_var'].value_counts()
locs, labels = plt.xticks() # get the current tick locations and labels
# loop through each pair of locations and labels
for loc, label in zip(locs, labels):
# get the text property for the label to get the correct count
count = cat_counts[label.get_text()]
pct_string = '{:0.1f}%'.format(100*count/n_points)
# print the annotation just below the top of the bar
plt.text(loc, count-8, pct_string, ha = 'center', color = 'w')
我使用 .get_text()
方法获取类别名称,从而获取每个分类等级的计数。最后,我使用 text
函数输出每个百分比,并将 x 坐标、y 坐标和字符串作为该函数的三个主要参数。
(文档:Text objects)
image.png