调整后的条形图
在上节课,我们提到直方图和条形图分别可以描绘数字变量和分类变量的分布情况,长条的高度(或长度)表示落入每个长条的值范围内的数据点数量。这些图形可以经过调整,用作双变量图形,方法是用第二个变量表示均值或其他统计指标,而不是用高度表示计数。
例如,我们可以调整条形图,使长条高度表示数字变量的均值,从而绘制数字变量和分类变量的关系。这就是 seaborn 的 barplot
函数的作用:
base_color = sb.color_palette()[0]
sb.barplot(data = df, x = 'cat_var', y = 'num_var', color = base_color)
系统会自动为每个分类级别分配不同的色调,除非在“color”参数中设置了固定的颜色,就像 countplot
和 violinplot
一样。
长条高度表示数字变量的均值,并绘制误差条,表示基于方差和样本大小的均值不确定性。差值长条一端因为负均值而跑到 0 轴下方。
此外,可以使用 pointplot
函数将平均值绘制为点,而不是长条。如果用长条表示 0 基线不太重要或者容易让人困惑,那么这么设置很有用。
sb.pointplot(data = df, x = 'cat_var', y = 'num_var', linestyles = "")
plt.ylabel('Avg. value of num_var')
默认情况下,pointplot
将用线条连接值。如果分类变量本身是有序的,那么这样连接没什么问题,但是对于名目数据(即分类变量是无序的)来说,建议通过 linestyles = ""
删除该线条。
如果箱线图和小提琴图都不适合表示数据,上述图形可能比较合适。例如,如果数字变量本身是二进制,值仅包括 0 和 1,那么箱线图或小提琴图将无法呈现足够的信息,而调整后的条形图最适合显示这些数据。
plt.figure(figsize = [12, 5])
base_color = sb.color_palette()[0]
# left plot: violin plot
plt.subplot(1, 3, 1)
sb.violinplot(data = df, x = 'condition', y = 'binary_out', inner = None,
color = base_color)
plt.xticks(rotation = 10) # include label rotation due to small subplot size
# center plot: box plot
plt.subplot(1, 3, 2)
sb.boxplot(data = df, x = 'condition', y = 'binary_out', color = base_color)
plt.xticks(rotation = 10)
# right plot: adapted bar chart
plt.subplot(1, 3, 3)
sb.barplot(data = df, x = 'condition', y = 'binary_out', color = base_color)
plt.xticks(rotation = 10)
调整后的直方图
我们还可以调整 Matplotlib 的 hist
函数,以便通过“weights”参数使长条高度表示数据点数量的其他值。默认情况下,每个数据点的权重是 1,以便每个分箱中的数据点权重之和等于数据点的数量。如果我们将权重更改为表示每个点在第二个变量上的值的函数,那么和将表示计数之外的值。
bin_edges = np.arange(0, df['num_var'].max()+1/3, 1/3)
# count number of points in each bin
bin_idxs = pd.cut(df['num_var'], bin_edges, right = False, include_lowest = True,
labels = False).astype(int)
pts_per_bin = df.groupby(bin_idxs).size()
num_var_wts = df['binary_out'] / pts_per_bin[bin_idxs].values
# plot the data using the calculated weights
plt.hist(data = df, x = 'num_var', bins = bin_edges, weights = num_var_wts)
要获取每个分箱中 y 变量的均值(“binary_out”),每个点的权重应该等于 y 变量除以 x 分箱内的点数 (num_var_wts
)。num_var_wts
表达式末尾的 .values
使元素级相除运算能成功。bin_idxs
使我们能够更轻松地对分箱成员进行数字引用。
(文档:pandas cut
)
此图表明 y 变量“binary_out”的平均结果基本上随着 x 变量“num_var”的增大而增大。
更常见的情形是,你将发现图形将某个数字变量的值与第二个数字变量的关系总结为折线图,而不是调整后的直方图。下个页面将讲解这方面的知识。