KDE 图
学习如何绘制、设计和解读核密度估计图(KDE图)以进行数据可视化。
KDE图是一种核密度估计图,用于估计数据的概率密度函数。它使用非参数概率密度函数,意味着我们不对数据中的分布形式做出任何先验假设。
我们已经导入了所需的库,并将penguins数据集保存在名为penguins_df的DataFrame中(已移除空值)。我们使用sns.kdeplot()函数并传入变量'body_mass_g',以曲线形式查看其分布。从下图可以看出,大多数企鹅的体质量(body_mass_g)集中在3000–4000之间,因为这是KDE图的峰值区域,而6000–7000范围内的企鹅数量非常少。
1sns.kdeplot(x='body_mass_g', data=penguins_df) 2plt.savefig('output/graph.png')
KDE图的带宽可以通过bw_adjust参数进行自定义,默认值为1。在KDE图中,带宽起到平滑因子的作用:数值越小,曲线越尖锐;数值越大,曲线越平滑。
1sns.kdeplot(x='body_mass_g', data=penguins_df, bw_adjust=0.08) # 低带宽 2plt.savefig('output/graph.png')
需要注意的是,带宽参数的设置要谨慎。过度平滑会掩盖数据中的关键模式,而过少平滑则会产生不必要的噪声——这两种情况都不理想。例如,在下面的代码中,我们传入一个较高的bw_adjust值,导致曲线变得极为平滑。
1sns.kdeplot(x='body_mass_g', data=penguins_df, bw_adjust=10) 2plt.savefig('output/graph.png')
从上图可以看出,增加平滑因子有时会导致曲线在数据范围之外出现负值。但我们可以使用cut参数来缓解这一问题。cut参数的值会与平滑因子相乘,决定曲线在数据点之外延伸的距离。当设置cut=0时,曲线会在数据范围内截断。
1sns.kdeplot(x='body_mass_g', bw_adjust=10, cut=0, data=penguins_df) 2plt.savefig('output/graph.png')
我们可以将KDE图的坐标轴缩放改为对数尺度。为此,只需在代码中传入log_scale=True。此时,body_mass_g将以对数尺度显示。对于单变量KDE图,仅有一个轴(x或y)会被转换为对数尺度;而对于双变量KDE图,两个轴都会被转换为对数尺度。默认的对数底数是10,也可以传入其他数值作为期望的对数底数。
1sns.kdeplot(x='body_mass_g', data=penguins_df, log_scale=True) # 对数缩放 2plt.savefig('output/graph.png')
我们可以自定义KDE图中使用的密度函数。默认情况下,KDE图使用概率密度函数。我们可以通过在sns.kdeplot()函数中指定cumulative=True将其改为累积分布函数。
1sns.kdeplot(x='body_mass_g', data=penguins_df, cumulative=True) 2plt.savefig('output/graph.png')
要绘制双变量KDE图,需在sns.kdeplot()函数中同时传入x和y参数。例如,我们绘制body_mass_g与bill_length_mm的KDE图,分别代表企鹅的体质量和喙长。可以看到两者之间存在上升趋势:随着body_mass_g的增加,bill_length_mm也相应增加。
1sns.kdeplot(x='body_mass_g', y='bill_length_mm', data=penguins_df) 2plt.savefig('output/graph.png')
我们可以自定义双变量KDE图中的等高线数量,其默认值为10。根据需要可增加或减少该数值。例如,下面代码中通过指定levels=15来增加等高线数量:
1sns.kdeplot(x='body_mass_g', y='bill_length_mm', levels=15, data=penguins_df) 2plt.savefig('output/graph.png')
我们可以通过在sns.kdeplot()函数中设置shade=True来填充KDE图的区域。
1sns.kdeplot(x='body_mass_g', data=penguins_df, shade=True) # 填充 2plt.savefig('output/graph.png')
我们可以根据分类变量对KDE图进行颜色编码。例如,下面代码中通过传入hue='species'对KDE图进行颜色编码:
1sns.kdeplot(x='body_mass_g', hue='species', shade=True, data=penguins_df) 2plt.savefig('output/graph.png')
使用hue属性时,可以通过传入multiple='stack'将多个图堆叠在一起,而不是分别显示。
1sns.kdeplot(x='body_mass_g', hue='species', shade=True, multiple='stack', data=penguins_df) 2plt.savefig('output/graph.png')
我们还可以通过指定palette='Paired'进一步自定义KDE图的颜色主题。设置linewidth=3使各图之间的区分更加明显。同时设置multiple='fill',表示填充每个类别在坐标轴范围内的全部区域。例如,可以看出Gentoo物种的体质量大于4000。
1sns.kdeplot(x='body_mass_g', hue='species', shade=True, multiple='fill', palette="Paired", linewidth=3, data=penguins_df) 2plt.savefig('output/graph.png')
注意:
palette属性仅在使用hue属性时生效。
类似地,我们也可以对双变量KDE图进行样式调整。下面代码中设置shade=True以填充图形区域。
1sns.kdeplot(x='body_mass_g', y='bill_length_mm', levels=15, shade=True, data=penguins_df) 2plt.savefig('output/graph.png')
上图中可见深色与浅色区域的组合。我们可以通过cmap属性更改双变量KDE图的默认颜色主题。此外,通过传入cbar=True可添加颜色条,以显示每种阴影所代表的含义。图中每个颜色层级对应不同的密度值。从下图可以看出,绿色区域表示高密度区域,而接近黑色的区域则表示低密度值。
1sns.kdeplot(x='body_mass_g', y='bill_length_mm', levels=15, shade=True, cbar=True, cmap='mako', data=penguins_df) 2plt.savefig('output/graph.png')
在下面的KDE图函数中加入thresh属性,用于确定绘制轮廓线的最低密度水平。其值介于0到1之间。同时,通过alpha属性控制图形的透明度。此处通过降低 alpha 参数的值来增大透明度。
1sns.kdeplot(x='body_mass_g', y='bill_length_mm', levels=15, shade=True, hue='species', hue_order=['Chinstrap', 'Gentoo'], thresh=0.01, alpha=0.5, data=penguins_df) 2plt.savefig('output/graph.png')