
代码绘制成果展示













代码解释


第一部分

# =========================================================================================# ====================================== 1. 环境设置 =======================================# =========================================================================================import matplotlibimport matplotlib.pyplot as pltimport matplotlib.patches as patchesimport numpy as npimport pandas as pd

第二部分

# =========================================================================================# ======================================2.颜色库=======================================# =========================================================================================COLOR_SCHEMES = {1: {'bg': ['#CCCCFF', '#CCFFCC', '#FFFFCC', '#99FFFF', '#99CCFF', '#FFCCFF', '#66FFCC', '#CCFFCC', '#FF9966','#FFCC33'],'bars': ['#00CC99', '#FF3300', '#CCFFFF', '#66ff66']},

第三部分

# =========================================================================================# ======================================3.绘图函数=======================================# =========================================================================================def plot_advanced_forest_chart(df, scheme_id):n_segments = 10 # 扇区数outer_radius = 1.0 # 圆环最大半径selected_colors = COLOR_SCHEMES[scheme_id] #提取配色方案your_manual_colors = selected_colors['bg'] #背景色num_bars_per_group = 4 #扇区内柱子数treatment_colors = selected_colors['bars'] #柱子色treatment_labels = ["CK", "Cd", "GSH", "GSH+Cd"] #图例文本intra_bar_gap_factor = 0.1 #相邻柱子之间间隔因子plot_data = [] #用来各个扇区的绘图数据

第四部分

#逐行遍历每个扇区数据for _, row in df.iterrows():metric_label = row['Metric'] #分区means = [row['Mean_1'], row['Mean_2'], row['Mean_3'], row['Mean_4']] #柱子数据errors = [row['Error_1'], row['Error_2'], row['Error_3'], row['Error_4']] #误差棒sig_letters = [row['Sig_1'], row['Sig_2'], row['Sig_3'], row['Sig_4']] #显著性#刻度范围segment_min = row['Min']segment_max = row['Max']#保存plot_data.append((metric_label, means,errors,sig_letters,segment_min,segment_max))

第五部分

ring_radial_width = outer_radius - inner_radius #圆环总宽度total_gap_degrees = n_segments * gap_degree #所有的空白隔离间隙占据的总角度数值total_segment_degrees = 360.0 - total_gap_degrees #计算出可用于扇形绘制的总有效度数segment_degree = total_segment_degrees / n_segments #平分给每个扇形available_bar_angle = segment_degree - 2 * side_padding_degree #柱子可用角度segment_start_angles = [center - segment_degree / 2.0 for center in segment_center_angles] #扇区起始边界角segment_end_angles = [center + segment_degree / 2.0 for center in segment_center_angles] #扇区结束边界角

第六部分

#创建画布fig, ax = plt.subplots(figsize=(10, 10))ax.set_aspect('equal', adjustable='box') #宽高比例figure_outermost_radius = outer_radius + outer_arc_radial_gap + outer_arc_thickness #图最大半径lim = (figure_outermost_radius + 0.03) * 1.02 #图最大范围#设置x、y轴范围ax.set_xlim(-lim, lim)ax.set_ylim(-lim, lim)ax.axis('off') #去掉默认刻度线等#创建外侧圆弧条outer_arc_wedge = patches.Wedge(center=(0, 0), #原点r=arc_r_outer, #半径theta1=segment_start_angle, #起始角度theta2=segment_end_angle, #结束角度width=outer_arc_thickness, #厚度facecolor=segment_bg_color, #填充色alpha=1.0, #透明度edgecolor='black', #边框颜色linewidth=outer_arc_linewidth, #边框粗细zorder=1 #层)ax.add_patch(outer_arc_wedge) #添加到图上current_bar_start_angle = segment_start_angle + side_padding_degree #第一根柱子角度

第七部分

#遍历绘制柱子for j in range(num_bars_per_group):bar_radial_thickness = max(0, bar_top_radius - inner_radius) #柱子实际最长范围bar_theta1 = current_bar_start_angle #当前柱子起始角bar_theta2 = current_bar_start_angle + bar_angular_unit_width #结束角bar_center_angle_deg = bar_theta1 + bar_angular_unit_width / 2.0 #中间角度center_angle_rad = np.radians(bar_center_angle_deg) #转换为弧度值ax.text(sig_x, #xsig_y, #ysig_letter, #文本ha='center', #水平va='center', #竖直fontsize=sig_fontsize, #字体大小color='black', #颜色rotation=calculated_sig_rotation, #旋转角度rotation_mode='anchor', #旋转锚点zorder=6) #层current_bar_start_angle += bar_angular_unit_width + intra_bar_gap_angle #更新柱子起始角

第八部分

value_range = segment_max - segment_min #数据范围annotation_fractions = [0.25, 0.5, 0.75] #刻度位置annotation_values = [segment_min + frac * value_range for frac in annotation_fractions] #对应刻度数# 调用辅助函数映射数值internal_radii = [scale_value_to_radius(val, segment_min, segment_max, inner_radius, plotting_outer_radius) for val in annotation_values]# 设置旋转角if 90 < angle_norm < 270:final_rotation = target_text_angle_deg + 180va_annot = 'bottom'else:final_rotation = target_text_angle_deg + 180va_annot = 'bottom'ax.text(annot_x, #xannot_y, #yannot_text, #文本ha='center', #水平va=va_annot, #垂直fontsize=annotation_fontsize, #字体大小color='black', #颜色rotation=final_rotation, #旋转角rotation_mode='anchor', #锚点bbox=dict(boxstyle="square,pad=0.3",#内边距facecolor="none", #去掉框edgecolor="none"), #去掉填充色zorder=4) #层

第九部分

legend_handles = [plt.Line2D([0], #占位[0], #占位marker='s', #点形状color='w', #线颜色markerfacecolor=color, #填充色markersize=legend_fontsize * 0.8, #大小linestyle='None', #线样式label=label) for color, label inzip(treatment_colors, treatment_labels)] #文本#添加图例ax.legend(handles=legend_handles, #句柄loc='upper right', #位置fontsize=legend_fontsize, #大小handletextpad=0.02, #文本与形状间隔frameon=False) #去掉边框

第十部分

# =========================================================================================# ======================================4.主程序执行=======================================# =========================================================================================if __name__ == "__main__":df = pd.read_excel(r'data.xlsx')#读取原始数据#设置是否进行批量绘图plot_all = Trueif plot_all:for scheme_id in COLOR_SCHEMES.keys():selected_hex_colors = COLOR_SCHEMES[scheme_id]print('正在绘制并保存方案:', scheme_id)plot_advanced_forest_chart(df, scheme_id)else:scheme_id = 1selected_hex_colors = COLOR_SCHEMES[scheme_id]print('正在绘制并保存方案:', scheme_id)plot_advanced_forest_chart(df, scheme_id)

如何应用到你自己的数据

1.设置原始数据的保存路径,执行部分:
df = pd.read_excel(r'data.xlsx')#读取原始数据2.设置是否进行批量绘图,执行部分:
plot_all = True3.设置图例文本,绘图函数部分:
treatment_labels = ["CK", "Cd", "GSH", "GSH+Cd"] #图例文本4.设置绘图结果的保存地址,绘图函数部分:
plt.savefig(fr'{scheme_id}.png',dpi=300)
推荐


获取方式
