
代码绘制成果展示








代码解释


第一部分

# =========================================================================================# ====================================== 1. 库的导入 =========================================# =========================================================================================import matplotlib.pyplot as pltimport numpy as npimport pandas as pdimport matplotlibplt.rcParams['font.family'] = 'serif'plt.rcParams['font.serif'] = ['Times New Roman']matplotlib.rcParams['pdf.fonttype'] = 42matplotlib.rcParams['ps.fonttype'] = 42

第二部分

# =========================================================================================# ====================================== 2.颜色库=========================================# =========================================================================================COLOR_SCHEMES = {1: ['#A6C1E3', '#00579C', '#B5D68B', '#008026', '#FB9A99', '#E31A1C', '#FDBF6F', '#FF7F00', '#CAB2D6'],}

第三部分

# =========================================================================================# ======================================3.绘图函数=========================================# =========================================================================================def draw_3d_chart(data_dict, years_arr, county_list, color_list):num_c = len(county_list) # 计算数据类别的数量fig = plt.figure(figsize=(10, 8), dpi=150) #创建画布ax = fig.add_subplot(111, projection='3d') #添加一个3D子图

第四部分

for i, county in enumerate(county_list): # 遍历每一个区域for j in range(len(years_arr)): # 遍历每一个年份点#绘制垂线ax.plot([years_arr[j], #垂线的X坐标,起点years_arr[j]], #设置垂线的X坐标,终点[i, i], #设置垂线的Y坐标[0, zs[j]], #设置垂线的Z坐标color='black', #颜色linestyle='-', #线型linewidth=1, #垂线宽度alpha=0.9, #透明度zorder=1)

第五部分

for j in range(len(years_arr) - 1): # 遍历年份区间X_segment = np.array([[years_arr[j], # 定义面的X坐标网格,当前年份years_arr[j + 1]], # 定义面的X坐标网格,下一年份[years_arr[j], # 定义面的X坐标网格years_arr[j + 1]]]) # 定义面的X坐标网格Y_segment = np.array([[i - half_width, #Y坐标网格,宽度下界i - half_width], #Y坐标网格,宽度下界[i + half_width, #Y坐标网格,宽度上界i + half_width]]) #Y坐标网格,宽度上界Z_segment = np.array([[zs[j], #Z坐标网格,当前数据值zs[j + 1]], #Z坐标网格,下一数据值[zs[j], # Z坐标网格zs[j + 1]]]) #Z坐标网格

第六部分

ax.set_xticks(years_arr) # 设置X轴的刻度位置为年份数组ax.set_xlim(years_arr[0] - 2, years_arr[-1] + 1) #X轴的显示范围ax.set_yticks(yticks) # 设置Y轴的刻度位置# 设置Y轴的刻度标签ax.set_yticklabels(county_list, #数据rotation=-90, #旋转角度va='center', #垂直对齐方式ha='center', #水平对齐方式fontsize=18) #字体大小# 设置Z轴的标题ax.set_zlabel('Social Urbanization (a)',fontsize=18, #字体大小labelpad=12, #Z轴标题与轴的距离rotation=90) #标题旋转角度ax.tick_params(axis='z', #Z轴刻度参数labelsize=18) #Z轴刻度标签大小

第七部分

x_min, x_max = years_arr[0] - 2, years_arr[-1] + 1 #定义边框的X轴范围y_min, y_max = -1, num_c #定义边框的Y轴范围z_min, z_max = 0, 1.0 #定义边框的Z轴范围frame_color = 'black' #设置边框颜色frame_width = 1.2 #设置边框宽度ax.plot([x_min, x_min], [y_max, y_max], [z_min, z_max], color=frame_color, linewidth=frame_width, zorder=0)ax.plot([x_min, x_min], [y_min, y_max], [z_max, z_max], color=frame_color, linewidth=frame_width, zorder=0)ax.plot([x_min, x_max], [y_max, y_max], [z_max, z_max], color=frame_color, linewidth=frame_width, zorder=0)ax.plot([x_min, x_min], [y_min, y_max], [z_min, z_min], color=frame_color, linewidth=frame_width, zorder=0)ax.plot([x_min, x_max], [y_max, y_max], [z_min, z_min], color=frame_color, linewidth=frame_width, zorder=0)

第八部分

ax.xaxis.pane.set_facecolor(pane_color) # X轴面板背景色ax.xaxis.pane.set_edgecolor(frame_color) #X轴面板边缘颜色ax.xaxis.pane.set_alpha(1) #X轴面板透明度ax.yaxis.pane.set_facecolor(pane_color) #Y轴面板背景色ax.yaxis.pane.set_edgecolor(frame_color) #Y轴面板边缘颜色ax.yaxis.pane.set_alpha(1) # Y轴面板透明度ax.zaxis.pane.set_facecolor(pane_color) #Z轴面板背景色ax.zaxis.pane.set_edgecolor(frame_color) #Z轴面板边缘颜色ax.zaxis.pane.set_alpha(1) #Z轴面板透明度ax.xaxis._axinfo["grid"]['linestyle'] = "-" #X轴网格线型ax.yaxis._axinfo["grid"]['linestyle'] = "-" #Y轴网格线型ax.zaxis._axinfo["grid"]['linestyle'] = "-" #Z轴网格线型ax.xaxis._axinfo["grid"]['color'] = grid_color #X轴网格颜色ax.yaxis._axinfo["grid"]['color'] = grid_color #Y轴网格颜色ax.zaxis._axinfo["grid"]['color'] = grid_color #Z轴网格颜色

第九部分

# 创建图例的矩形色块列表legend_patches = [plt.Rectangle((0, 0), 1,1, color=color_list[i % len(color_list)], alpha=0.9) for i in range(num_c)]legend = plt.legend( # 创建图例对象legend_patches, #色块句柄county_list, #标签文本loc='upper left', #图例的位置bbox_to_anchor=(0.1, 0.72), #具体位置ncol=1, #列数fontsize=12,frameon=True, #显示图例边框edgecolor='black', #图例边框颜色fancybox=False)legend.get_frame().set_linewidth(1.0) #图例边框的线宽plt.subplots_adjust(left=-0.05, right=1, top=1.05, bottom=0.001)

第十部分

# =========================================================================================# ======================================4.执行部分=========================================# =========================================================================================if __name__ == "__main__":excel_path = r'data.xlsx' #Excel数据文件的路径scheme_index = 20#要使用的颜色方案df = pd.read_excel(excel_path, index_col=0) # 读取Excel文件years = df.index.to_numpy() # 将年份转换为NumPy数组counties = df.columns.tolist() # 将列转换为列表data = df.to_dict(orient='list') #将数据框转换为字典格式,列名为键,列表为值current_colors = COLOR_SCHEMES.get(scheme_index, COLOR_SCHEMES[1]) #颜色方案#调用函数进行绘图draw_3d_chart(data, years, counties, current_colors)

如何应用到你自己的数据

1.设置原始数据文件的路径:
excel_path = r'data.xlsx' #Excel数据文件的路径2.设置绘图配色方案:
scheme_index = 20#要使用的颜色方案3.设置绘图结果的保存地址:
plt.savefig(fr"scheme_{scheme_index}.png", dpi=300)plt.savefig(fr"scheme_{scheme_index}.pdf", dpi=300)

推荐


获取方式
