使用matplotlib绘制Raincloud图/云雨图/柱状图/小提琴图

需求: 使用Python的matplotlib绘制数据分布、数据箱型图、数据散点图
参考: https://blog.csdn.net/weixin_39559994/article/details/128197965?fromshare=blogdetail\&sharetype=blogdetail\&sharerId=128197965\&sharerefer=PC\&sharesource=captain_keating\&sharefrom=from_link
输入数据格式: df为dataframe格式,样例如下

输出效果:

代码/作图函数:

python 复制代码
def plot_raincloud():
	fig = plt.figure(figsize = (15,15),dpi = 300)  # 创建Figure对象
	plt.rcParams['font.sans-serif'] = 'SimHei'				# 设置字体为SimHei显示中文在这里插入代码片,如果你的坐标轴有中文名,须设置
	plt.rcParams['font.family'] = 'Arial' 	   # 设置字体样式
	plt.rcParams['font.size'] = '14' 					   # 设置字体大小 
	plt.rcParams['xtick.direction'] = 'out'                  #将x周的刻度线方向设置向内
	plt.rcParams['ytick.direction'] = 'out'                  #将y轴的刻度方向设置向内
	
	colors = ['tomato', 'darksalmon', 'deepskyblue', 'mediumseagreen', 'orange','#bce27f','#aab8d8']
    # 增加rain部分的随即抖动
    data_x = [df[col].dropna().values for col in df.columns]
    for i in range(len(data_x)):
        idxs = np.arange(len(data_x[i]))
        out = data_x[i].astype(float)
        out.flat[idxs] += np.random.uniform(low=-0.1, high=0.1, size=len(idxs))
        data_x[i] = out
        
    # 计算统计信息
    statistics = {
        'Feature': [],'Mean': [],'Variance': [],'StdDev': [],'Min': [],
        'Max': [],'25th Percentile': [],'50th Percentile (Median)': [],
        '75th Percentile': [],'SEM': []
    }
    
    for idx, col in enumerate(new_column_names):
        statistics['Feature'].append(col)
        statistics['Mean'].append(np.mean(data_x[idx]))
        statistics['Variance'].append(np.var(data_x[idx]))
        statistics['StdDev'].append(np.std(data_x[idx]))
        statistics['Min'].append(np.min(data_x[idx]))
        statistics['Max'].append(np.max(data_x[idx]))
        statistics['25th Percentile'].append(np.percentile(data_x[idx], 25))
        statistics['50th Percentile (Median)'].append(np.percentile(data_x[idx], 50))
        statistics['75th Percentile'].append(np.percentile(data_x[idx], 75))
        # 计算SEM (标准误差)
        n = len(data_x[idx])  # 样本数量
        sem = np.std(data_x[idx]) / np.sqrt(n)  # 计算SEM
        statistics['SEM'].append(sem)
    statistics_df = pd.DataFrame(statistics)
    # 创建图片
    ax = fig.add_axes([0.1, 0.61, 0.42, 0.3])
    # ------------------------------
    # 绘制 violin 图(雨图)
    vp = ax.violinplot(data_x, points=500, showmeans=False, widths=1.1,# 控制小提琴图的宽度
                       showextrema=False, showmedians=False, vert=True)
    for idx, b in enumerate(vp['bodies']):
        b.set_color(colors[idx])
        b.get_paths()[0].vertices[:, 0] = np.clip(b.get_paths()[0].vertices[:, 0], idx+1, idx+2)
    # ------------------------------
    # 绘制散点图(滴点)
    for idx, y_vals in enumerate(data_x):
        x = np.full(len(y_vals), idx + 0.8)
        x += np.random.uniform(low=-0.15, high=0.15, size=len(x))# low和high调整散点图抖动范围
        ax.scatter(x, y_vals, s=2, c=colors[idx], alpha=0.5)
    # ------------------------------
    # 绘制箱型图(箱图)
    box_positions = np.arange(0.8, len(new_column_names)+0.8)  # 控制箱型图的左右偏移
    bp = ax.boxplot(data_x, vert=True, patch_artist=True, positions=box_positions,
                    widths=0.2, showfliers=False,# 控制箱型图宽度
                    boxprops=dict(facecolor='none', color='black'),
                    medianprops=dict(color='black'),
                    whiskerprops=dict(color='black'),
                    capprops=dict(color='black'))
    # ---------------------------
    ax.invert_yaxis()
    ylim.reverse()
    
    ax.set_ylim([-20,1100])
    ax.set_xticks(np.arange(1, len(new_column_names)+1))
    ax.set_xticklabels(new_column_names, rotation=60,fontdict={"family": "SimSun", "size": 20})
    ax.set_ylabel('y轴标题',fontdict={"family": "SimSun", "size": 20})
    ax.grid(True, linestyle='--', alpha=0.5)
    
    return statistics_df
# 调用函数,返回统计指标dataframe
df1 = plot_raincloud() 

备注: new_column_names这个变量里装的是列名的列表,封装函数时忘了加进去了,大家使用的时候自己定义下即可,添加y坐标用的

相关推荐
m0_380743877 小时前
给 OpenAI API 调用加上模型切换:GPT-5.1 和 Codex 的配置实践
人工智能·python·gpt
2601_962297488 小时前
在python3中、下列输出变量a的正确写法是_2020超星大数据Python免费答案
数据结构·python·算法·编程·字符串操作
“AI国潮设计-小江”8 小时前
Python实战 | SDXL精准控制“普宁英歌舞×星空蛋糕”IP落地,附核心Prompt与商用授权思路
开发语言·人工智能·python·prompt·aigc
公爵爱学习8 小时前
无人机视觉识别前序-Linux-YOLO安装
python·yolo·计算机视觉·conda·无人机
2601_962295338 小时前
使用python实现一个浏览器自动化的脚本
python·脚本·rpa·浏览器自动化·操作
小刘在重生~9 小时前
Java常用类|String类详解 + BigDecimal精准计算(含面试题)
java·开发语言·python
大汉堡玩测试10 小时前
langfuse测试实战(一): 配置一个简单的项目快速落地
python·测试工具
一位正在转型AI全栈的前端工程师10 小时前
AI 全栈学习之旅 -Week 8:从单 Agent 到多 Agent 协作:LangGraph 实战与记忆持久化
前端·python
长江后浪博客10 小时前
Python + YOLOv8 疲劳驾驶 AI 视觉检测入门:从模型训练到 ONNX 实时摄像头检测完整实战
人工智能·python·yolo·疲劳驾驶检测·onnx·yolov8
hhzz11 小时前
【OpenCV 入门到精通 01】认识 OpenCV 与计算机视觉:从零建立全局认知
人工智能·python·opencv·计算机视觉·开源