
成果展示






代码解释


第一部分

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

第二部分

# =========================================================================================# ======================================2.颜色库=======================================# =========================================================================================COLOR_SCHEMES = {1: {'bg': ['#EAF7F8', '#FEF0F2', '#F4ECF7', '#FFFDF0', '#F0FFF0', '#FFF5EE', '#F8F8FF', '#F0F8FF', '#F5FFFA','#FFF0F5', '#FFFFF0'], 'bars': ['#57C4AD', '#FCA5B2', '#978AC2']},}

第三部分

def plot_advanced_forest_chart(df, scheme_id):outer_arc_linewidth = frame_line_width # 外弧线宽category_label_radius = outer_radius + outer_arc_radial_gap * 0.5 # 类别标签半径segment_center_angles = []# 起始中心角度current_center_angle = 90# 遍历所有分段for _ in range(n_segments):segment_center_angles.append(current_center_angle) # 当前分段的中心角current_center_angle -= (segment_degree + gap_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.15) * 1.05 # 坐标轴边界范围限制ax.add_patch(background_wedge) # 绘制# 外侧弧状条形半径arc_r_outer = outer_radius + outer_arc_radial_gap + outer_arc_thickness# 创建outer_arc_wedge = patches.Wedge(center=(0, 0), # 原点坐标r=arc_r_outer, # 半径theta1=segment_start_angle, # 起点角)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_wedge = patches.Wedge(center=(0, 0), # 圆点r=bar_top_radius, # 半径theta1=bar_theta1, # 柱起点theta2=bar_theta2, # 柱终点width=bar_radial_thickness, # 高度facecolor=bar_color, # 填充色edgecolor='black', # 黑色边框linewidth=bar_line_width, # 线宽zorder=2 # 层)ax.add_patch(bar_wedge) # 加到图上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, 1.0] # 参考线百分segment_mid_angle_deg_cat = segment_center_angles[i] # 扇区中心角度segment_mid_angle_rad_cat = np.radians(segment_mid_angle_deg_cat) # 转弧度label_x = category_label_radius * np.cos(segment_mid_angle_rad_cat) # xax.text(label_x, # xlabel_y, # ymetric_label, # 文本ha=ha_cat, # 水平va='center', # 垂直rotation=rotation_angle_cat, # 旋转角rotation_mode='anchor', # 旋转锚点fontsize=label_fontsize, # 字号fontweight='bold', # 加粗zorder=5) # 层

第七部分

#绘制最内层圆center_circle_outer = patches.Circle((0, 0), # 中心inner_radius - 0.02, # 半径facecolor='white', # 填充颜色edgecolor='black', # 边颜色linewidth=frame_line_width, # 粗细zorder=10) # 层#添加图例ax.legend(handles=legend_handles, # 句柄loc='lower center', # 位置bbox_to_anchor=(0.5, -0.05), # 坐标ncol=3, # 列handletextpad=0.3, #间隔frameon=False, # 外框prop={'size': legend_fontsize, # 字号'weight': 'bold'}) # 加粗

第八部分

# =========================================================================================# ======================================4.执行部分=======================================# =========================================================================================if __name__ == "__main__":df_real = pd.read_excel(r'data.xlsx') # 读取数据scheme_id = 1print('正在绘制并保存方案:', scheme_id)plot_advanced_forest_chart(df_real, scheme_id)

如何应用到你自己的数据

1.设置原始数据的保存路径,执行部分:
df_real = pd.read_excel(r'data.xlsx') 2.设置是否要进行批量绘图,执行部分:
plot_all = True3.设置要使用的绘图数据,绘图函数部分:
for _, row in df.iterrows():metric_label = row['Metric'] # 指标名称means = [row['Mean_1'], row['Mean_2'], row['Mean_3']] # 均值
4.设置绘图结果的保存地址,绘图函数部分:
plt.savefig(fr'scheme_{scheme_id}.svg', bbox_inches='tight')
往期内容
