科研作图——山脊图展示数据分布情况

picture.image

背景

今天我介绍一种非常有趣的可视化方法——山脊图(Ridge Plot)。山脊图是一种同时展示多个变量分布的工具,尤其适合用来比较不同类别的数据分布。通过这种图表,可以清晰地看到各个类别的数据在不同特征上的密度差异,如图H

picture.image

什么是山脊图?

山脊图通常用于展示一系列密度估计图(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()  # 显示图表
      

picture.image

代码核心步骤

  • 数据准备首先加载 Scikit-learn 提供的鸢尾花数据集,并将其转换为 Pandas 数据框,以便后续处理, 为了更直观地识别物种类别,将类别数字映射为 setosa, versicolor, 和 virginica
  • 设置绘图风格与调色板通过 sns.set(),设置了绘图风格, 为了让山脊图更有层次感,采用透明背景,并选择了一组渐变的调色板,使图表更美观
  • 使用 FacetGrid 绘制密度图FacetGrid 是 Seaborn 的一个强大工具,可以在同一图表上展示不同类别的子图, 在这里为每个物种绘制了“花萼长度”的密度估计图, 还通过 bw_adjust 参数调整了平滑度,并填充了颜色,使得每个物种的分布更容易辨认
  • 添加视觉效果为了增强视觉效果,在每个密度图外绘制了一条白色的轮廓线,并且在每个子图上加了一条水平基准线,使得整个图表更加协调
  • 优化展示最后,通过设置子图间距、移除 不必要的刻度与边框等方式,对图表进行了优化,确保各个子图紧密衔接,让信息传达得更为紧凑且美观

图表解读

从最终生成的山脊图可以看出,不同物种的花萼长度有明显的分布差异:

  • Setosa 的花萼长度集中在较短范围
  • Versicolor 的花萼长度分布稍长,且范围更广
  • Virginica 的花萼长度最长,且分布较为均 匀

这些信息可以帮助我们快速了解不同物种之间的特征差异

总结

通过山脊图这种图表不仅美观,还能有效突出各类数据的分布特点,适合在分析多类别变量时使用,如果希望简洁地展示多种类别的特征分布,山脊图是一个强大的选择

往期推荐

SCI图表复现:整合数据分布与相关系数的高级可视化策略

复现顶刊Streamlit部署预测模型APP

树模型系列:如何通过XGBoost提取特征贡献度

SHAP进阶解析:机器学习、深度学习模型解释保姆级教程

特征选择:Lasso和Boruta算法的结合应用

从基础到进阶:优化SHAP力图,让样本解读更直观

SCI图表复现:优化SHAP特征贡献图展示更多模型细节

多模型中的特征贡献度比较与可视化图解

基于SHAP值的 BorutaShap 算法在特征选择中的应用与优化

用SHAP可视化解读数据特征的重要性:蜂巢图与特征关系图结合展示

picture.image

picture.image

picture.image

微信号|deep_ML

欢迎添加作者微信进入Python、ChatGPT群

进群请备注Python或AI进入相关群

无需科学上网、同步官网所有功能、使用无限制

如果你对类似于这样的文章感兴趣。

欢迎关注、点赞、转发~

个人观点,仅供参考

0
0
0
0
评论
未登录
暂无评论