当前位置:首页>python>《15节课Python绘图从入门到精通》9——三维数据呈现实操

《15节课Python绘图从入门到精通》9——三维数据呈现实操

  • 2026-06-30 17:09:04
《15节课Python绘图从入门到精通》9——三维数据呈现实操

前置数据准备

为保证所有程序可直接运行,先运行以下代码生成模拟的三维实验数据(不规则分布的XYZ散点,带噪声的非线性响应曲面)。

import numpy as npimport pandas as pdnp.random.seed(2024)# 生成不规则分布的XYZ数据点(模拟实验测量)n_points = 250x = np.random.uniform(-33, n_points)y = np.random.uniform(-33, n_points)# 构造一个具有双峰、一个凹陷的复杂响应曲面z = ( 8 * np.exp(-((x-1.5)**2 + (y-1)**2)/2) +           # 右上前峰6 * np.exp(-((x+1.8)**2 + (y+1.2)**2)/1.5) -       # 左下后峰4 * np.exp(-((x)**2 + (y)**2)/3) +                 # 中心凹陷1.5 * np.sin(2.5*x) * np.cos(2.0*y) +             # 波动项0.4 * x + 0.3 * y )                                # 线性趋势# 添加测量噪声(模拟实验误差)z += np.random.normal(00.5, n_points)df_xyz = pd.DataFrame({'X': x, 'Y': y, 'Z': z})df_xyz.to_csv('三维散点数据.csv', index=False, encoding='utf-8-sig')print("数据生成完成:三维散点数据.csv(含X, Y, Z三列,共250个数据点)")

实操任务1:绘制三维散点图,调整散点颜色与大小

本任务从基础的三维散点图入手,逐步进阶到颜色映射、大小映射、多视角设置、投影线及三维文字标注。

基础版:基础三维散点图

读取数据,使用scatter在三维坐标系中绘制散点。

import pandas as pdimport numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3D# 学术样式设置defset_academic_style():    plt.rcParams['font.family'] = ['Times New Roman''SimSun']    plt.rcParams['font.size'] = 9    plt.rcParams['axes.unicode_minus'] = False    plt.rcParams['axes.linewidth'] = 1.0    plt.rcParams['xtick.major.width'] = 1.0    plt.rcParams['ytick.major.width'] = 1.0    plt.rcParams['xtick.major.size'] = 3.5    plt.rcParams['ytick.major.size'] = 3.5    plt.rcParams['xtick.direction'] = 'in'    plt.rcParams['ytick.direction'] = 'in'    plt.rcParams['legend.frameon'] = False    plt.rcParams['pdf.fonttype'] = 42    plt.rcParams['savefig.dpi'] = 1200set_academic_style()df = pd.read_csv('三维散点数据.csv')x = df['X'].valuesy = df['Y'].valuesz = df['Z'].valuesfig = plt.figure(figsize=(5.54.5))ax = fig.add_subplot(111, projection='3d')sc = ax.scatter(x, y, z, s=15, c='#4472C4', alpha=0.7, edgecolors='black', linewidths=0.3)ax.set_xlabel('X')ax.set_ylabel('Y')ax.set_zlabel('Z')ax.set_title('三维散点图(基础)', fontsize=10)plt.tight_layout()plt.show()fig.savefig('三维散点图_基础.pdf', bbox_inches='tight', pad_inches=0.05)fig.savefig('三维散点图_基础.png', bbox_inches='tight', pad_inches=0.05)

执行结果分析:

  • 使用projection='3d'创建三维坐标轴,scatter绘制散点。

  • 默认视角为elev=30, azim=-60,可从不同角度观察数据分布。

  • 散点颜色单一,大小固定,适用于初步探索数据整体结构。

进阶1:散点颜色映射Z值(连续色阶)

将Z值(响应变量)映射为散点颜色,直观展示响应值的空间变化。

import pandas as pdimport numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3Ddefset_academic_style():    plt.rcParams['font.family'] = ['Times New Roman''SimSun']    plt.rcParams['font.size'] = 9    plt.rcParams['axes.unicode_minus'] = False    plt.rcParams['axes.linewidth'] = 1.0    plt.rcParams['xtick.major.width'] = 1.0    plt.rcParams['ytick.major.width'] = 1.0    plt.rcParams['xtick.major.size'] = 3.5    plt.rcParams['ytick.major.size'] = 3.5    plt.rcParams['xtick.direction'] = 'in'    plt.rcParams['ytick.direction'] = 'in'    plt.rcParams['legend.frameon'] = False    plt.rcParams['pdf.fonttype'] = 42    plt.rcParams['savefig.dpi'] = 1200set_academic_style()df = pd.read_csv('三维散点数据.csv')x, y, z = df['X'].values, df['Y'].values, df['Z'].valuesfig = plt.figure(figsize=(5.54.5))ax = fig.add_subplot(111, projection='3d')sc = ax.scatter(x, y, z, s=20, c=z, cmap='viridis', alpha=0.8                edgecolors='black', linewidths=0.3)cbar = fig.colorbar(sc, ax=ax, shrink=0.5, aspect=10, pad=0.1)cbar.set_label('响应值 Z', fontsize=9)ax.set_xlabel('X')ax.set_ylabel('Y')ax.set_zlabel('Z')ax.set_title('三维散点图(Z值颜色映射)', fontsize=10)plt.tight_layout()plt.show()fig.savefig('三维散点图_颜色映射.pdf', bbox_inches='tight', pad_inches=0.05)fig.savefig('三维散点图_颜色映射.png', bbox_inches='tight', pad_inches=0.05)

执行结果分析:

  • 通过c=z将散点颜色与Z值关联,cmap='viridis'使用色盲友好渐变色。

  • 颜色条显示Z值范围,高响应区(黄色)和低响应区(深紫)一目了然。

  • 结合Z轴高度和颜色双重编码,增强数据可读性。

进阶2:散点大小映射第四维信息

假设每个数据点带有测量置信度或权重,将散点大小与第四维变量关联。

import pandas as pdimport numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3Ddefset_academic_style():    plt.rcParams['font.family'] = ['Times New Roman''SimSun']    plt.rcParams['font.size'] = 9    plt.rcParams['axes.unicode_minus'] = False    plt.rcParams['axes.linewidth'] = 1.0    plt.rcParams['xtick.major.width'] = 1.0    plt.rcParams['ytick.major.width'] = 1.0    plt.rcParams['xtick.major.size'] = 3.5    plt.rcParams['ytick.major.size'] = 3.5    plt.rcParams['xtick.direction'] = 'in'    plt.rcParams['ytick.direction'] = 'in'    plt.rcParams['legend.frameon'] = False    plt.rcParams['pdf.fonttype'] = 42    plt.rcParams['savefig.dpi'] = 1200set_academic_style()df = pd.read_csv('三维散点数据.csv')x, y, z = df['X'].values, df['Y'].values, df['Z'].values# 模拟第四维:测量精度/权重(中心区域精度高,边缘低)weights = np.exp(-(x**2 + y**2)/8) + 0.3 * np.random.rand(len(x))# 映射到散点大小(15~80)sizes = 15 + 65 * (weights - weights.min()) / (weights.max() - weights.min())fig = plt.figure(figsize=(5.54.5))ax = fig.add_subplot(111, projection='3d')sc = ax.scatter(x, y, z, s=sizes, c=z, cmap='plasma', alpha=0.7                edgecolors='black', linewidths=0.3)cbar = fig.colorbar(sc, ax=ax, shrink=0.5, aspect=10, pad=0.1)cbar.set_label('响应值 Z', fontsize=9)ax.set_xlabel('X')ax.set_ylabel('Y')ax.set_zlabel('Z')ax.set_title('三维散点图(大小表示测量权重)', fontsize=10)# 添加大小图例(手动)import matplotlib.patches as mpatcheslegend_sizes = [0.20.50.9]legend_labels = ['低权重''中权重''高权重']handles = [mpatches.Patch(color='gray', alpha=0.6, label=f'{label}'for label in legend_labels]# 实际大小图例需要自定义,此处省略细节plt.tight_layout()plt.show()fig.savefig('三维散点图_大小映射.pdf', bbox_inches='tight', pad_inches=0.05)fig.savefig('三维散点图_大小映射.png', bbox_inches='tight', pad_inches=0.05)

执行结果分析:

  • 散点大小反映第四维信息(如置信度、样本量),颜色仍表示Z值。

  • 视觉上中心区域点较大,表示测量更可靠。

  • 实际应用中可添加大小图例说明,此处限于篇幅未完整实现。

进阶3:多视角子图排列

将同一数据以四个不同视角绘制在子图中,全面展示三维结构。

import pandas as pdimport numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3Ddefset_academic_style():    plt.rcParams['font.family'] = ['Times New Roman''SimSun']    plt.rcParams['font.size'] = 9    plt.rcParams['axes.unicode_minus'] = False    plt.rcParams['axes.linewidth'] = 1.0    plt.rcParams['xtick.major.width'] = 1.0    plt.rcParams['ytick.major.width'] = 1.0    plt.rcParams['xtick.major.size'] = 3.5    plt.rcParams['ytick.major.size'] = 3.5    plt.rcParams['xtick.direction'] = 'in'    plt.rcParams['ytick.direction'] = 'in'    plt.rcParams['legend.frameon'] = False    plt.rcParams['pdf.fonttype'] = 42    plt.rcParams['savefig.dpi'] = 1200set_academic_style()df = pd.read_csv('三维散点数据.csv')x, y, z = df['X'].values, df['Y'].values, df['Z'].valuesview_angles = [(30-60), (0-90), (90-90), (300)]titles = ['默认视角''俯视 (X-Y)''正视 (X-Z)''侧视 (Y-Z)']fig = plt.figure(figsize=(8.07.0))for i, (elev, azim) in enumerate(view_angles):    ax = fig.add_subplot(22, i+1, projection='3d')    sc = ax.scatter(x, y, z, s=12, c=z, cmap='viridis', alpha=0.7, edgecolors='black', linewidths=0.2)    ax.view_init(elev=elev, azim=azim)    ax.set_xlabel('X')    ax.set_ylabel('Y')    ax.set_zlabel('Z')    ax.set_title(titles[i], fontsize=10)# 共享颜色条cbar_ax = fig.add_axes([0.920.150.020.7])norm = plt.Normalize(z.min(), z.max())sm = plt.cm.ScalarMappable(cmap='viridis', norm=norm)sm.set_array([])fig.colorbar(sm, cax=cbar_ax, label='响应值 Z')plt.tight_layout(rect=[000.911])plt.show()fig.savefig('三维散点图_多视角.pdf', bbox_inches='tight', pad_inches=0.05)fig.savefig('三维散点图_多视角.png', bbox_inches='tight', pad_inches=0.05)

执行结果分析:

  • 四个子图从不同角度观察数据,俯视图揭示X-Y平面分布,正视图和侧视图展示Z与X、Y的关系。

  • 共享颜色条保证色彩映射一致,便于跨子图比较。

  • 适用于论文中需要多角度展示三维数据的情况。

进阶4:添加从散点到投影平面的垂线

在三维散点图中添加从每个点到XY、XZ、YZ平面的垂线,帮助读者准确定位空间坐标。

import pandas as pdimport numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3Ddefset_academic_style():    plt.rcParams['font.family'] = ['Times New Roman''SimSun']    plt.rcParams['font.size'] = 9    plt.rcParams['axes.unicode_minus'] = False    plt.rcParams['axes.linewidth'] = 1.0    plt.rcParams['xtick.major.width'] = 1.0    plt.rcParams['ytick.major.width'] = 1.0    plt.rcParams['xtick.major.size'] = 3.5    plt.rcParams['ytick.major.size'] = 3.5    plt.rcParams['xtick.direction'] = 'in'    plt.rcParams['ytick.direction'] = 'in'    plt.rcParams['legend.frameon'] = False    plt.rcParams['pdf.fonttype'] = 42    plt.rcParams['savefig.dpi'] = 1200set_academic_style()df = pd.read_csv('三维散点数据.csv')# 抽取少量点以避免过度拥挤df_sample = df.sample(n=30, random_state=42)x, y, z = df_sample['X'].values, df_sample['Y'].values, df_sample['Z'].valuesfig = plt.figure(figsize=(6.05.0))ax = fig.add_subplot(111, projection='3d')# 散点sc = ax.scatter(x, y, z, s=30, c=z, cmap='plasma', alpha=0.9, edgecolors='black', linewidths=0.5)# 绘制到XY平面的垂线(z_min为平面)z_min = ax.get_zlim()[0]for xi, yi, zi in zip(x, y, z):    ax.plot([xi, xi], [yi, yi], [z_min, zi], color='gray', linestyle=':', linewidth=0.5, alpha=0.5)# 在XY平面画小圆点    ax.scatter(xi, yi, z_min, s=10, c='gray', alpha=0.5, edgecolors='none')# 绘制到XZ平面的垂线(y_min)y_min = ax.get_ylim()[0]for xi, yi, zi in zip(x, y, z):    ax.plot([xi, xi], [y_min, yi], [zi, zi], color='gray', linestyle=':', linewidth=0.5, alpha=0.3)ax.set_xlabel('X')ax.set_ylabel('Y')ax.set_zlabel('Z')ax.set_title('三维散点图(带投影垂线)', fontsize=10)plt.tight_layout()plt.show()fig.savefig('三维散点图_投影垂线.pdf', bbox_inches='tight', pad_inches=0.05)fig.savefig('三维散点图_投影垂线.png', bbox_inches='tight', pad_inches=0.05)

执行结果分析:

  • 灰色虚线连接散点与XY平面上的投影点,清晰展示每个点的X、Y坐标。

  • 仅对部分点绘制垂线,避免视觉混乱。

  • 此方法常用于展示高维数据降维后的空间分布。

实操任务2:将散点数据插值为规则网格

本任务从基础的plot_surface曲面绘制入手,逐步进阶到插值方法对比、透明度调整、颜色映射自定义及网格线叠加。

基础版:线性插值绘制曲面

将散点数据插值到规则网格,绘制光滑曲面。

import pandas as pdimport numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3Dfrom scipy.interpolate import griddatadefset_academic_style():    plt.rcParams['font.family'] = ['Times New Roman''SimSun']    plt.rcParams['font.size'] = 9    plt.rcParams['axes.unicode_minus'] = False    plt.rcParams['axes.linewidth'] = 1.0    plt.rcParams['xtick.major.width'] = 1.0    plt.rcParams['ytick.major.width'] = 1.0    plt.rcParams['xtick.major.size'] = 3.5    plt.rcParams['ytick.major.size'] = 3.5    plt.rcParams['xtick.direction'] = 'in'    plt.rcParams['ytick.direction'] = 'in'    plt.rcParams['legend.frameon'] = False    plt.rcParams['pdf.fonttype'] = 42    plt.rcParams['savefig.dpi'] = 1200set_academic_style()df = pd.read_csv('三维散点数据.csv')x, y, z = df['X'].values, df['Y'].values, df['Z'].values# 定义规则网格xi = np.linspace(x.min(), x.max(), 50)yi = np.linspace(y.min(), y.max(), 50)Xi, Yi = np.meshgrid(xi, yi)# 线性插值Zi = griddata((x, y), z, (Xi, Yi), method='linear')fig = plt.figure(figsize=(6.05.0))ax = fig.add_subplot(111, projection='3d')surf = ax.plot_surface(Xi, Yi, Zi, cmap='viridis', linewidth=0, antialiased=True)cbar = fig.colorbar(surf, ax=ax, shrink=0.5, aspect=10, pad=0.1)cbar.set_label('响应值 Z', fontsize=9)ax.set_xlabel('X')ax.set_ylabel('Y')ax.set_zlabel('Z')ax.set_title('三维响应曲面(线性插值)', fontsize=10)plt.tight_layout()plt.show()fig.savefig('三维曲面_基础插值.pdf', bbox_inches='tight', pad_inches=0.05)fig.savefig('三维曲面_基础插值.png', bbox_inches='tight', pad_inches=0.05)

执行结果分析:

  • griddata将不规则散点插值到规则网格,plot_surface绘制连续曲面。

  • 线性插值速度快,但在数据稀疏区域可能产生折痕。

  • 颜色映射反映Z值,曲面光滑程度取决于网格分辨率。

进阶1:样条插值(cubic)提升光滑度

对比线性插值与三次样条插值的效果差异。

import pandas as pdimport numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3Dfrom scipy.interpolate import griddatadefset_academic_style():    plt.rcParams['font.family'] = ['Times New Roman''SimSun']    plt.rcParams['font.size'] = 9    plt.rcParams['axes.unicode_minus'] = False    plt.rcParams['axes.linewidth'] = 1.0    plt.rcParams['xtick.major.width'] = 1.0    plt.rcParams['ytick.major.width'] = 1.0    plt.rcParams['xtick.major.size'] = 3.5    plt.rcParams['ytick.major.size'] = 3.5    plt.rcParams['xtick.direction'] = 'in'    plt.rcParams['ytick.direction'] = 'in'    plt.rcParams['legend.frameon'] = False    plt.rcParams['pdf.fonttype'] = 42    plt.rcParams['savefig.dpi'] = 1200set_academic_style()df = pd.read_csv('三维散点数据.csv')x, y, z = df['X'].values, df['Y'].values, df['Z'].valuesxi = np.linspace(x.min(), x.max(), 60)yi = np.linspace(y.min(), y.max(), 60)Xi, Yi = np.meshgrid(xi, yi)# 线性插值Zi_linear = griddata((x, y), z, (Xi, Yi), method='linear')# 三次样条插值Zi_cubic = griddata((x, y), z, (Xi, Yi), method='cubic')fig = plt.figure(figsize=(10.04.5))# 线性插值ax1 = fig.add_subplot(121, projection='3d')surf1 = ax1.plot_surface(Xi, Yi, Zi_linear, cmap='viridis', linewidth=0, antialiased=True)ax1.set_title('线性插值', fontsize=10)ax1.set_xlabel('X'); ax1.set_ylabel('Y'); ax1.set_zlabel('Z')# 三次样条插值ax2 = fig.add_subplot(122, projection='3d')surf2 = ax2.plot_surface(Xi, Yi, Zi_cubic, cmap='viridis', linewidth=0, antialiased=True)ax2.set_title('三次样条插值', fontsize=10)ax2.set_xlabel('X'); ax2.set_ylabel('Y'); ax2.set_zlabel('Z')# 共享颜色条cbar_ax = fig.add_axes([0.920.150.0150.7])norm = plt.Normalize(z.min(), z.max())sm = plt.cm.ScalarMappable(cmap='viridis', norm=norm)sm.set_array([])fig.colorbar(sm, cax=cbar_ax, label='响应值 Z')plt.tight_layout(rect=[000.911])plt.show()fig.savefig('三维曲面_插值方法对比.pdf', bbox_inches='tight', pad_inches=0.05)fig.savefig('三维曲面_插值方法对比.png', bbox_inches='tight', pad_inches=0.05)

执行结果分析:

  • 三次样条插值曲面更光滑,峰谷过渡自然,尤其在数据点之间生成连续导数。

  • 线性插值在局部可能出现棱角,但计算更快。

  • 实际应用中,若数据噪声较大,可先平滑再插值,或使用径向基函数插值。

进阶2:设置曲面透明度与叠加散点

将原始散点叠加在透明曲面上,展示拟合质量。

import pandas as pdimport numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3Dfrom scipy.interpolate import griddatadefset_academic_style():    plt.rcParams['font.family'] = ['Times New Roman''SimSun']    plt.rcParams['font.size'] = 9    plt.rcParams['axes.unicode_minus'] = False    plt.rcParams['axes.linewidth'] = 1.0    plt.rcParams['xtick.major.width'] = 1.0    plt.rcParams['ytick.major.width'] = 1.0    plt.rcParams['xtick.major.size'] = 3.5    plt.rcParams['ytick.major.size'] = 3.5    plt.rcParams['xtick.direction'] = 'in'    plt.rcParams['ytick.direction'] = 'in'    plt.rcParams['legend.frameon'] = False    plt.rcParams['pdf.fonttype'] = 42    plt.rcParams['savefig.dpi'] = 1200set_academic_style()df = pd.read_csv('三维散点数据.csv')x, y, z = df['X'].values, df['Y'].values, df['Z'].valuesxi = np.linspace(x.min(), x.max(), 60)yi = np.linspace(y.min(), y.max(), 60)Xi, Yi = np.meshgrid(xi, yi)Zi = griddata((x, y), z, (Xi, Yi), method='cubic')fig = plt.figure(figsize=(6.05.0))ax = fig.add_subplot(111, projection='3d')# 半透明曲面surf = ax.plot_surface(Xi, Yi, Zi, cmap='viridis', alpha=0.6, linewidth=0, antialiased=True)# 叠加散点ax.scatter(x, y, z, s=15, c='red', edgecolors='black', linewidths=0.3, label='实验数据')cbar = fig.colorbar(surf, ax=ax, shrink=0.5, aspect=10, pad=0.1)cbar.set_label('响应值 Z', fontsize=9)ax.set_xlabel('X')ax.set_ylabel('Y')ax.set_zlabel('Z')ax.set_title('曲面拟合(透明曲面 + 原始散点)', fontsize=10)ax.legend(loc='upper left', fontsize=8)plt.tight_layout()plt.show()fig.savefig('三维曲面_透明叠加散点.pdf', bbox_inches='tight', pad_inches=0.05)fig.savefig('三维曲面_透明叠加散点.png', bbox_inches='tight', pad_inches=0.05)

执行结果分析:

  • 曲面透明度alpha=0.6使背后的散点和坐标轴线隐约可见,增强立体感。

  • 红色散点标记原始测量位置,偏离曲面的点表示拟合残差。

  • 适用于展示插值或拟合结果的可靠性。

进阶3:自定义离散色阶与光照效果

使用自定义颜色映射,并启用shade参数模拟光照。

import pandas as pdimport numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3Dfrom scipy.interpolate import griddataimport matplotlib.colors as mcolorsdefset_academic_style():    plt.rcParams['font.family'] = ['Times New Roman''SimSun']    plt.rcParams['font.size'] = 9    plt.rcParams['axes.unicode_minus'] = False    plt.rcParams['axes.linewidth'] = 1.0    plt.rcParams['xtick.major.width'] = 1.0    plt.rcParams['ytick.major.width'] = 1.0    plt.rcParams['xtick.major.size'] = 3.5    plt.rcParams['ytick.major.size'] = 3.5    plt.rcParams['xtick.direction'] = 'in'    plt.rcParams['ytick.direction'] = 'in'    plt.rcParams['legend.frameon'] = False    plt.rcParams['pdf.fonttype'] = 42    plt.rcParams['savefig.dpi'] = 1200set_academic_style()df = pd.read_csv('三维散点数据.csv')x, y, z = df['X'].values, df['Y'].values, df['Z'].valuesxi = np.linspace(x.min(), x.max(), 60)yi = np.linspace(y.min(), y.max(), 60)Xi, Yi = np.meshgrid(xi, yi)Zi = griddata((x, y), z, (Xi, Yi), method='cubic')# 自定义离散色阶(11个等级)boundaries = np.linspace(z.min(), z.max(), 12)norm = mcolors.BoundaryNorm(boundaries, ncolors=256)fig = plt.figure(figsize=(6.05.0))ax = fig.add_subplot(111, projection='3d')surf = ax.plot_surface(Xi, Yi, Zi, cmap='terrain', norm=norm,                        linewidth=0, antialiased=True, shade=True, alpha=0.9)cbar = fig.colorbar(surf, ax=ax, shrink=0.5, aspect=10, pad=0.1, ticks=boundaries[::2])cbar.set_label('响应值 Z', fontsize=9)ax.set_xlabel('X')ax.set_ylabel('Y')ax.set_zlabel('Z')ax.set_title('三维曲面(离散色阶 + 光照)', fontsize=10)plt.tight_layout()plt.show()fig.savefig('三维曲面_离散色阶光照.pdf', bbox_inches='tight', pad_inches=0.05)fig.savefig('三维曲面_离散色阶光照.png', bbox_inches='tight', pad_inches=0.05)

执行结果分析:

  • BoundaryNorm将连续值映射到离散颜色区间,使颜色条呈现阶梯状,便于分档识别。

  • shade=True启用默认光照,曲面明暗随角度变化,立体感增强。

  • 地形色盘terrain适合展示具有峰谷特征的地貌式数据。

进阶4:叠加曲面网格线

在光滑曲面上叠加黑色网格线,同时保留颜色填充,兼顾美观与结构清晰。

import pandas as pdimport numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3Dfrom scipy.interpolate import griddatadefset_academic_style():    plt.rcParams['font.family'] = ['Times New Roman''SimSun']    plt.rcParams['font.size'] = 9    plt.rcParams['axes.unicode_minus'] = False    plt.rcParams['axes.linewidth'] = 1.0    plt.rcParams['xtick.major.width'] = 1.0    plt.rcParams['ytick.major.width'] = 1.0    plt.rcParams['xtick.major.size'] = 3.5    plt.rcParams['ytick.major.size'] = 3.5    plt.rcParams['xtick.direction'] = 'in'    plt.rcParams['ytick.direction'] = 'in'    plt.rcParams['legend.frameon'] = False    plt.rcParams['pdf.fonttype'] = 42    plt.rcParams['savefig.dpi'] = 1200set_academic_style()df = pd.read_csv('三维散点数据.csv')x, y, z = df['X'].values, df['Y'].values, df['Z'].valuesxi = np.linspace(x.min(), x.max(), 40)yi = np.linspace(y.min(), y.max(), 40)Xi, Yi = np.meshgrid(xi, yi)Zi = griddata((x, y), z, (Xi, Yi), method='cubic')fig = plt.figure(figsize=(6.05.0))ax = fig.add_subplot(111, projection='3d')# 彩色曲面(无边缘线)surf = ax.plot_surface(Xi, Yi, Zi, cmap='coolwarm', linewidth=0, antialiased=True, alpha=0.9)# 叠加黑色网格线(线框图)ax.plot_wireframe(Xi, Yi, Zi, color='black', linewidth=0.3, alpha=0.5)cbar = fig.colorbar(surf, ax=ax, shrink=0.5, aspect=10, pad=0.1)cbar.set_label('响应值 Z', fontsize=9)ax.set_xlabel('X')ax.set_ylabel('Y')ax.set_zlabel('Z')ax.set_title('三维曲面 + 网格线', fontsize=10)plt.tight_layout()plt.show()fig.savefig('三维曲面_叠加网格线.pdf', bbox_inches='tight', pad_inches=0.05)fig.savefig('三维曲面_叠加网格线.png', bbox_inches='tight', pad_inches=0.05)

执行结果分析:

  • plot_wireframe绘制黑色细线,勾勒出曲面的网格结构,便于观察曲面曲率变化。

  • 填充颜色和网格线结合,既美观又保留了定量读取网格交点的能力。

  • 适用于有限元后处理或需要展示网格划分的场景。

实操任务3:在三维曲面底部平面绘制等高线投影,添加颜色条

本任务将二维等高线投影到三维曲面底部平面,并逐步进阶到填充等高线、自定义投影高度、多平面投影及三维等高线绘制。

基础版:曲面底部投影等高线(zdir='z')

使用contourzdiroffset参数将等高线投影到底部平面。

import pandas as pdimport numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3Dfrom scipy.interpolate import griddatadefset_academic_style():    plt.rcParams['font.family'] = ['Times New Roman''SimSun']    plt.rcParams['font.size'] = 9    plt.rcParams['axes.unicode_minus'] = False    plt.rcParams['axes.linewidth'] = 1.0    plt.rcParams['xtick.major.width'] = 1.0    plt.rcParams['ytick.major.width'] = 1.0    plt.rcParams['xtick.major.size'] = 3.5    plt.rcParams['ytick.major.size'] = 3.5    plt.rcParams['xtick.direction'] = 'in'    plt.rcParams['ytick.direction'] = 'in'    plt.rcParams['legend.frameon'] = False    plt.rcParams['pdf.fonttype'] = 42    plt.rcParams['savefig.dpi'] = 300set_academic_style()df = pd.read_csv('三维散点数据.csv')x, y, z = df['X'].values, df['Y'].values, df['Z'].valuesmask = np.isfinite(x) & np.isfinite(y) & np.isfinite(z)x, y, z = x[mask], y[mask], z[mask]xi = np.linspace(x.min(), x.max(), 50)yi = np.linspace(y.min(), y.max(), 50)Xi, Yi = np.meshgrid(xi, yi)Zi = griddata((x, y), z, (Xi, Yi), method='cubic')fig = plt.figure(figsize=(6.05.0))ax = fig.add_subplot(111, projection='3d')# 曲面surf = ax.plot_surface(Xi, Yi, Zi, cmap='viridis', alpha=0.8, linewidth=0)# 底部等高线投影z_min = np.nanmin(Zi) - 2# 偏移到曲面下方z_max = np.nanmax(Zi)ax.contour(Xi, Yi, Zi, zdir='z', offset=z_min, cmap='viridis', linewidths=0.8)cbar = fig.colorbar(surf, ax=ax, shrink=0.5, aspect=10, pad=0.1)cbar.set_label('响应值 Z', fontsize=9)ax.set_xlabel('X')ax.set_ylabel('Y')ax.set_zlabel('Z')ax.set_zlim(z_min, z_max)ax.set_title('三维曲面 + 底部等高线投影', fontsize=10)plt.tight_layout()plt.show()fig.savefig('三维曲面_等高线投影_基础.pdf', bbox_inches='tight', pad_inches=0.05)fig.savefig('三维曲面_等高线投影_基础.png', bbox_inches='tight', pad_inches=0.05)
执行结果分析:
  • zdir='z'指定投影方向为Z轴,offset定义投影平面高度。
  • 底部等高线与曲面上对应高度的轮廓一致,增强空间对应关系。
  • 颜色条同时适用于曲面和等高线。

进阶1:填充等高线投影(contourf)

使用contourf绘制填充等高线投影,使底部平面呈现二维热力图效果。

import pandas as pdimport numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3Dfrom scipy.interpolate import griddatadefset_academic_style():    plt.rcParams['font.family'] = ['Times New Roman''SimSun']    plt.rcParams['font.size'] = 9    plt.rcParams['axes.unicode_minus'] = False    plt.rcParams['axes.linewidth'] = 1.0    plt.rcParams['xtick.major.width'] = 1.0    plt.rcParams['ytick.major.width'] = 1.0    plt.rcParams['xtick.major.size'] = 3.5    plt.rcParams['ytick.major.size'] = 3.5    plt.rcParams['xtick.direction'] = 'in'    plt.rcParams['ytick.direction'] = 'in'    plt.rcParams['legend.frameon'] = False    plt.rcParams['pdf.fonttype'] = 42    plt.rcParams['savefig.dpi'] = 300set_academic_style()df = pd.read_csv('三维散点数据.csv')x, y, z = df['X'].values, df['Y'].values, df['Z'].valuesxi = np.linspace(x.min(), x.max(), 50)yi = np.linspace(y.min(), y.max(), 50)Xi, Yi = np.meshgrid(xi, yi)Zi = griddata((x, y), z, (Xi, Yi), method='cubic')fig = plt.figure(figsize=(6.05.0))ax = fig.add_subplot(111, projection='3d')surf = ax.plot_surface(Xi, Yi, Zi, cmap='viridis', alpha=0.8, linewidth=0)z_min = np.nanmin(Zi) - 2# 偏移到曲面下方z_max = np.nanmax(Zi)# 填充等高线ax.contourf(Xi, Yi, Zi, zdir='z', offset=z_min, cmap='viridis', alpha=0.7, levels=15)cbar = fig.colorbar(surf, ax=ax, shrink=0.5, aspect=10, pad=0.1)cbar.set_label('响应值 Z', fontsize=9)ax.set_xlabel('X')ax.set_ylabel('Y')ax.set_zlabel('Z')ax.set_zlim(z_min, z_max)ax.set_title('三维曲面 + 底部填充等高线', fontsize=10)plt.tight_layout()plt.show()fig.savefig('三维曲面_填充等高线投影.pdf', bbox_inches='tight', pad_inches=0.05)fig.savefig('三维曲面_填充等高线投影.png', bbox_inches='tight', pad_inches=0.05)
执行结果分析:
  • 底部填充等高线提供了二维伪彩色图,与三维曲面颜色映射一致。
  • 通过半透明效果,底部图不会完全遮挡坐标轴线。
  • 适用于需要同时展示三维形态和二维热力图的场景。

进阶2:在多个平面投影等高线(XZ、YZ平面)

除了底部XY平面,还在侧面(XZ和YZ平面)投影等高线,全面展示数据在各个维度的变化。

import pandas as pdimport numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3Dfrom scipy.interpolate import griddatadefset_academic_style():    plt.rcParams['font.family'] = ['Times New Roman''SimSun']    plt.rcParams['font.size'] = 9    plt.rcParams['axes.unicode_minus'] = False    plt.rcParams['axes.linewidth'] = 1.0    plt.rcParams['xtick.major.width'] = 1.0    plt.rcParams['ytick.major.width'] = 1.0    plt.rcParams['xtick.major.size'] = 3.5    plt.rcParams['ytick.major.size'] = 3.5    plt.rcParams['xtick.direction'] = 'in'    plt.rcParams['ytick.direction'] = 'in'    plt.rcParams['legend.frameon'] = False    plt.rcParams['pdf.fonttype'] = 42    plt.rcParams['savefig.dpi'] = 300set_academic_style()df = pd.read_csv('三维散点数据.csv')x, y, z = df['X'].values, df['Y'].values, df['Z'].valuesxi = np.linspace(x.min(), x.max(), 40)yi = np.linspace(y.min(), y.max(), 40)Xi, Yi = np.meshgrid(xi, yi)Zi = griddata((x, y), z, (Xi, Yi), method='cubic')fig = plt.figure(figsize=(7.06.0))ax = fig.add_subplot(111, projection='3d')surf = ax.plot_surface(Xi, Yi, Zi, cmap='plasma', alpha=0.7, linewidth=0)# 底部XY平面投影z_min = np.nanmin(Zi) - 2# 偏移到曲面下方z_max = np.nanmax(Zi)ax.contour(Xi, Yi, Zi, zdir='z', offset=z_min, cmap='plasma', linewidths=0.6)# 侧面XZ平面投影(y为最小值)y_min = np.nanmin(Yi) - 0.5y_max = np.nanmax(Yi)ax.contour(Xi, Yi, Zi, zdir='y', offset=y_min, cmap='plasma', linewidths=0.6)# 侧面YZ平面投影(x为最小值)x_min = np.nanmin(Xi) - 0.5x_max = np.nanmax(Xi)ax.contour(Xi, Yi, Zi, zdir='x', offset=x_min, cmap='plasma', linewidths=0.6)cbar = fig.colorbar(surf, ax=ax, shrink=0.5, aspect=10, pad=0.1)cbar.set_label('响应值 Z', fontsize=9)ax.set_xlabel('X')ax.set_ylabel('Y')ax.set_zlabel('Z')ax.set_xlim(x_min, x_max)ax.set_ylim(y_min, y_max)ax.set_zlim(z_min, z_max)ax.set_title('三维曲面 + 三平面等高线投影', fontsize=10)plt.tight_layout()plt.show()fig.savefig('三维曲面_三平面投影.pdf', bbox_inches='tight', pad_inches=0.05)fig.savefig('三维曲面_三平面投影.png', bbox_inches='tight', pad_inches=0.05)
执行结果分析:
  • 三个正交平面上的投影等高线提供了X-Y、X-Z、Y-Z三个视角的二维信息。
  • 适用于展示多变量函数沿各坐标轴的变化趋势。
  • 需注意投影平面不要相互遮挡,适当调整偏移量。

进阶3:三维等高线

使用contour直接在三维曲面上绘制等高线(需将等高线投影到曲面表面,而非平面)。

import pandas as pdimport numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3Dfrom scipy.interpolate import griddatadefset_academic_style():    plt.rcParams['font.family'] = ['Times New Roman''SimSun']    plt.rcParams['font.size'] = 9    plt.rcParams['axes.unicode_minus'] = False    plt.rcParams['axes.linewidth'] = 1.0    plt.rcParams['xtick.major.width'] = 1.0    plt.rcParams['ytick.major.width'] = 1.0    plt.rcParams['xtick.major.size'] = 3.5    plt.rcParams['ytick.major.size'] = 3.5    plt.rcParams['xtick.direction'] = 'in'    plt.rcParams['ytick.direction'] = 'in'    plt.rcParams['legend.frameon'] = False    plt.rcParams['pdf.fonttype'] = 42    plt.rcParams['savefig.dpi'] = 300set_academic_style()df = pd.read_csv('三维散点数据.csv')x, y, z = df['X'].values, df['Y'].values, df['Z'].valuesxi = np.linspace(x.min(), x.max(), 50)yi = np.linspace(y.min(), y.max(), 50)Xi, Yi = np.meshgrid(xi, yi)Zi = griddata((x, y), z, (Xi, Yi), method='cubic')fig = plt.figure(figsize=(6.05.0))ax = fig.add_subplot(111, projection='3d')surf = ax.plot_surface(Xi, Yi, Zi, cmap='coolwarm', alpha=0.6, linewidth=0)# 在曲面上绘制等高线(提升z值微小偏移避免渲染冲突)levels = np.linspace(Zi.min(), Zi.max(), 8)ax.contour(Xi, Yi, Zi, levels=levels, colors='black', linewidths=0.8)cbar = fig.colorbar(surf, ax=ax, shrink=0.5, aspect=10, pad=0.1)cbar.set_label('响应值 Z', fontsize=9)ax.set_xlabel('X')ax.set_ylabel('Y')ax.set_zlabel('Z')ax.set_title('三维曲面 + 曲面等高线', fontsize=10)plt.tight_layout()plt.show()fig.savefig('三维曲面_曲面等高线.pdf', bbox_inches='tight', pad_inches=0.05)fig.savefig('三维曲面_曲面等高线.png', bbox_inches='tight', pad_inches=0.05)

执行结果分析:

  • 黑色等高线直接缠绕在曲面上,清晰标示出等值区域。
  • 半透明曲面使等高线可见,同时保留颜色信息。
  • 需注意等高线可能与曲面渲染产生Z-fighting,可通过微调渲染顺序改善。

进阶4:组合图:三维曲面 + 二维填充等高线子图

将三维视图与独立的二维等高线图组合在同一个Figure中,使用GridSpec布局。

import pandas as pdimport numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3Dfrom scipy.interpolate import griddatafrom matplotlib.gridspec import GridSpecdefset_academic_style():    plt.rcParams['font.family'] = ['Times New Roman''SimSun']    plt.rcParams['font.size'] = 9    plt.rcParams['axes.unicode_minus'] = False    plt.rcParams['axes.linewidth'] = 1.0    plt.rcParams['xtick.major.width'] = 1.0    plt.rcParams['ytick.major.width'] = 1.0    plt.rcParams['xtick.major.size'] = 3.5    plt.rcParams['ytick.major.size'] = 3.5    plt.rcParams['xtick.direction'] = 'in'    plt.rcParams['ytick.direction'] = 'in'    plt.rcParams['legend.frameon'] = False    plt.rcParams['pdf.fonttype'] = 42    plt.rcParams['savefig.dpi'] = 300set_academic_style()df = pd.read_csv('三维散点数据.csv')x, y, z = df['X'].values, df['Y'].values, df['Z'].valuesxi = np.linspace(x.min(), x.max(), 50)yi = np.linspace(y.min(), y.max(), 50)Xi, Yi = np.meshgrid(xi, yi)Zi = griddata((x, y), z, (Xi, Yi), method='cubic')fig = plt.figure(figsize=(8.04.5))gs = GridSpec(12, width_ratios=[1.51], wspace=0.05)# 左侧:三维曲面ax1 = fig.add_subplot(gs[0], projection='3d')surf = ax1.plot_surface(Xi, Yi, Zi, cmap='viridis', linewidth=0, antialiased=True)z_min = np.nanmin(Zi)-2z_max = np.nanmax(Zi)ax1.contourf(Xi, Yi, Zi, zdir='z', offset=z_min, cmap='viridis', alpha=0.5, levels=15)ax1.set_xlabel('X')ax1.set_ylabel('Y')ax1.set_zlabel('Z')ax1.set_zlim(z_min, z_max)ax1.set_title('三维响应曲面', fontsize=10)# 右侧:二维填充等高线ax2 = fig.add_subplot(gs[1])cf = ax2.contourf(Xi, Yi, Zi, levels=20, cmap='viridis')ax2.contour(Xi, Yi, Zi, levels=8, colors='black', linewidths=0.4)ax2.set_xlabel('X')ax2.set_ylabel('Y')ax2.set_aspect('equal')ax2.set_title('二维等高线图', fontsize=10)# 共享颜色条cbar_ax = fig.add_axes([0.920.150.0150.7])fig.colorbar(cf, cax=cbar_ax, label='响应值 Z')plt.tight_layout(rect=[000.911])plt.show()fig.savefig('三维曲面_组合二维等高线.pdf', bbox_inches='tight', pad_inches=0.05)fig.savefig('三维曲面_组合二维等高线.png', bbox_inches='tight', pad_inches=0.05)
执行结果分析:
  • 左三维右二维的布局兼顾了立体感和精确数值读取。
  • 右侧等高线图可清晰展示响应面的峰谷位置,便于标注最优区域。
  • 共享颜色条确保两图色彩映射完全一致。

实操任务4:调整三维坐标轴长宽比,匹配物理空间比例,优化坐标轴标签与刻度样式

本任务聚焦三维坐标轴的美化与物理比例校正,包括等比例缩放、刻度格式化、标签旋转、背景样式及多子图统一比例。

基础版:设置坐标轴等比例(set_box_aspect)

使用set_box_aspect使X、Y、Z三个轴的单位长度在屏幕上相等。

import pandas as pdimport numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3Dfrom scipy.interpolate import griddatadefset_academic_style():    plt.rcParams['font.family'] = ['Times New Roman''SimSun']    plt.rcParams['font.size'] = 9    plt.rcParams['axes.unicode_minus'] = False    plt.rcParams['axes.linewidth'] = 1.0    plt.rcParams['xtick.major.width'] = 1.0    plt.rcParams['ytick.major.width'] = 1.0    plt.rcParams['xtick.major.size'] = 3.5    plt.rcParams['ytick.major.size'] = 3.5    plt.rcParams['xtick.direction'] = 'in'    plt.rcParams['ytick.direction'] = 'in'    plt.rcParams['legend.frameon'] = False    plt.rcParams['pdf.fonttype'] = 42    plt.rcParams['savefig.dpi'] = 300set_academic_style()df = pd.read_csv('三维散点数据.csv')x, y, z = df['X'].values, df['Y'].values, df['Z'].valuesxi = np.linspace(x.min(), x.max(), 40)yi = np.linspace(y.min(), y.max(), 40)Xi, Yi = np.meshgrid(xi, yi)Zi = griddata((x, y), z, (Xi, Yi), method='cubic')fig = plt.figure(figsize=(6.05.0))ax = fig.add_subplot(111, projection='3d')surf = ax.plot_surface(Xi, Yi, Zi, cmap='viridis', linewidth=0, alpha=0.9)# 设置等比例(X:Y:Z = 1:1:1)ax.set_box_aspect([111])cbar = fig.colorbar(surf, ax=ax, shrink=0.5, aspect=10, pad=0.1)cbar.set_label('响应值 Z', fontsize=9)ax.set_xlabel('X (mm)')ax.set_ylabel('Y (mm)')ax.set_zlabel('Z (μm)')ax.set_title('三维曲面(等比例坐标轴)', fontsize=10)plt.tight_layout()plt.show()fig.savefig('三维坐标轴_等比例.pdf', bbox_inches='tight', pad_inches=0.05)fig.savefig('三维坐标轴_等比例.png', bbox_inches='tight', pad_inches=0.05)

执行结果分析:

  • set_box_aspect([1,1,1])强制三个轴在屏幕上的物理长度相等,避免因数据范围不同导致的扭曲。
  • 若数据范围差异大,等比例可能导致某些轴显得空旷或压缩,此时可根据实际物理尺寸设置比例(如[1,1,2])。
  • 适用于需要真实反映空间几何形状的场景。

进阶1:根据数据范围自动设置合理比例

当X、Y、Z数据范围差异较大时,可设置比例使视觉效果平衡,同时标注物理单位。

import pandas as pdimport numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3Dfrom scipy.interpolate import griddatadefset_academic_style():    plt.rcParams['font.family'] = ['Times New Roman''SimSun']    plt.rcParams['font.size'] = 9    plt.rcParams['axes.unicode_minus'] = False    plt.rcParams['axes.linewidth'] = 1.0    plt.rcParams['xtick.major.width'] = 1.0    plt.rcParams['ytick.major.width'] = 1.0    plt.rcParams['xtick.major.size'] = 3.5    plt.rcParams['ytick.major.size'] = 3.5    plt.rcParams['xtick.direction'] = 'in'    plt.rcParams['ytick.direction'] = 'in'    plt.rcParams['legend.frameon'] = False    plt.rcParams['pdf.fonttype'] = 42    plt.rcParams['savefig.dpi'] = 300set_academic_style()df = pd.read_csv('三维散点数据.csv')x, y, z = df['X'].values, df['Y'].values, df['Z'].values# 模拟物理尺寸:X范围6,Y范围6,Z范围~15,希望视觉上Z轴压缩一点xi = np.linspace(x.min(), x.max(), 40)yi = np.linspace(y.min(), y.max(), 40)Xi, Yi = np.meshgrid(xi, yi)Zi = griddata((x, y), z, (Xi, Yi), method='cubic')fig = plt.figure(figsize=(6.05.0))ax = fig.add_subplot(111, projection='3d')surf = ax.plot_surface(Xi, Yi, Zi, cmap='viridis', linewidth=0, alpha=0.9)# 计算各轴数据范围x_range = x.max() - x.min()y_range = y.max() - y.min()z_range = z.max() - z.min()# 设置比例:让Z轴视觉上略短(如Z轴范围为X的2倍,但视觉比例设为1:1:0.8)ax.set_box_aspect([110.8 * z_range / x_range])cbar = fig.colorbar(surf, ax=ax, shrink=0.5, aspect=10, pad=0.1)cbar.set_label('响应值 Z', fontsize=9)ax.set_xlabel('X (mm)')ax.set_ylabel('Y (mm)')ax.set_zlabel('Z (μm)')ax.set_title('三维曲面(自定义视觉比例)', fontsize=10)plt.tight_layout()plt.show()fig.savefig('三维坐标轴_自定义比例.pdf', bbox_inches='tight', pad_inches=0.05)fig.savefig('三维坐标轴_自定义比例.png', bbox_inches='tight', pad_inches=0.05)

执行结果分析:

  • 通过计算数据范围并设定box_aspect,可灵活控制各轴在屏幕上的长度比例。
  • 本例中若Z范围是X的2.5倍,但设置比例因子0.8使Z轴视觉上不至于过长。
  • 需在标题或图注中说明各轴物理单位,避免误解。

进阶2:自定义刻度格式与标签旋转

使用tick_paramsset_xticklabels优化刻度显示,如添加单位、旋转长标签。

import pandas as pdimport numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3Dfrom scipy.interpolate import griddatadefset_academic_style():    plt.rcParams['font.family'] = ['Times New Roman''SimSun']    plt.rcParams['font.size'] = 9    plt.rcParams['axes.unicode_minus'] = False    plt.rcParams['axes.linewidth'] = 1.0    plt.rcParams['xtick.major.width'] = 1.0    plt.rcParams['ytick.major.width'] = 1.0    plt.rcParams['xtick.major.size'] = 3.5    plt.rcParams['ytick.major.size'] = 3.5    plt.rcParams['xtick.direction'] = 'in'    plt.rcParams['ytick.direction'] = 'in'    plt.rcParams['legend.frameon'] = False    plt.rcParams['pdf.fonttype'] = 42    plt.rcParams['savefig.dpi'] = 300set_academic_style()df = pd.read_csv('三维散点数据.csv')x, y, z = df['X'].values, df['Y'].values, df['Z'].valuesxi = np.linspace(x.min(), x.max(), 40)yi = np.linspace(y.min(), y.max(), 40)Xi, Yi = np.meshgrid(xi, yi)Zi = griddata((x, y), z, (Xi, Yi), method='cubic')fig = plt.figure(figsize=(6.05.0))ax = fig.add_subplot(111, projection='3d')surf = ax.plot_surface(Xi, Yi, Zi, cmap='coolwarm', linewidth=0, alpha=0.9)# 自定义刻度:保留2位小数,并添加单位符号ax.xaxis.set_major_formatter(plt.FuncFormatter(lambda val, pos: f'{val:.1f} m'))ax.yaxis.set_major_formatter(plt.FuncFormatter(lambda val, pos: f'{val:.1f} m'))ax.zaxis.set_major_formatter(plt.FuncFormatter(lambda val, pos: f'{val:.1f} Pa'))# 调整刻度标签字体大小和颜色ax.tick_params(axis='both', labelsize=8, colors='#333333')# 旋转X轴标签(3D中需谨慎,可能重叠)for label in ax.get_xticklabels():    label.set_rotation(20)ax.set_xlabel('X (m)', fontsize=9, labelpad=8)ax.set_ylabel('Y (m)', fontsize=9, labelpad=8)ax.set_zlabel('压力 (Pa)', fontsize=9, labelpad=8)ax.set_title('自定义刻度与标签样式', fontsize=10)cbar = fig.colorbar(surf, ax=ax, shrink=0.5, aspect=10, pad=0.12)cbar.ax.yaxis.set_major_formatter(plt.FuncFormatter(lambda val, pos: f'{val:.1f}'))cbar.set_label('压力 (Pa)', fontsize=9)plt.tight_layout()plt.show()fig.savefig('三维坐标轴_刻度格式化.pdf', bbox_inches='tight', pad_inches=0.05)fig.savefig('三维坐标轴_刻度格式化.png', bbox_inches='tight', pad_inches=0.05)

执行结果分析:

  • 使用FuncFormatter自定义刻度标签格式,可添加单位、控制小数位数。
  • 标签旋转有助于避免长文本重叠,但在3D图中需适度。
  • 颜色条的刻度也可单独格式化,保持整体风格统一。

进阶3:移除背景网格与面板

去除三维坐标轴的背景面板和网格线,仅保留坐标轴线和标签,获得极简视觉效果。

import pandas as pdimport numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3Dfrom scipy.interpolate import griddatadefset_academic_style():    plt.rcParams['font.family'] = ['Times New Roman''SimSun']    plt.rcParams['font.size'] = 9    plt.rcParams['axes.unicode_minus'] = False    plt.rcParams['axes.linewidth'] = 1.0    plt.rcParams['xtick.major.width'] = 1.0    plt.rcParams['ytick.major.width'] = 1.0    plt.rcParams['xtick.major.size'] = 3.5    plt.rcParams['ytick.major.size'] = 3.5    plt.rcParams['xtick.direction'] = 'in'    plt.rcParams['ytick.direction'] = 'in'    plt.rcParams['legend.frameon'] = False    plt.rcParams['pdf.fonttype'] = 42    plt.rcParams['savefig.dpi'] = 300set_academic_style()df = pd.read_csv('三维散点数据.csv')x, y, z = df['X'].values, df['Y'].values, df['Z'].valuesxi = np.linspace(x.min(), x.max(), 40)yi = np.linspace(y.min(), y.max(), 40)Xi, Yi = np.meshgrid(xi, yi)Zi = griddata((x, y), z, (Xi, Yi), method='cubic')fig = plt.figure(figsize=(6.05.0))ax = fig.add_subplot(111, projection='3d')surf = ax.plot_surface(Xi, Yi, Zi, cmap='plasma', linewidth=0, alpha=0.9)# 移除背景面板(设为白色或透明)ax.xaxis.pane.fill = Falseax.yaxis.pane.fill = Falseax.zaxis.pane.fill = False# 移除网格线ax.grid(False)# 可保留坐标轴线ax.xaxis.line.set_color('black')ax.yaxis.line.set_color('black')ax.zaxis.line.set_color('black')ax.set_xlabel('X')ax.set_ylabel('Y')ax.set_zlabel('Z')ax.set_title('极简风格三维曲面', fontsize=10)cbar = fig.colorbar(surf, ax=ax, shrink=0.5, aspect=10, pad=0.1)cbar.set_label('响应值 Z', fontsize=9)plt.tight_layout()plt.show()fig.savefig('三维坐标轴_极简风格.pdf', bbox_inches='tight', pad_inches=0.05)fig.savefig('三维坐标轴_极简风格.png', bbox_inches='tight', pad_inches=0.05)

执行结果分析:

  • pane.fill = False使三个坐标平面透明,仅显示坐标轴线。
  • grid(False)移除网格线,画面更加干净。
  • 极简风格适合用于演示或强调曲面本身,减少视觉干扰。

进阶4:多子图共享视角与比例

在多个三维子图中,设置相同的视角、坐标轴比例和范围,确保可比较性。

import pandas as pdimport numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3Dfrom scipy.interpolate import griddatadefset_academic_style():    plt.rcParams['font.family'] = ['Times New Roman''SimSun']    plt.rcParams['font.size'] = 9    plt.rcParams['axes.unicode_minus'] = False    plt.rcParams['axes.linewidth'] = 1.0    plt.rcParams['xtick.major.width'] = 1.0    plt.rcParams['ytick.major.width'] = 1.0    plt.rcParams['xtick.major.size'] = 3.5    plt.rcParams['ytick.major.size'] = 3.5    plt.rcParams['xtick.direction'] = 'in'    plt.rcParams['ytick.direction'] = 'in'    plt.rcParams['legend.frameon'] = False    plt.rcParams['pdf.fonttype'] = 42    plt.rcParams['savefig.dpi'] = 300set_academic_style()df = pd.read_csv('三维散点数据.csv')x, y, z = df['X'].values, df['Y'].values, df['Z'].valuesxi = np.linspace(x.min(), x.max(), 35)yi = np.linspace(y.min(), y.max(), 35)Xi, Yi = np.meshgrid(xi, yi)Zi = griddata((x, y), z, (Xi, Yi), method='cubic')# 模拟不同平滑程度的曲面(改变插值方法或平滑参数)Zi2 = griddata((x, y), z, (Xi, Yi), method='linear')Zi3 = griddata((x, y), z, (Xi, Yi), method='nearest')data_list = [(Zi, 'cubic'), (Zi2, 'linear'), (Zi3, 'nearest')]fig = plt.figure(figsize=(12.04.0))for i, (Z_data, method) in enumerate(data_list):    ax = fig.add_subplot(13, i+1, projection='3d')    surf = ax.plot_surface(Xi, Yi, Z_data, cmap='viridis', linewidth=0, alpha=0.9)    ax.set_xlabel('X')    ax.set_ylabel('Y')    ax.set_zlabel('Z')    ax.set_title(f'插值方法: {method}', fontsize=10)# 统一视角    ax.view_init(elev=25, azim=-60)# 统一坐标轴范围    ax.set_xlim(x.min(), x.max())    ax.set_ylim(y.min(), y.max())    ax.set_zlim(z.min()-1, z.max()+1)# 统一比例    ax.set_box_aspect([110.8])# 共享颜色条cbar_ax = fig.add_axes([0.920.150.0150.7])norm = plt.Normalize(z.min(), z.max())sm = plt.cm.ScalarMappable(cmap='viridis', norm=norm)sm.set_array([])fig.colorbar(sm, cax=cbar_ax, label='响应值 Z')plt.tight_layout(rect=[000.911])plt.show()fig.savefig('三维坐标轴_多子图统一.pdf', bbox_inches='tight', pad_inches=0.05)fig.savefig('三维坐标轴_多子图统一.png', bbox_inches='tight', pad_inches=0.05)

执行结果分析:

  • 三个子图采用相同的视角、坐标轴范围和比例,使插值方法差异成为唯一变量,便于公平对比。
  • 统一颜色条确保色彩含义一致。
  • 适用于方法比较或参数敏感性分析的可视化。

- END -

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-04 10:34:19 HTTP/2.0 GET : https://f.mffb.com.cn/a/487616.html
  2. 运行时间 : 0.137623s [ 吞吐率:7.27req/s ] 内存消耗:4,858.51kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=eec80f8e5f3c8a1e28cab495ed9453d4
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000400s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000630s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000743s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000328s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000580s ]
  6. SELECT * FROM `set` [ RunTime:0.000234s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000670s ]
  8. SELECT * FROM `article` WHERE `id` = 487616 LIMIT 1 [ RunTime:0.001178s ]
  9. UPDATE `article` SET `lasttime` = 1783132459 WHERE `id` = 487616 [ RunTime:0.032612s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.000442s ]
  11. SELECT * FROM `article` WHERE `id` < 487616 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000500s ]
  12. SELECT * FROM `article` WHERE `id` > 487616 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000471s ]
  13. SELECT * FROM `article` WHERE `id` < 487616 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.000915s ]
  14. SELECT * FROM `article` WHERE `id` < 487616 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.006581s ]
  15. SELECT * FROM `article` WHERE `id` < 487616 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.015187s ]
0.140336s