
代码绘制成果展示










代码解释


第一部分

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

第二部分

# =========================================================================================# ======================================2.颜色库=======================================# =========================================================================================COLOR_SCHEMES = {1: ['#8C8C8C', '#9C8396', '#F07E81', '#FCB38C', '#FCD171', '#FCF2A0', '#E2E2E2', '#DBE196', '#8EC092'],}scheme_id = 60 #使用的颜色方案color_scheme = COLOR_SCHEMES[scheme_id] #提取配色

第三部分

# =========================================================================================# ======================================3.绘图函数=======================================# =========================================================================================def plot_half_polar_stacked_bar(df, regions, title):#创建画布fig = plt.figure(figsize=(9, 7))ax = fig.add_subplot(111, polar=True) #添加极坐标子图ax.set_thetamin(0) #极坐标的角度最小值ax.set_thetamax(180) #极坐标的角度最大值

第四部分

n_years = len(df.index) #获取年份的个数years = df.index.values #提取年份数组gap = 0.05 #柱子分布两端的角度间隙angles = np.linspace(np.pi - gap, gap, n_years) #在半圆内生成均匀分布的极角width = (np.pi / n_years) * 0.85 #每个柱状图的角宽度bottoms = np.zeros(n_years) #初始化堆叠柱状图底部的起点数组

第五部分

ax.set_ylim(0, 80) #极径的显示范围ax.set_yticks([0, 10, 20, 30, 40, 50, 60, 70, 80]) #需要显示的极径刻度位置ax.set_yticklabels([]) # 隐藏默认的极径刻度标签文字# 网格线ax.grid(color='#E0E0E0', linestyle='-', linewidth=0.8, zorder=0)# 添加右侧刻度标注ax.text(0, # 角度y_val, #高度f"{y_val}", #文本ha='center', #水平va='top', #垂直fontsize=12, #大小fontweight='bold') #加粗# 绘制右侧的刻度线ax.plot([0, 0.03], # 角度[y_val, y_val], #高度color='black', # 颜色lw=2, #宽度clip_on=False) #允许绘制内容超出绘图框边界

第六部分

#要显示为主刻度的年份xticks_years = [1990, 1995, 2000, 2005, 2010, 2015, 2020]#使用线性插值计算出每个年份对应的极角位置xticks_angles = np.interp(xticks_years,[years[0], years[-1]],[np.pi - gap, gap])ax.set_xticks(xticks_angles) #设置X轴刻度#设置刻度标注ax.set_xticklabels(xticks_years, fontsize=14, fontweight='bold')#设置坐标轴外围的所有边框for spine in ax.spines.values():spine.set_linewidth(2) #线宽spine.set_color('black') #颜色# 隐藏极角刻度的默认外延线ax.tick_params(axis='x', length=0, pad=8)

第七部分

#标题plt.figtext(0.1, #x0.85, #ytitle, #内容fontsize=16, #大小fontweight='bold', #加粗ha='left') #左对齐#遍历图例中的文字对象,加粗for text in legend.get_texts():text.set_fontweight('bold')plt.tight_layout() #自动调整子图参数

第八部分

# =========================================================================================# ======================================4.执行部分======================================# =========================================================================================if __name__ == "__main__":file_path = r'data.xlsx' #原始数据路径df_data = pd.read_excel(file_path, index_col=0) #读取数据region_list = df_data.columns.tolist() # 提取列名,转换为列表形式(堆叠的区域名称)#调用绘制函数plot_half_polar_stacked_bar(df=df_data, #数据集regions=region_list, #区域列名列表title="(a) Total change of GDP-CPWD exposure" #标题)

如何应用到你自己的数据

1.设置配色方案:
scheme_id = 60 #使用的颜色方案2.设置径向的刻度位置:
ax.set_yticks([0, 10, 20, 30, 40, 50, 60, 70, 80]) #需要显示的极径刻度位置3.设置角度的刻度位置:
xticks_years = [1990, 1995, 2000, 2005, 2010, 2015, 2020]4.设置绘图结果的保存地址:
plt.savefig(fr'chart_{scheme_id}.png', dpi=300, bbox_inches='tight')5.设置原始数据文件保存路径:
file_path = r'data.xlsx' #原始数据路径
推荐


获取方式
