当前位置:首页>python>期刊图片复现|Python绘制3D条带图

期刊图片复现|Python绘制3D条带图

  • 2026-10-11 06:11:59
期刊图片复现|Python绘制3D条带图

代码绘制成果展示

论文:Revealing the spatiotemporal dynamics and coupling coordination between  urbanization and ecological environment quality in the Aksu  Region, Xinjiang
论文原图
仿图
多种配色

代码解释

第一部分

库的导入以及字体设置
# =========================================================================================# ====================================== 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坐标网格

第六部分

x、y、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)

推荐

期刊图片复现|Python绘制二维偏依赖PDP图
期刊复现|python绘制基于SHAP分析和GAM模型拟合的单特征依赖图
期刊图片复现|python绘制带有渐变颜色shap特征重要性组合图(条形图+蜂巢图)
期刊复现|用Python绘制SHAP特征重要性总览图、依赖图、双特征交互效应SHAP图,解锁XGBoost模型的终极奥秘
期刊图片复现|Python绘制shap重要性蜂巢图+单特征依赖图+交互效应强度气泡图+交互效应依赖图(回归+二分类+分类)

获取方式

需要的请后台私信我,注意只会分享练习数据和代码文件,不会提供答疑服务,代码文件中已经包含了每行代码的完整注释!!!

最新文章

随机文章