
代码绘制成果展示










代码解释


第一部分

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

第二部分

# =========================================================================================# ======================================2.颜色库=======================================# =========================================================================================COLOR_SCHEMES = {1: {'Driving': ('#D8BDC6', '#C69BA6', '#C69BA6'),'Pressure': ('#AED4F2', '#86B7E3', '#2E75B6'),'State': ('#EACFB4', '#DE9E68', '#C67E3F'),'Impact': ('#FCE5B1', '#FFD26F', '#EAA816'),'Response': ('#C8D1A3', '#8E9E44', '#788836')},60: {'Driving': ('#F5EEF8', '#D7BDE2', '#633974'),'Pressure': ('#EAF2F8', '#A9CCE3', '#154360'),'State': ('#E8F6F3', '#A3E4D7', '#0E6655'),'Impact': ('#E9F7EF', '#A9DFBF', '#196F3D'),'Response': ('#FEF5E7', '#FAD7A0', '#A04000')}}SCHEME_ID = 60 #设置使用的配色方案color_map = COLOR_SCHEMES.get(SCHEME_ID, COLOR_SCHEMES[1]) #获取配色方案

第三部分

# =========================================================================================# ======================================5.绘图函数======================================# =========================================================================================def plot_sunburst_chart(df):grouped = df.groupby('Subsystem (Inner)', sort=False) #按照Subsystem列进行分组categories = grouped.first().index.tolist() #获取分组后的内层类别并转换为列表inner_values = grouped['Subsystem Weight'].first().tolist() #获取内层数值counts = grouped.size().tolist() #获取每个分组包含的数量outer_labels = df['Indicator (Outer)'].astype(str).tolist() #外层名称outer_values = df['Indicator Weight'].tolist() #获取外层数据inner_colors = [color_map[cat][1] for cat in categories] #内层颜色outer_colors = [] #外层颜色列表label_text_colors = [] #外层标签文字颜色列表

第四部分

#创建画布fig, ax = plt.subplots(figsize=(10, 10))outer_radius = 1.0 #外层圆环的半径gap = 0.1 #内外层圆环之间的间隙inner_radius = outer_radius - 0.2 - gap #内层圆环的半径radius=outer_radius, #半径colors=outer_colors, #颜色startangle=start_angle, #起始角度counterclock=False, #顺时针radius=inner_radius, #内层半径colors=inner_colors, #颜色startangle=start_angle, #起始角度counterclock=False, #顺时针

第五部分

#遍历内层圆环的每一个扇形for i, w in enumerate(wedges_in):ang = (w.theta2 - w.theta1) / 2. + w.theta1 #扇形的中心角度rad_ang = np.deg2rad(ang) #将角度转换为弧度r_label = inner_radius - 0.5 / 2 #内层标签显示的半径位置x = r_label * np.cos(rad_ang) #标签x坐标y = r_label * np.sin(rad_ang) #标签y坐标text_content = f"{categories[i]}\n{inner_values[i]:.2f}" #文本内容#添加文本ax.text(x, #xy, #ytext_content, #文本内容ha='center', #水平va='center', #垂直fontsize=20, #字体大小fontweight='bold', #加粗color='black') #字体颜色

第六部分

#注释框样式bbox_props = dict(boxstyle="square,pad=0.2", #形状,内边距fc="w", #填充颜色ec="none", #无边框颜色alpha=0) #透明度#遍历外层圆环的每一个扇形for i, w in enumerate(wedges_out):ang = (w.theta2 - w.theta1) / 2. + w.theta1 #扇形的中心角度rad_ang = np.deg2rad(ang) #将角度转换为弧度#根据x的正负号确定文本对齐方式horizontalalignment = {-1: "right", 1: "left"}[int(np.sign(x))]#文本标签的最终坐标位置xy_text = (x * 1.2, y * 1.2)#添加文本ax.annotate(label_str, #文本xy=(start_x, start_y), #指向的点坐标xytext=xy_text, #文本放置的坐标horizontalalignment=horizontalalignment, #水平verticalalignment="center", #垂直fontsize=16, #字体大小fontweight='bold', #字体加粗color=label_text_colors[i], #字体颜色arrowprops=arrow_props, #箭头属性bbox=bbox_props) #文本框属性

第七部分

legend_patches = [] #初始化图例图块列表#创建图例plt.legend(handles=legend_patches, #图例图块loc='lower center', #位置bbox_to_anchor=(0.5, -0.18), #位置坐标ncol=5, #列frameon=False, #不显示图例边框prop={'weight': 'bold', 'size':22},#字体粗细、大小columnspacing=0.9, #列间距handletextpad=0.1, #色块和文字之间的距离labelspacing=0.5 #行间距)

第八部分

# =========================================================================================# ======================================6.执行部分======================================# =========================================================================================if __name__ == "__main__":data_file_path = fr"data.xlsx" #文件路径df = pd.read_excel(data_file_path) #读取数据#调用绘图函数plot_sunburst_chart(df)

如何应用到你自己的数据

1.设置配色:
SCHEME_ID = 60 #设置使用的配色方案2.设置分组数据列:
grouped = df.groupby('Subsystem (Inner)', sort=False) #按照Subsystem列进行分组3.设置内层圆环的数据:
inner_values = grouped['Subsystem Weight'].first().tolist() #获取内层数值4.设置外层圆环的数据:
outer_labels = df['Indicator (Outer)'].astype(str).tolist()outer_values = df['Indicator Weight'].tolist()
5.设置绘图结果的保存地址:
plt.savefig(fr"{SCHEME_ID}.png", dpi=300, bbox_inches='tight')6.设置原始数据的保存路径:
data_file_path = fr"data.xlsx" #文件路径
推荐


获取方式
