
代码绘制成果展示







代码解释


第一部分

# =========================================================================================# ====================================== 1. 环境设置 =======================================# =========================================================================================import matplotlib.pyplot as pltimport matplotlib.colors as mcolorsimport numpy as npimport pandas as pdimport os

第二部分

# =========================================================================================# ======================================2.颜色库=======================================# =========================================================================================COLOR_SCHEMES = {1: ['#5792AD', '#CC6660', '#EBC06D', '#B0ABA5'],}SCHEME_ID = 58 #使用的配色方案# 获取基础配色列表,如果 ID 不存在则默认使用方案 1base_colors = COLOR_SCHEMES.get(SCHEME_ID, COLOR_SCHEMES[1])

第三部分

get_position() 获取极坐标子图的实际相对尺寸,利用之前定义的半径参数计算出对应极坐标中特定半径在坐标系中的绝对位置,保证了刻度尺与极坐标图精准对齐。在计算出的坐标位置创建一个极窄的辅助坐标系,去掉了其上、下、右边框以及X轴刻度,只保留左边框作为“刻度尺”,并打上特定的标签值。# =========================================================================================# ======================================4.刻度尺绘制函数======================================# =========================================================================================def add_scale_bar_accurate(fig, ax_ref):#获取参考子图在主图中的位置边框bbox = ax_ref.get_position()center_y = bbox.y0 + bbox.height / 2 # 计算参考子图的垂直中心点 Y 坐标#刻度尺轴ax_scale = fig.add_axes([bar_left, #左bar_bottom_y, #下0.002, #宽bar_height])#高#Y轴的范围ax_scale.set_ylim(PLOT_PARAMS['min_val'], PLOT_PARAMS['max_val'])# 隐藏边框ax_scale.spines['top'].set_visible(False)ax_scale.spines['right'].set_visible(False)ax_scale.spines['bottom'].set_visible(False)#设置左边框的宽度ax_scale.spines['left'].set_linewidth(1.2)#设置左边框的颜色ax_scale.spines['left'].set_color('black')#显示的刻度值ticks = [-1.0, -0.3, 0.4, 1.1]#Y轴刻度位置ax_scale.set_yticks(ticks)#Y轴刻度标签字体大小ax_scale.set_yticklabels(ticks, fontsize=10)# 配置刻度线的样式 (长度、宽度、颜色、方向向外)ax_scale.tick_params(axis='y',#轴length=4,#长width=1.2,#宽colors='black',#颜色direction='out')#朝向#隐藏X轴刻度ax_scale.set_xticks([])

第四部分

# =========================================================================================# ======================================5.主绘图函数=======================================# =========================================================================================def draw_polar_panel(ax, title, dataset, colors_dict):baseline = PLOT_PARAMS['baseline'] #获取基准线半径ax.set_theta_zero_location('N') #设置极坐标的0度位置ax.set_theta_direction(-1) #极坐标的角度增长方向为顺时针#定义季节顺序列表,4个扇形的顺序seasons = ['Spring', 'Summer', 'Autumn', 'Winter']var_labels = ['RAD', 'TA', 'SWC', 'VPD'] #定义每个扇形区内的变量顺序n_vars = 4 #变量数量# 每个柱状图的宽度width = (np.pi / 2) / n_vars * 0.8#绘制季节背景扇区ax.bar(x=start_angle + np.pi / 4, #扇区中心角度height=PLOT_PARAMS['radius_max'] - baseline, #从基准线到最大半径width=np.pi / 2, #宽度bottom=baseline, #底部color=bg_color, #填充颜色edgecolor='none', #无边框alpha=1.0, #透明度zorder=0) #图层顺序#绘制最外层季节文字背景环ax.bar(x=start_angle + np.pi / 4, #扇区中心角度height=PLOT_PARAMS['season_outer'] - PLOT_PARAMS['season_inner'], #环的高度width=np.pi / 2, #宽度bottom=PLOT_PARAMS['season_inner'], #底部color=bg_color, #填充颜色edgecolor='none', #无边框alpha=1.0, #透明度zorder=0) #图层顺序

第五部分

#获取当前季节的数据vals = dataset.get(season, [0, 0, 0, 0])#计算该季节内4个变量柱状图的角度位置angles = np.linspace(start_angle + (np.pi / 2) / (n_vars * 2), #起始start_angle + np.pi / 2 - (np.pi / 2) / (n_vars * 2), #结束n_vars) #数量#变量标签的半径位置label_r = PLOT_PARAMS['radius_max'] - 0.25#标签的旋转角度rot = np.degrees(-ang)#如果文字在左半圆if 90 < abs(rot) % 360 < 270:rot += 90else:rot = np.degrees(-ang) + 90#添加标签文字ax.text(ang, #角度label_r, #半径label, #文本内容rotation=rot, #旋转角度ha='center', #水平va='center', #垂直fontsize=8, #字体大小fontweight='bold', #加粗color='black',#黑色zorder=20) #图层顺序

第六部分

theta = np.linspace(0, 2 * np.pi, 200) #生成角度数组#绘制基准线/0值线ax.plot(theta,[baseline] * 200,color='grey',linestyle='--',linewidth=0.8,alpha=0.5,zorder=5)#添加外圈季节文字season_labels_pos = {'Spring': np.pi / 4, #角度中心'Summer': 3 * np.pi / 4, #角度中心'Autumn': 5 * np.pi / 4, #角度中心'Winter': 7 * np.pi / 4 #角度中心}#季节文字所在的半径label_radius = PLOT_PARAMS['season_inner'] + (PLOT_PARAMS['season_outer'] - PLOT_PARAMS['season_inner']) / 2ax.set_yticklabels([]) #移除径向刻度标签ax.set_xticklabels([]) #移除角度刻度标签ax.grid(False) #关闭默认网格ax.spines['polar'].set_visible(False) #隐藏最外层圆圈ax.set_ylim(0, PLOT_PARAMS['plot_limit']) #极坐标轴的显示范围# 子图标题ax.set_title(title, y=1.02, fontsize=16, fontweight='bold', pad=2)

第七部分

# =========================================================================================# ======================================2.颜色库=======================================# =========================================================================================if __name__ == '__main__':DATA_FILE = r"data.xlsx"#文件路径#输出路径OUTPUT_FOLDER = r"Chart_Results"for sheet in sheet_names:df = pd.read_excel(DATA_FILE, sheet_name=sheet) #读取指定表#转为字典格式sheet_data = {}target_vars = ['RAD', 'TA', 'SWC', 'VPD'] #变量名# 遍历每一行for index, row in df.iterrows():sheet_data[row['Season']] = row[target_vars].tolist() #提取该行变量数据并转为列表all_data_dicts[sheet] = sheet_data #存入总字典

第八部分

#创建画布,指定为极坐标投影fig_comb, axes_comb = plt.subplots(2, 2, figsize=(12, 12), subplot_kw={'projection': 'polar'})#调整子图之间的间距和边距plt.subplots_adjust(wspace=0.2, #水平间距hspace=0.2, #垂直间距left=0.1, #左边距right=0.9, #右边距top=0.9, #上边距bottom=0.1) #下边距comb_png = os.path.join(OUTPUT_FOLDER, f'Combined_Chart{SCHEME_ID}.png')comb_pdf = os.path.join(OUTPUT_FOLDER, f'Combined_Chart{SCHEME_ID}.pdf')fig_comb.savefig(comb_png, dpi=300, bbox_inches='tight')fig_comb.savefig(comb_pdf, format='pdf', bbox_inches='tight')print(f" 已保存组合图: {comb_png}")plt.close(fig_comb) #关闭图

如何应用到你自己的数据

1.设置配色方案:
SCHEME_ID = 58 #使用的配色方案2.设置绘图参数:
PLOT_PARAMS = {'baseline': 1.1, # 0值所在的圆周半径,基准线'min_val': -1.0, #最小值'max_val': 1.1, #最大值'radius_min': 0.1, #数据最小值对应的极坐标半径'radius_max': 2.4, #数据最大值对应的极坐标半径'season_inner': 2.8, #季节文字环背景的内圆半径'season_outer': 3.4, #季节文字环背景的外圆半径'plot_limit': 3.5 #整个绘图区域的限制半径}
3.设置扇形区域数据:
seasons = ['Spring', 'Summer', 'Autumn', 'Winter']4.设置柱子数据:
var_labels = ['RAD', 'TA', 'SWC', 'VPD']5.设置变量数量:
n_vars = 4 #变量数量6.设置原始数据的路径:
DATA_FILE = r"data.xlsx"#文件路径7.设置绘图结果的保存路径:
OUTPUT_FOLDER = r"Chart_Results"
推荐


获取方式
