当前位置: 首页 > news >正文

山脊图 (Ridgeline Plot):使用 joypy 库,优雅地比较多组数据的分布情况

山脊图 (Ridgeline Plot):使用 joypy 库,优雅地比较多组数据的分布情况

在这里插入图片描述

导语

在数据可视化的世界里,选择正确的图表来讲述数据背后的故事至关重要。当需要比较多组数据的分布时,传统的小提琴图或箱线图可能会显得拥挤或不够直观。这时,山脊图 (Ridgeline Plot),也因其与 Joy Division 乐队《Unknown Pleasures》专辑封面的相似性而被称为“Joy Plot”,提供了一种美学和功能兼备的解决方案。

本文将介绍如何使用 Python 中的 joypy 库,轻松创建优雅的山脊图,以直观地展示不同类别下数据的分布形态。

(图片来源: Python Graph Gallery)


什么是山脊图?

山脊图通过将多个密度图沿 y 轴堆叠排列,并允许它们部分重叠,来展示不同分组下数值变量的分布情况。这种可视化方式的优势在于:

  • ✅ 清晰对比:可以非常直观地看到各个组别的分布形状、峰值、偏态和离散程度的差异。
  • ✅ 空间高效:相比于将多个直方图或密度图并排摆放,山脊图更节省空间,尤其是在组别数量较多时。
  • ✅ 趋势发现:如果 x 轴代表时间或有序类别,山脊图能清晰地揭示分布随之变化的趋势。

快速开始

joypy 是一个基于 pandasmatplotlib 的库,专门用于绘制山脊图。

⚠️ 1. 安装依赖

首先,确保你已经安装了必要的库。如果尚未安装,可以通过 pip 命令进行安装:

pip install joypy pandas matplotlib

✅ 2. 准备数据

山脊图需要的数据格式通常是一个 pandas.DataFrame 对象,其中至少包含两列:

  1. 一个用于分组的分类变量
  2. 一个用于绘制分布的数值变量

为了方便演示,我们使用经典的 iris (鸢尾花) 数据集。

import pandas as pd
from sklearn.datasets import load_iris
import joypy
import matplotlib.pyplot as plt# 加载数据
iris = load_iris()
df = pd.DataFrame(data=iris.data, columns=iris.feature_names)
df['species'] = pd.Categorical.from_codes(iris.target, iris.target_names)print(df.head())

数据预览:

   sepal length (cm)  sepal width (cm)  petal length (cm)  petal width (cm) species
0                5.1               3.5                1.4               0.2  setosa
1                4.9               3.0                1.4               0.2  setosa
2                4.7               3.2                1.3               0.2  setosa
3                4.6               3.1                1.5               0.2  setosa
4                5.0               3.6                1.4               0.2  setosa

核心实践:绘制山脊图

基础绘图

使用 joypy 绘制山脊图非常简单,只需一行代码即可。我们将按鸢尾花的种类 (species) 来比较花瓣长度 (petal length (cm)) 的分布。

# --- 基础山脊图 ---
fig, axes = joypy.joyplot(data=df, by='species', column='petal length (cm)',figsize=(8, 5)
)# 添加标题和标签
plt.title('Iris Petal Length Distribution by Species', fontsize=16)
plt.xlabel('Petal Length (cm)', fontsize=12)
plt.show()

这会生成一个基础的山脊图,清晰地展示了三个不同品种鸢尾花花瓣长度的分布差异。

自定义与美化

joypy 提供了丰富的参数来自定义图表的外观,使其更具表现力。

  • colormap: 设置颜色映射,使图表更美观。
  • overlap: 调整密度图之间的重叠程度。
  • grid: 是否显示网格线。
  • legend: 是否显示图例。
  • alpha: 设置填充颜色的透明度。
# --- 自定义山脊图 ---
fig, axes = joypy.joyplot(data=df,by='species',column='petal length (cm)',figsize=(10, 6),colormap=plt.cm.viridis, # 使用 Viridis 颜色映射alpha=0.7,               # 设置透明度overlap=2,               # 增加重叠grid='y',                # 添加水平网格线legend=True
)# 设置标题
plt.title('Customized Ridgeline Plot of Iris Petal Length', fontsize=18, pad=20)
plt.xlabel('Petal Length (cm)', fontsize=14)
plt.show()

通过这些简单的自定义,图表变得更加清晰和专业。

更多高级案例

joypy 的能力远不止于此。下面我们看几个更高级的用法。

案例 1:同时比较多个特征

如果你想一次性比较数据集中所有数值特征的分布,只需将列名列表传递给 column 参数即可。

# --- 同时绘制所有数值特征 ---
fig, axes = joypy.joyplot(data=df,by='species',# 传入一个包含所有数值列名的列表column=['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)'],colormap=plt.cm.autumn_r,figsize=(10, 8),alpha=0.8,overlap=2
)plt.title('Full Iris Dataset Ridgeline Plot', fontsize=20, pad=30)
plt.show()

这个功能非常强大,可以快速生成对整个数据集的概览。

案例 2:使用直方图代替密度图

如果你更喜欢直方图的呈现方式,可以通过设置 hist=Truebins 参数来实现。

# --- 绘制重叠的直方图 ---
fig, axes = joypy.joyplot(data=df,by='species',column='petal length (cm)',hist=True,      # 激活直方图模式bins=20,        # 设置分箱数量figsize=(10, 6),colormap=plt.cm.Blues_r,alpha=0.9
)plt.title('Ridgeline Histograms of Petal Length', fontsize=18)
plt.show()
案例 3:添加均值线和修改背景

joypy.joyplot 返回一个 (figure, axes) 元组,我们可以像操作普通 matplotlib 图表一样对其进行深度定制。例如,为每个分布添加一条表示均值的垂直线。

# --- 添加均值线和修改背景 ---
fig, axes = joypy.joyplot(data=df,by='species',column='petal length (cm)',figsize=(10, 6),colormap=plt.cm.coolwarm,overlap=1.5,# linecolor 和 facecolor 设为白色,让均值线更突出linecolor='w',facecolor='w'
)# 计算每个物种的花瓣长度均值
means = df.groupby('species')['petal length (cm)'].mean()# 遍历每个子图 (axes)
for i, ax in enumerate(axes):# 获取对应的物种名称species_name = means.index[i]# 获取对应的均值mean_val = means.iloc[i]# 在子图上绘制垂直的均值线ax.axvline(mean_val, color='red', linestyle='--', linewidth=1.5)# 可以在图上标注均值ax.text(mean_val + 0.1, 0.1, f'Mean: {mean_val:.2f}', color='red', fontsize=9)# 设置图表背景色
fig.set_facecolor('#f0f0f0')
plt.title('Ridgeline Plot with Mean Lines', fontsize=18, pad=20)
plt.show()

探索 AI 的无限可能

掌握像 joypy 这样的高级可视化工具,是数据科学和 AI 领域的重要一步。然而,技术的边界正在被大型语言模型(LLM)以前所未有的速度拓展。对于希望探索和使用各种开源及基础模型的开发者和研究者,0v0 AI 提供了一个绝佳的平台,可以帮助你将数据分析和可视化项目提升到一个全新的水平。

https://0v0.pro


总结

山脊图是一种强大而优雅的可视化工具,尤其适用于比较多组数据的分布。借助 joypy 库,Python 用户可以轻松、高效地创建具有高度可定制性的山脊图。

下次当你需要探索不同类别下的数据分布时,不妨试试山ridge图,它可能会给你带来意想不到的洞察。

http://www.dtcms.com/a/389870.html

相关文章:

  • Linux 进程同步以及僵尸进程等知识介绍
  • Python进程和线程
  • 斐波那契数列的递归和迭代实现
  • 时空预测论文分享:规则知识 因果预测框架 面向研究的评估体系 主动适应漂移
  • 《WINDOWS 环境下32位汇编语言程序设计》第18章 ODBC数据库编程
  • linux入门(3)
  • 任意版本GitLens vscode插件破解邪修秘法
  • Redis最佳实践——热点数据缓存详解
  • font简写和CSS的继承性
  • 高性能服务器配置经验指南6——BIT校园网在ubuntu中的自动检查连接状况脚本使用
  • SQL 连接详解:内连接、左连接与右连接
  • C2000基础-TIM介绍及使用
  • Day 06 动作类的初始化类------以B1为例
  • 面试题:对数据库如何进行优化?
  • samurai 点选分割 box分割
  • 计算机架构的总线协议中的等待状态是什么?
  • C++:入门基础(1)
  • ACD智能分配:服务延续和专属客服设置
  • 自监督学习分割
  • 抛弃自定义模态框:原生Dialog的实力
  • LangGraph 简单入门介绍
  • Docker 部署 DzzOffice:服务器 IP 转发功能是否需要开启
  • 无人机避障——卡内基梅隆大学(CMU)CERLAB 无人机自主框架复现
  • 正点原子zynq_FPGA-初识ZYNQ
  • Vue3中对比ref,reactive,shallowRef,shallowReactive
  • 通过Freemark渲染数据到Word里并生成压缩包
  • Vue 项目中使用 AbortController:解决请求取消、超时与内存泄漏问题
  • 设置管家婆服务器开机自动启动
  • ubuntu20 安装 ros2 foxy
  • 二分查找(二分查找算法)