
代码绘制成果展示












代码解释


第一部分

# =========================================================================================# ====================================== 1. 环境设置 =======================================# =========================================================================================import numpy as npimport matplotlib.pyplot as pltimport pandas as pdfrom matplotlib.patches import Patchimport matplotlibmatplotlib.rcParams['pdf.fonttype'] = 42matplotlib.rcParams['ps.fonttype'] = 42plt.rcParams['font.family'] = 'Times New Roman'plt.rcParams['font.weight'] = 'bold'plt.rcParams['axes.labelweight'] = 'bold'plt.rcParams['axes.titleweight'] = 'bold'

第二部分

# =========================================================================================# ======================================2.颜色库=======================================# =========================================================================================COLOR_SCHEMES = {1: ['#003366', '#0066AA', '#6699CC', '#AACCFF', '#E0F0F0', '#FFE5D0', '#FFB080', '#EE6644', '#AA0022'],}

第三部分

def plot_flavor_profile(data_dict,scheme_id = 1):colors = COLOR_SCHEMES.get(scheme_id, COLOR_SCHEMES[1]) #提取配色方案line_data = {'esters': proportions[:, 0] * concentrations * 1000, #转换单位'alcohols': proportions[:, 1] * concentrations * 1000,'furans': proportions[:, 5] * concentrations * 1000}#创建画布fig = plt.figure(figsize=(14, 10), dpi=100)ax = fig.add_subplot(111, polar=True) #添加一个极坐标子图ax.set_theta_offset(np.pi / 2) #起始位置正上方ax.set_theta_direction(1) #设置角度的增长方向为逆时针

第四部分

ring_height = 0.75 #每一个环的宽度inner_radius = 1 #最内侧环与圆心的距离scale_factor = (2 * np.pi * 0.75) / max(concentrations) #缩放因子,使最大占比占据圆周的四分之三#遍历所有层#起始处层标注ax.text(-0.05, #角度bottom + ring_height / 2, #半径rounds_labels[i], #文本ha='left', #水平va='center', #垂直fontsize=14, #字体大小weight='bold', #加粗color='black') #颜色#层尾处数值标注ax.text(current_theta + 0.05, #角度bottom + ring_height / 2, #半径f"{total_conc:.2f}", #文本ha='left', #水平va='center', #垂直fontsize=11, #字体大小fontstyle='italic', #斜体fontweight='bold') #加粗

第五部分

ax.set_axis_off() #关闭极坐标自带的坐标轴、网格和刻度arrow_angle = -np.pi / 4 #红色箭头的指向角度#插入折线图轴ax_ins = fig.add_axes([0.54,#左0.62,#下0.25,#宽0.29])#高ax_ins.set_facecolor('none') #子图背景色

第六部分

#遍历边框线设置粗细for spine in ax_ins.spines.values():spine.set_linewidth(2.5)x_idx = np.arange(len(rounds_labels)) #生成折线图x轴基准点#绘制折线ax_ins.errorbar(x_idx, #xy_val, #yfmt='s-', #使用方形color=line_colors[i], #颜色label=line_labels[i], #图例标签名称markersize=5, #形点的大小lw=2) #线宽

第七部分

# =========================================================================================# ======================================4.执行部分=======================================# =========================================================================================if __name__ == "__main__":file_path = r"data.xlsx" #原始数据路径df_shared = pd.read_excel(file_path, sheet_name="Shared_Flavor_Data") #读取数据r_labels = df_shared['Round'].astype(str).tolist() #层标签数据conc = df_shared['Total_Conc'].to_numpy() #层尾数值标注数据cats = df_shared.columns[2:].tolist() #提取列名数据,就是颜色的数据print(cats)prop_data = df_shared.iloc[:, 2:].to_numpy() #提取每一层内部的数值数据#打包data_payload = {'rounds_labels': r_labels,'concentrations': conc,'categories': cats,'proportions': prop_data}#用于决定是批量生成所有配色的图表,还是只生成单张特定配色的图表plot_all = True#批量绘图if plot_all:#遍历for i in range(1, 61):if i in COLOR_SCHEMES:#调用绘图函数plot_flavor_profile(data_payload,scheme_id = i)#绘制单图else:#要使用的配色方案target_scheme = 22#调用绘图函数plot_flavor_profile(data_payload,scheme_id = target_scheme)

如何应用到你自己的数据

1.设置是一次绘制一张图还是一次性绘制出所有配色的图,执行部分:
plot_all = True2.设置原始数据的保存路径,执行部分:
file_path = r"data.xlsx" #原始数据路径3.提取每一个部分的数据,执行部分:
r_labels = df_shared['Round'].astype(str).tolist() #层标签数据conc = df_shared['Total_Conc'].to_numpy() #层尾数值标注数据cats = df_shared.columns[2:].tolist() #提取列名数据,就是颜色的数据prop_data = df_shared.iloc[:, 2:].to_numpy() #提取每一层内部的数值数据
4.折线图数据预处理,绘图函数:
line_data = {'esters': proportions[:, 0] * concentrations * 1000, #转换单位'alcohols': proportions[:, 1] * concentrations * 1000,'furans': proportions[:, 5] * concentrations * 1000}
5.设置绘图结果的保存地址,绘图函数:
plt.savefig(fr"\result{scheme_id}.png", dpi=300,bbox_inches='tight')
推荐


获取方式
