
代码绘制成果展示






代码解释


第一部分

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

第二部分

# =========================================================================================# ======================================2.颜色库=======================================# =========================================================================================COLOR_SCHEMES = {1: ['#FFD060', '#B3B3B3', '#FA685B', '#76B7B2', '#B2DF8A', '#85D4E3', '#4B92F0'],}

第三部分

# =========================================================================================# ======================================3.绘图函数=======================================# =========================================================================================def plot_advanced_forest_chart(data_dict, scheme_id):# 环形柱状图最大值max_sum = max([sum(v for v in sector.values() if v > 0) for sector in bar_data.values()], default=0)max_scale = math.ceil(max_sum) # 向上取整得最大刻度tick_step = max_scale // 4 # 刻度步长tick_vals = [i * tick_step for i in range(5)] # 生成刻度值# 创建画布fig, ax = plt.subplots(figsize=(10, 10), subplot_kw={'projection': 'polar'})ax.set_theta_zero_location('N') # 起始角ax.set_theta_direction(-1) # 顺时针绘图ax.axis('off') # 去掉默认极坐标轴

第四部分

# 绘制堆积环形柱状图width_factor = (3 * np.pi / 2) / max_scale # 计算单位数值对应的弧度ax.bar(start_angle, # 起始角height=thickness, # 宽width=angle_width, # 弧长bottom=r, # 底部半径color=colors.get(fuel, '#000000'), # 填充色align='edge', # 边缘对齐edgecolor='none') # 边框start_angle += angle_width # 累加起始角

第五部分

# 获取饼图前三名sorted_pie = sorted([(k, v) for k, v in pie_data.items() if v > 0], key=lambda x: x[1], reverse=True)top3_fuels = [k for k, v in sorted_pie[:3]] # 提取占比前三名名称pie_text_info = [] # 用于保存饼图文字标签信息# 绘制饼图百分比标签for fuel_key, mid_angle, text_str in pie_text_info:ax.text(mid_angle, # 极角pie_radius * 0.65, # 半径text_str, # 文本ha='center', # 水平va='center', # 垂直fontweight='bold', # 加粗fontsize=14) # 字号

第六部分

# 绘制0度起始边界线ax.plot([0, 0], # 角度[pie_radius, radii[-1] + thickness], # 半径color=line_color, # 颜色linewidth=arc_linewidth) # 线宽# 绘制末端刻度文字ax.text(3 * np.pi / 2, # 角度outer_r + tick_len + 0.25, # 半径str(tick_vals[-1]), # 刻度值ha='right', # 水平va='center', # 垂直fontweight='bold', # 加粗fontsize=14) # 字号#绘制标题fig.suptitle('2030-BTH', # 文本fontsize=24, # 字号fontweight='bold', # 加粗y=0.92) # y

第七部分

# =========================================================================================# ======================================4.执行部分======================================# =========================================================================================if __name__ == '__main__':excel_filename = r'data.xlsx' #文件路径#读取数据df_bar = pd.read_excel(excel_filename, sheet_name='Bar_Data')df_pie = pd.read_excel(excel_filename, sheet_name='Pie_Data')scheme_id = 1print('正在绘制并保存方案:', scheme_id)plot_advanced_forest_chart(df_real, scheme_id)

如何应用到你自己的数据

1.设置原始数据的保存路径,执行部分:
excel_filename = r'\data.xlsx' #文件路径2.分别读取两部分图的数据,执行部分:
df_bar = pd.read_excel(excel_filename, sheet_name='Bar_Data')df_pie = pd.read_excel(excel_filename, sheet_name='Pie_Data')
3.设置是否要进行批量绘图,执行部分:
plot_all = True4.获取数据,绘图函数部分:
bar_data = data_dict['bar'] # 柱状图数据pie_data = data_dict['pie'] # 饼图数据
5.设置绘图结果的保存地址,绘图函数部分:
fig.savefig(fr'scheme_{scheme_id}.png', dpi=300,bbox_inches='tight'
往期内容
