背景
今天我介绍一种非常有趣的可视化方法——山脊图(Ridge Plot)。山脊图是一种同时展示多个变量分布的工具,尤其适合用来比较不同类别的数据分布。通过这种图表,可以清晰地看到各个类别的数据在不同特征上的密度差异,如图H
什么是山脊图?
山脊图通常用于展示一系列密度估计图(KDE)的叠加,每一个叠加的图表示一个类别或者一个时间点。图表类似山脉的脊线,因此得名"山脊图"。相比传统的直方图,山脊图不仅能展示数据的分布情况,还能让我们更直观地比较多个类别的特征分布,接下来将通过鸢尾花(Iris)数据集,探讨如何利用山脊图来揭示隐藏在数据中的模式
代码实现
import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
# 加载鸢尾花数据集
iris = load_iris()
iris_df = pd.DataFrame(data=iris.data, columns=iris.feature_names)
iris_df['species'] = iris.target
# 将物种从数字编码映射为字符串标签,便于识别
species_dict = {0: 'setosa', 1: 'versicolor', 2: 'virginica'}
iris_df['species'] = iris_df['species'].map(species_dict)
# 准备绘制山脊图
sns.set(style="white", rc={"axes.facecolor": (0, 0, 0, 0)})
pal = sns.cubehelix_palette(3, rot=-.25, light=.7)
# 创建 FacetGrid 对象,用于绘制每个物种的山脊图
g = sns.FacetGrid(iris_df, row="species", hue="species", aspect=15, height=1.5, palette=pal)
# 为每个物种绘制密度估计图,并设置相关参数
g.map(sns.kdeplot, "sepal length (cm)", bw_adjust=0.5, clip_on=False, fill=True, alpha=1, linewidth=1.5)
# 再绘制一条白色轮廓线以增强视觉效果
g.map(sns.kdeplot, "sepal length (cm)", clip_on=False, color="w", lw=2, bw_adjust=0.5)
# 为每个子图添加一条水平线,作为基准线
g.map(plt.axhline, y=0, lw=2, clip_on=False)
# 调整子图之间的间距,使得各图紧密相连
g.fig.subplots_adjust(hspace=-0.25)
# 清除标题,设置x轴标签
g.set_titles("")
g.set(xlabel="Sepal Length (cm)", yticks=[]) # 设置x轴标签并移除y轴刻度
g.despine(bottom=True, left=True) # 移除图表的底部和左侧的边框
# 修改y轴标签为类别名称
for ax, species in zip(g.axes.flat, ['setosa', 'versicolor', 'virginica']):
ax.set_ylabel(species, rotation=0, labelpad=60) # 修改y轴标签为物种名,旋转角度为0
# 保存并显示图表
plt.savefig("ridge_sepal_length.pdf", format='pdf', bbox_inches='tight', dpi=1200) # 保存图表为PDF格式,紧密布局
plt.show() # 显示图表
代码核心步骤
- 数据准备首先加载 Scikit-learn 提供的鸢尾花数据集,并将其转换为 Pandas 数据框,以便后续处理, 为了更直观地识别物种类别,将类别数字映射为 setosa, versicolor, 和 virginica
- 设置绘图风格与调色板通过 sns.set(),设置了绘图风格, 为了让山脊图更有层次感,采用透明背景,并选择了一组渐变的调色板,使图表更美观
- 使用 FacetGrid 绘制密度图FacetGrid 是 Seaborn 的一个强大工具,可以在同一图表上展示不同类别的子图, 在这里为每个物种绘制了“花萼长度”的密度估计图, 还通过 bw_adjust 参数调整了平滑度,并填充了颜色,使得每个物种的分布更容易辨认
- 添加视觉效果为了增强视觉效果,在每个密度图外绘制了一条白色的轮廓线,并且在每个子图上加了一条水平基准线,使得整个图表更加协调
- 优化展示最后,通过设置子图间距、移除 不必要的刻度与边框等方式,对图表进行了优化,确保各个子图紧密衔接,让信息传达得更为紧凑且美观
图表解读
从最终生成的山脊图可以看出,不同物种的花萼长度有明显的分布差异:
- Setosa 的花萼长度集中在较短范围
- Versicolor 的花萼长度分布稍长,且范围更广
- Virginica 的花萼长度最长,且分布较为均 匀
这些信息可以帮助我们快速了解不同物种之间的特征差异
总结
通过山脊图这种图表不仅美观,还能有效突出各类数据的分布特点,适合在分析多类别变量时使用,如果希望简洁地展示多种类别的特征分布,山脊图是一个强大的选择
往期推荐
基于SHAP值的 BorutaShap 算法在特征选择中的应用与优化
用SHAP可视化解读数据特征的重要性:蜂巢图与特征关系图结合展示
微信号|deep_ML
欢迎添加作者微信进入Python、ChatGPT群
进群请备注Python或AI进入相关群
无需科学上网、同步官网所有功能、使用无限制
如果你对类似于这样的文章感兴趣。
欢迎关注、点赞、转发~
个人观点,仅供参考
