雨云图 (Raincloud Plot):使用 PtitPrince 库,结合箱线图、密度图与散点,全面展示数据分布

在这里插入图片描述

导语

在数据可视化的世界里,我们常常需要在“宏观统计”与“微观细节”之间做出权衡。例如,箱线图(Box Plot)能清晰地展示数据的五数概括(中位数、四分位数等),但隐藏了数据的真实分布形态;而提琴图(Violin Plot)虽然展示了密度分布,却丢失了单个数据点的信息。有没有一种方法可以将二者优点集于一身,既展示整体,又不失细节呢?答案就是 雨云图(Raincloud Plot)

本文将详细介绍这种强大的可视化技术,并教你如何使用 Python 中的 PtitPrince 库轻松创建信息丰富、外观精美的雨云图。

当然,在学习和探索 PtitPrince 这类新库时,如果能有一个随叫随到的编程伙伴,无疑会事半功倍。这里推荐一款强大的 AI 助手——0v0 AI 助手。它完全免费,不限对话次数,集成了 Llama、Qwen 等多种优秀的开源模型,甚至每周都能免费体验 gpt-5 这样的旗舰模型。无论是帮你理解代码、生成示例还是调试错误,它都能提供极大的帮助。

什么是雨云图?

雨云图并非单一的图表,而是一个组合图,通常由三个核心部分构成,形态上酷似一片下雨的云朵,故此得名:

  1. 云(The Cloud):通常是一个半提琴图密度图,展示了数据分布的轮廓和密度。这是宏观视角,让我们能快速了解数据在何处集中、是否存在多峰等情况。
  2. 雨(The Rain):即散点图抖动图(Jitter Plot),代表了每一个原始数据点。这是微观视角,它揭示了数据的真实数量、离散情况以及是否存在异常值。
  3. 箱(The Box):一个标准的箱线图,位于云和雨之间,提供了关键的统计摘要,如中位数、四分位数和离群点,是对数据中心趋势和离散程度的精确度量。

通过这个组合,雨云图在一张图上同时回答了三个关键问题:

  • 数据的整体分布形状是怎样的?(云)
  • 每一个数据点具体在哪里?(雨)
  • 关键的统计摘要是什么?(箱)

PtitPrince:轻松绘制雨云图

PtitPrince 是一个基于 matplotlibseaborn 的高级绘图库,专门用于简化雨云图的创建过程。它提供了一个名为 pt.RainCloud 的核心函数,让我们仅用几行代码就能生成复杂的雨云图。

1. 安装

pip install PtitPrince

2. 快速实战

让我们使用 seaborn 自带的 tips 数据集来创建一个简单的雨云图,比较一周中不同天的总消费金额分布。

import ptitprince as pt
import seaborn as sns
import matplotlib.pyplot as plt

# 加载数据
df = sns.load_dataset("tips")

# 设置绘图风格
sns.set(style="whitegrid")

# 创建画布
f, ax = plt.subplots(figsize=(12, 8))

# 使用 PtitPrince 绘制雨云图
pt.RainCloud(
    x="day",          # x轴:分类变量(天)
    y="total_bill",   # y轴:数值变量(总消费)
    data=df,          # 数据源
    palette="Set2",     # 调色板
    bw=0.2,             # 控制密度图的平滑度
    width_viol=0.8,     # 提琴图的宽度
    ax=ax,              # 指定绘图的子图
    orient="v"          # 垂直方向
)

ax.set_title("不同天的消费金额分布雨云图")
plt.show()

运行以上代码,你将得到一张清晰的垂直雨云图,其中:

  • x 轴是星期四、五、六、日。
  • y 轴是消费金额。
  • 每个分类都有一片“云”(消费金额的密度分布)、一阵“雨”(每笔消费的散点)和一个“箱子”(统计摘要)。

3. 定制你的雨云图

PtitPrince 提供了丰富的参数来自定义图表的每一个细节。

水平方向的雨云图

只需将 orient 设置为 'h',并交换 xy 即可。

f, ax = plt.subplots(figsize=(12, 8))
pt.RainCloud(
    x="total_bill", 
    y="day", 
    data=df, 
    orient='h'
)
plt.show()

分组比较(使用 hue

PtitPrinceseaborn 完美兼容,你可以使用 hue 参数进行更细致的分组比较。例如,在按天分组的基础上,再按性别(sex)进行二次分组。

f, ax = plt.subplots(figsize=(15, 10))
pt.RainCloud(
    x="day", 
    y="total_bill", 
    hue="sex",  # 按性别分组
    data=df, 
    palette="pastel",
    move=0.2  # 将不同 hue 的散点左右移动,避免重叠
)
ax.set_title("按天和性别划分的消费分布")
plt.show()

调整组件

你甚至可以单独关闭某个组件,或者调整它们的样式。

pt.RainCloud(
    x="day", y="total_bill", data=df,
    rain_side='left',      # 雨点显示在左侧
    violin_args=dict(alpha=0.5), # 调整提琴图透明度
    box_show=False,        # 不显示箱线图
    point_size=2           # 调整散点大小
)

自动化报告与 AI 集成

在实际工作中,我们常常需要将这类可视化图表集成到自动化的数据报告或仪表盘中。例如,你可以编写一个脚本,每天定时运行,使用 Polars 或 Pandas 处理最新数据,然后调用 PtitPrince 生成雨云图,最后将图表发送到团队群或邮件中。

更进一步,你可以将数据分析结果与大语言模型(LLM)的 API 相结合,实现智能洞察。例如,将图表中的关键统计数据传给一个 AI API,让它自动生成一段文字总结。

在选择 AI API 服务时,成本和模型覆盖率是关键考量因素:

  • 追求高性价比和模型多样性?可以试试 LLM AI API,它以极低的折扣(如官方 1 折)提供了 OpenAI、Claude、Gemini 等多种顶级模型,非常适合需要混合使用不同模型的复杂应用。
  • 调用频率不高,希望按次付费fackai.chat 是个不错的选择,它支持国内外全模型,1 元即可调用 100 次,简单明了,性价比高。

总结

雨云图通过将数据的宏观分布与微观细节完美结合,提供了一种比传统图表更诚实、更全面的数据可视化方法。它能有效避免因信息隐藏而导致的误判,帮助我们更深入地理解数据。

借助 PtitPrince 这个强大的 Python 库,创建雨云图变得前所未有的简单。它不仅功能强大,而且与 seaborn 的生态系统无缝集成,提供了丰富的定制选项。下次当你需要比较不同组别的数据分布时,不妨放弃单一的箱线图或提琴图,尝试一下雨云图,它一定会让你的数据故事更加生动和可信。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐