在做探索性分析时,条形图、箱线图是很好的方法,他可以很好地展示大概的数据结构与分布,由于最近看到有人使用使用雨云图展示数据,图形看起来很美观,有趣,因此这里也就进行了梳理并使用python实现雨云图的绘制。

介绍

雨云图其实是一种混合图,由四部分组成,它们分别是 violin plot(云)、boxplot(伞)、swarm plot(雨)。

数据准备

仍然以企鹅数据作为示例,本站也已经提供,可直接下载: 企鹅数据

下载数据

pip install ptitprince
wget https://www.bobobk.com/wp-content/uploads/2021/12/penguins.csv

载入数据

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
df = pd.read_csv("penguins.csv")
df.head()

结果

	species	island	bill_length_mm	bill_depth_mm	flipper_length_mm	body_mass_g	sex
0	Adelie	Torgersen	39.1	18.7	181.0	3750.0	MALE
1	Adelie	Torgersen	39.5	17.4	186.0	3800.0	FEMALE
2	Adelie	Torgersen	40.3	18.0	195.0	3250.0	FEMALE
3	Adelie	Torgersen	NaN	NaN	NaN	NaN	NaN
4	Adelie	Torgersen	36.7	19.3	193.0	3450.0	FEMALE

开始绘图

前面我们通过pip已经安装了ptitprince包,现在真正开始绘制

violin图

首先是一半的小提琴图,即雨云图的云的部分,数据是bill_length_mm这个变量,以岛屿分组,其中half_violinplot函数负责半个小提琴图(violin plot),inner控制下方的小线条,为了使云位置摆放正确,将变量放在Y轴上

import matplotlib.pyplot as plt
import ptitprince as pt
pt.half_violinplot(data=df,y="island",x="bill_length_mm",inner=None)
plt.savefig("half_violin.png",dpi=200)

half_violin

boxplot图

接下来是伞的部分

pt.half_violinplot(data=df,y="island",x="bill_length_mm",inner=None)
sns.boxplot(data=df,y="island",x="bill_length_mm",width = .15, zorder = 10,boxprops = {'facecolor':'none', "zorder":10},
           whiskerprops = {'linewidth':2, "zorder":10})
plt.savefig("violin_box.png",dpi=200)

violin_box

strip plot图

雨云图的雨部分,使用stripplot,并通过jitter参数将散点分散

pt.half_violinplot(data=df,y="island",x="bill_length_mm",inner=None)
sns.boxplot(data=df,y="island",x="bill_length_mm",width = .15, zorder = 10,boxprops = {'facecolor':'none', "zorder":10},
           whiskerprops = {'linewidth':2, "zorder":10})
sns.stripplot(data=df,y="island",x="bill_length_mm",jitter=1,edgecolor = "white",zorder = 0)
plt.savefig("raincloud.png",dpi=200)

raincloud

R 实现

同样这里将R语言实现的雨云图一并呈上

library(ggplot2)
library(ggdist)
df = read.table("penguins.csv",sep=",",header=TRUE)
pdf("raincloud.pdf",width=14, height=7)
ggplot(data=df,aes(y=bill_length_mm,x=factor(island),fill=factor(island)))+
 ggdist::stat_halfeye(adjust=0.5,justification=-.2,.width=0,point_colour=NA) + 
 geom_boxplot(width=0.2,outlier.color=NA) +
 ggdist::stat_dots(side="left",justification=1.1) 
dev.off()

raincloudr

总结

本文通过将violin小提琴图与boxplot箱线图,stripplot进行结合创造出雨云图,该图在展示数据分布上更加直观,好看。