
代码绘制成果展示











代码解释


第一部分

# =========================================================================================# ====================================== 1. 环境设置 =======================================# =========================================================================================import matplotlib.pyplot as pltimport matplotlib.colors as mcimport colorsysimport numpy as npimport pandas as pdimport matplotlib.patches as mpatches

第二部分

# =========================================================================================# ======================================2.颜色库=======================================# =========================================================================================COLOR_SCHEMES = {1: ['#F7A8B8', '#9BC2E6', '#FDD87D', '#A9D18E', '#C39BD3'],}SCHEME_ID =60 # 设置当前使用的配色方案color_list = COLOR_SCHEMES[SCHEME_ID] #提取出对应的颜色

第三部分

# =========================================================================================# ======================================4.绘图函数======================================# =========================================================================================def plot_raincloud(df):colors = {cat: color_list[i % len(color_list)] for i, cat in enumerate(CATS)} # 遍历类别列表并依次分配一个颜色列表中的颜色# 根据分配的颜色生成对应的亮色,用作表头背景色header_colors = {cat: adjust_color_lightness(c, 1.2) for cat, c in colors.items()}categories = CATS #分类/分区years = [2000, 2010, 2020] #年份# 创建画布fig, axes = plt.subplots(1, 5, figsize=(18, 6), sharey=True)plt.subplots_adjust(wspace=0, hspace=0) #子图间距

第四部分

# 遍历每一个分类for idx, cat in enumerate(categories):ax = axes[idx] #当前分类对应的子图对象color = colors[cat] #当前分类颜色is_first = (idx == 0) #是否是第一张子图is_last = (idx == len(categories) - 1) #是否是最后一张子图#添加文字ax.text(0.5, #x1.05, #ycat, #内容transform=ax.transAxes, #坐标系ha='center', #水平va='center', #垂直fontsize=20, #大小color=text_color, #颜色weight='bold') #粗体

第五部分

# 遍历年份for i, year in enumerate(years):#筛选出对应的数据subset = df[(df['Category'] == cat) & (df['Year'] == year)]['Value'].valuesx_pos = i # 将当前年份的索引作为绘制图形在X轴上的横坐标# 绘制小提琴图parts = ax.violinplot(subset, #数据positions=[x_pos], #横坐标位置showmeans=False, #不显示均值线showextrema=False, #不显示极值线widths=0.5) #小提琴图的宽度

第六部分

#绘制箱线图ax.boxplot(subset, #数据positions=[x_pos], #横坐标notch=True, #带缺口的箱线图widths=0.15, #宽度patch_artist=True, #颜色填充showfliers=False, #不显示异常点boxprops=dict(facecolor=color, color='white', alpha=1.0, linewidth=1.2), #箱体的属性medianprops=dict(color='white', linewidth=2.0), #中位数线条的属性whiskerprops=dict(color=color, alpha=1, linewidth=1.2), # 须线条的属性capprops=dict(color=color, alpha=1, linewidth=1.2)) #须端点横线的属性

第七部分

# 生成中心在箱线图左侧并带有正态分布随机扰动的X轴数据坐标x_jitter = np.random.normal(x_pos - 0.2, 0.04, size=len(subset))#绘制散点图ax.scatter(x_jitter, #xsubset, #Ys=15, # 大小color=color, # 颜色alpha=0.9, #透明度edgecolor='white', #加上白色的边linewidth=0.5, #边线宽度zorder=2) #图层

第八部分

ax.set_xticks([0, 1, 2]) #X轴的刻度位置ax.set_xticklabels([str(y) for y in years], fontsize=20) #X轴刻度标签ax.tick_params(axis='both', which='both', labelsize=20,length=0) #所有刻度的参数ax.yaxis.grid(True, linestyle='--', alpha=0.3, color='gray') #Y轴水平网格线ax.set_axisbelow(True) # 设置坐标轴网格线始终位于绘图内容的下方

第九部分

# 对于第一张子图进行特殊处理if is_first:ax.spines['left'].set_visible(True) #显示左侧Y轴边框ax.spines['left'].set_linewidth(1.5) #左侧Y轴边框线宽ax.spines['left'].set_color(axis_color) #左侧边框颜色ax.set_ylabel('Index value', fontsize=24) #Y轴标签ax.set_ylim(0, 1.0) #Y轴范围ax.set_yticks([0, 0.2, 0.4, 0.6, 0.8, 1.0]) #Y轴刻度点ax.tick_params(axis='y', labelsize=20, length=0) #Y轴刻度参数# 对于非第一张的其它子图else:ax.spines['left'].set_visible(False) #左侧边框线隐藏ax.set_ylabel('') #去掉非首个图的Y轴标签ax.tick_params(axis='y', left=False, labelsize=20,labelleft=False) #关闭非首个图左侧刻度线和数字标签的显示#所有子图开启右侧边框显plt.subplots_adjust(top=0.85) # 总体往下压缩图形内容区,留出顶部15%的空间用来显示刚才的类别标题色块return fig

第十部分

# =========================================================================================# ======================================5.执行部分======================================# =========================================================================================if __name__ == "__main__":excel_filename = r'raincloud_data.xlsx' #原始数据路径df_data = pd.read_excel(excel_filename) #读取数据fig = plot_raincloud(df_data)fig.savefig(png_filename, dpi=300, bbox_inches='tight')fig.savefig(pdf_filename, dpi=300, bbox_inches='tight')

如何应用到你自己的数据

1.设置配色方案:
SCHEME_ID =60 # 设置当前使用的配色方案2.定义年份数据,关系到每组中云雨图的数量:
years = [2000, 2010, 2020] #年份3.定义原始数据的文件路径:
excel_filename = r'data.xlsx' #原始数据路径4.定义类别数据,关系到分区:
CATS = ['Human system', 'Resource system', 'Interaction', 'Outcomes', 'SI'] #分区5.定义绘图结果的保存路径:
pdf_filename = fr'_plot{SCHEME_ID}.pdf'
卡通风格套图预告



















推荐


获取方式
