Python创建保存指定结构数据集的Raincloud雨云图实现方法求助
Python Raincloud雨云图实现方案
1. 依赖库准备
- 需要提前安装核心依赖:pandas、matplotlib、seaborn,标准雨云图可额外安装
ptitprince库 - 安装命令:
pip install pandas matplotlib seaborn ptitprince
2. 数据格式转换
现有宽表结构需要先转换为seaborn支持的长表格式,代码示例:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt import ptitprince as pt # 读入原始数据集 df = pd.read_csv("你的数据集路径.csv") # 宽表转长表,将Col1~Col10的测量值合并为统一的数值列 df_long = df.melt( id_vars=["Sample", "Replicate", "Timepoint"], value_vars=[f"Col{i}" for i in range(1, 11)], var_name="Variable", value_name="Measurement" )
3. 单图全样本绘制方案
按照「每个样本单独占一行、同时间点重复结果并排」的需求,基于FacetGrid实现:
# 设置绘图风格 sns.set_style("whitegrid") # 初始化网格布局,row参数指定按Sample分行 g = sns.FacetGrid( df_long, row="Sample", height=3, # 每行高度 aspect=6, # 宽高比,适配100个时间点的横向展示需求 sharex=True, sharey=True ) # 绘制雨云图 g.map_dataframe( pt.RainCloud, x="Timepoint", y="Measurement", hue="Replicate", width_viol=0.6, # 半小提琴宽度 width_box=0.2, # 内嵌箱线宽度 orient="v", alpha=0.7, dodge=True # 同时间点不同重复自动错开并排 ) # 调整布局 g.add_legend() g.set_xticklabels(rotation=45) # 时间点过多时可旋转标签避免重叠 plt.tight_layout() # 保存图片,dpi调高避免模糊 plt.savefig("raincloud_result.png", dpi=300, bbox_inches="tight") plt.show()
4. For循环单样本单独生成方案
如果需要每个样本单独保存为独立文件,可通过For循环实现:
sample_list = df_long["Sample"].unique() for sample in sample_list: sample_df = df_long[df_long["Sample"] == sample] plt.figure(figsize=(18, 3)) pt.RainCloud( data=sample_df, x="Timepoint", y="Measurement", hue="Replicate", width_viol=0.6, orient="v", dodge=True ) plt.title(f"Sample {sample} 测量结果") plt.xticks(rotation=45) plt.tight_layout() plt.savefig(f"Sample_{sample}_raincloud.png", dpi=300, bbox_inches="tight") plt.close()
5. 可选调整方案
- 如果不需要散点+箱线的雨云结构,仅需绘制半小提琴图,可将
pt.RainCloud替换为sns.violinplot,添加split=True参数即可 - 如果需要按10个变量分列展示,只需在FacetGrid初始化时添加
col="Variable"参数 - 18个样本的整体图高度可通过调整
height参数适配,宽度可调整aspect参数
内容的提问来源于stack exchange,提问作者Jas.flo
相关产品推荐
相关产品推荐

