当前位置:首页>python>《15节课Python绘图从入门到精通》7——二维场与等高线实操

《15节课Python绘图从入门到精通》7——二维场与等高线实操

  • 2026-06-21 21:52:42
《15节课Python绘图从入门到精通》7——二维场与等高线实操

前置数据准备

为保证所有程序可直接运行,先运行以下代码生成本节所需的各类模拟数据。

import numpy as npimport pandas as pdfrom scipy.interpolate import griddatanp.random.seed(2024)# ---------- 7.1 格点化温度/压力数据 ----------# 生成60x80的网格,模拟矩形区域内的温度分布(带热源)x = np.linspace(01080)y = np.linspace(0660)X, Y = np.meshgrid(x, y)# 两个热源产生的温度场叠加T = ( 80 * np.exp(-((X-3)**2 + (Y-2)**2)/4) +60 * np.exp(-((X-7)**2 + (Y-4)**2)/3) +25 + 2*X + 1.5*Y )# 添加少量噪声模拟真实测量T += np.random.normal(00.5, T.shape)# 压力场(与温度相关,但分布不同)P = 101325 + 12 * T + 50 * np.sin(X) * np.cos(Y)# 保存为CSV(长格式)及NumPy数组df_temp = pd.DataFrame({'x': X.flatten(), 'y': Y.flatten(), '温度': T.flatten(), '压力': P.flatten()})df_temp.to_csv('格点温度压力数据.csv', index=False, encoding='utf-8-sig')# 同时保存网格坐标便于快速读取np.savez('grid_T_P.npz', x=x, y=y, T=T, P=P)# ---------- 7.2 模拟电镜图像强度矩阵 ----------# 生成512x512的模拟图像:多个高斯斑 + 背景噪声size = 512x_img = np.linspace(-55, size)y_img = np.linspace(-55, size)X_img, Y_img = np.meshgrid(x_img, y_img)# 几个粒子(高斯斑)I = ( 200 * np.exp(-((X_img+1.5)**2 + (Y_img-1)**2)/0.8) +180 * np.exp(-((X_img-2)**2 + (Y_img+1.5)**2)/1.2) +150 * np.exp(-((X_img+0.5)**2 + (Y_img+2.5)**2)/0.6) +220 * np.exp(-((X_img-1)**2 + (Y_img-2)**2)/1.0) )# 背景渐变和噪声I += 30 + 5*X_img + 3*Y_imgI += np.random.normal(08, I.shape)I = np.clip(I, 0255).astype(np.uint8)np.save('电镜图像强度.npy', I)# ---------- 7.3 非结构化三角网格数据 ----------# 在圆形区域内生成随机点,构造Delaunay三角网格from scipy.spatial import Delaunayn_points = 800theta = np.random.uniform(02*np.pi, n_points)r = np.sqrt(np.random.uniform(01, n_points)) * 5# 圆内均匀分布x_unst = r * np.cos(theta)y_unst = r * np.sin(theta)# 模拟物理场:中心高、边缘低的径向函数z_unst = 100 * np.exp(-r**2 / 4) + 20 * np.cos(3*theta) * np.exp(-r/2)# 创建三角剖分对象tri = Delaunay(np.column_stack([x_unst, y_unst]))np.savez('非结构网格数据.npz', x=x_unst, y=y_unst, z=z_unst, simplices=tri.simplices)print("数据生成完成:")print("- 格点温度压力数据.csv / grid_T_P.npz(7.1节用)")print("- 电镜图像强度.npy(7.2节用)")print("- 非结构网格数据.npz(7.3节用)")

执行结果分析:

npz格式可以保存多个数组,便于一次性读取多个变量。

npz文件在读取时,不需要知道每个变量的名称,只需知道其索引位置,方便后续处理。

实操任务1:读取格点化温度/压力数据,绘制填充等高线图,标注等值线数值与单位

本任务从基础的contourf填充等高线入手,逐步进阶到等值线标注、自定义色阶、叠加流线及多子图对比。

基础版:读取网格数据,绘制填充等高线图

程序读取格点数据,使用contourf绘制温度填充图,并添加颜色条。

import numpy as npimport matplotlib.pyplot as plt# 学术样式设置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'] = 300set_academic_style()# 读取数据(使用npz格式快速加载)data = np.load('grid_T_P.npz')x = data['x']y = data['y']T = data['T']X, Y = np.meshgrid(x, y)fig, ax = plt.subplots(figsize=(5.03.5))# 绘制填充等高线cf = ax.contourf(X, Y, T, levels=15, cmap='hot', alpha=0.9)# 添加颜色条cbar = plt.colorbar(cf, ax=ax)cbar.set_label('温度 (°C)', fontsize=9)ax.set_xlabel('x (m)')ax.set_ylabel('y (m)')ax.set_aspect('equal')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)

执行结果分析:

contourf根据levels=15生成15个颜色等级,平滑展示温度从低温(深红)到高温(亮黄)的渐变。

两个热源中心清晰可见,坐标轴比例一致,符合物理场可视化规范。

颜色条带标签,读者可快速对应数值范围。

进阶1:叠加等值线并标注数值(clabel)

在填充等高线基础上,叠加黑色等值线并用clabel标注具体温度值。

import numpy as npimport matplotlib.pyplot as pltdefset_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()data = np.load('grid_T_P.npz')x, y, T = data['x'], data['y'], data['T']X, Y = np.meshgrid(x, y)fig, ax = plt.subplots(figsize=(5.03.8))# 填充等高线cf = ax.contourf(X, Y, T, levels=15, cmap='hot', alpha=0.85)# 绘制等值线(黑色)contour_lines = ax.contour(X, Y, T, levels=10, colors='black', linewidths=0.6)# 标注等值线数值(内嵌于线上)ax.clabel(contour_lines, inline=True, fontsize=7, fmt='%1.0f °C')cbar = plt.colorbar(cf, ax=ax)cbar.set_label('温度 (°C)', fontsize=9)ax.set_xlabel('x (m)')ax.set_ylabel('y (m)')ax.set_aspect('equal')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)

执行结果分析:

等值线叠加使温度梯度更清晰,线上标注的数值便于定量读取。

inline=True使标签嵌入线条内部,自动避开线交叉处,美观整洁。

可调整levels数量控制等值线疏密。

进阶2:自定义离散色阶与非线性间距

根据温度范围自定义离散颜色映射,并设置非线性间隔的等值线(如按指数或分位数)。

import numpy as npimport matplotlib.pyplot as pltimport 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'] = 300set_academic_style()data = np.load('grid_T_P.npz')x, y, T = data['x'], data['y'], data['T']X, Y = np.meshgrid(x, y)# 自定义色阶:从蓝到红,中间白色(发散色盘)colors = ['#053061''#2166AC''#4393C3''#92C5DE''#D1E5F0','#F7F7F7','#FDDBC7''#F4A582''#D6604D''#B2182B''#67001F']cmap_custom = mcolors.LinearSegmentedColormap.from_list('custom_div', colors, N=256)# 非线性等值线间隔:低值区密,高值区疏t_min, t_max = T.min(), T.max()levels = np.concatenate([np.linspace(t_min, 508), np.linspace(50, t_max, 5)[1:]])fig, ax = plt.subplots(figsize=(5.03.8))cf = ax.contourf(X, Y, T, levels=levels, cmap=cmap_custom, extend='both')contour_lines = ax.contour(X, Y, T, levels=levels, colors='black', linewidths=0.4)ax.clabel(contour_lines, inline=True, fontsize=6, fmt='%1.0f')cbar = plt.colorbar(cf, ax=ax, ticks=levels[::2])cbar.set_label('温度 (°C)', fontsize=9)ax.set_xlabel('x (m)')ax.set_ylabel('y (m)')ax.set_aspect('equal')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)

执行结果分析:

发散色盘突出中间温度区域,适合展示相对于临界值的偏差。

非线性levels使低温区域(细节丰富)等值线更密,高温区域稀疏,突出物理关注区。

extend='both'在颜色条两端添加箭头,表示超出范围的值。

进阶3:叠加流线(streamplot)展示梯度方向

在温度场图上叠加流线,用箭头表示热流方向(负梯度方向)。

import numpy as npimport matplotlib.pyplot as pltdefset_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()data = np.load('grid_T_P.npz')x, y, T = data['x'], data['y'], data['T']X, Y = np.meshgrid(x, y)# 计算梯度(中心差分)dy, dx = np.gradient(-T, y, x)  # 负梯度方向为热流方向fig, ax = plt.subplots(figsize=(5.03.8))cf = ax.contourf(X, Y, T, levels=15, cmap='hot', alpha=0.8)# 流线图ax.streamplot(X, Y, dx, dy, color='white', linewidth=0.8, density=1.2, arrowsize=0.8)cbar = plt.colorbar(cf, ax=ax)cbar.set_label('温度 (°C)', fontsize=9)ax.set_xlabel('x (m)')ax.set_ylabel('y (m)')ax.set_aspect('equal')plt.tight_layout()plt.show()fig.savefig('温度场流线叠加.pdf', dpi = 600,bbox_inches='tight', pad_inches=0.05)fig.savefig('温度场流线叠加.png', dpi = 600,bbox_inches='tight', pad_inches=0.05)

执行结果分析:

白色流线清晰指示热量从高温区向低温区传递的方向。

流线密度和箭头大小可通过参数调整,避免遮盖背景色块。

适用于热传导、流体力学仿真结果的可视化。

进阶4:双变量子图对比(温度 vs 压力)

并排绘制温度和压力的填充等高线图,共享坐标轴,便于对比两种物理场。

import numpy as npimport matplotlib.pyplot as pltdefset_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()data = np.load('grid_T_P.npz')x, y, T, P = data['x'], data['y'], data['T'], data['P']X, Y = np.meshgrid(x, y)fig, (ax1, ax2) = plt.subplots(12, figsize=(8.03.5), sharex=True, sharey=True)# 温度图cf1 = ax1.contourf(X, Y, T, levels=15, cmap='hot')contour1 = ax1.contour(X, Y, T, levels=8, colors='black', linewidths=0.5)ax1.clabel(contour1, inline=True, fontsize=6, fmt='%1.0f')ax1.set_title('温度场', fontsize=10)ax1.set_xlabel('x (m)')ax1.set_ylabel('y (m)')cbar1 = plt.colorbar(cf1, ax=ax1, fraction=0.046, pad=0.04)cbar1.set_label('°C', fontsize=8)# 压力图cf2 = ax2.contourf(X, Y, P/1000, levels=15, cmap='viridis')  # 转换为kPacontour2 = ax2.contour(X, Y, P/1000, levels=8, colors='white', linewidths=0.5)ax2.clabel(contour2, inline=True, fontsize=6, fmt='%1.0f')ax2.set_title('压力场', fontsize=10)ax2.set_xlabel('x (m)')cbar2 = plt.colorbar(cf2, ax=ax2, fraction=0.046, pad=0.04)cbar2.set_label('kPa', fontsize=8)plt.tight_layout()plt.show()fig.savefig('温度压力对比图.pdf',dpi = 600, bbox_inches='tight', pad_inches=0.05)fig.savefig('温度压力对比图.png',dpi = 600, bbox_inches='tight', pad_inches=0.05)

执行结果分析:

温度与压力场分布有明显差异,压力场受正弦波动影响呈现波纹状。

共享坐标轴使空间位置对齐,便于交叉参照。

各子图独立颜色条,避免色阶混淆。

实操任务2:用imshow显示电镜/显微镜图像强度矩阵,选择合适colormap,调整亮度对比度

本任务聚焦图像数据的二维显示,从基础灰度显示到伪彩色、直方图均衡、局部对比度增强及标注比例尺。

基础版:imshow显示强度矩阵(灰度图)

读取之前保存的模拟电镜图像,用灰度色显示。

import numpy as npimport matplotlib.pyplot as pltdefset_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()img = np.load('电镜图像强度.npy')fig, ax = plt.subplots(figsize=(4.54.5))im = ax.imshow(img, cmap='gray', extent=[-55-55], origin='lower')cbar = plt.colorbar(im, ax=ax, fraction=0.046, pad=0.04)cbar.set_label('强度 (a.u.)', fontsize=9)ax.set_xlabel('x (μm)')ax.set_ylabel('y (μm)')ax.set_aspect('equal')plt.tight_layout()plt.show()fig.savefig('电镜图像_灰度.pdf', dpi = 600,bbox_inches='tight', pad_inches=0.05)fig.savefig('电镜图像_灰度.png', dpi = 600,bbox_inches='tight', pad_inches=0.05)

执行结果分析:

cmap='gray'显示标准灰度图像,模拟TEM/SEM图像。

extent参数将像素索引映射到物理坐标(-5~5 μm),便于添加比例尺。

origin='lower'使图像y轴从下往上递增,符合笛卡尔坐标习惯。

进阶1:伪彩色映射与colormap选择

对比不同colormap对图像细节的呈现效果,选择适合科学可视化的色盘。

import numpy as npimport matplotlib.pyplot as pltdefset_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()img = np.load('电镜图像强度.npy')# 定义几种常用colormapcmaps = ['gray''viridis''plasma''inferno''cividis']fig, axes = plt.subplots(23, figsize=(9.06.0))axes = axes.flatten()for i, cmap_name in enumerate(cmaps):if i < len(axes):        ax = axes[i]        im = ax.imshow(img, cmap=cmap_name, extent=[-55-55], origin='lower')        ax.set_title(cmap_name, fontsize=10)        ax.set_xlabel('x (μm)')        ax.set_ylabel('y (μm)')        plt.colorbar(im, ax=ax, fraction=0.046, pad=0.04)# 隐藏多余子图for j in range(len(cmaps), len(axes)):    axes[j].axis('off')plt.tight_layout()plt.show()fig.savefig('电镜图像_伪彩色对比.pdf',  dpi = 600,bbox_inches='tight', pad_inches=0.05)fig.savefig('电镜图像_伪彩色对比.png',  dpi = 600,bbox_inches='tight', pad_inches=0.05)

执行结果分析:

gray适合强度直接观察;viridiscividis为色盲友好型,推荐用于论文。

infernoplasma对比度高,适合突出高亮区域。

选择colormap应避免使用jet(彩虹色),因其感知不均匀且对色盲不友好。

进阶2:调整亮度与对比度(线性拉伸与Gamma校正)

通过设置vminvmax或应用Gamma变换增强图像局部细节。

import numpy as npimport matplotlib.pyplot as pltfrom skimage import exposure # pip install scikit-imagedefset_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()img = np.load('电镜图像强度.npy')# 1. 线性对比度拉伸(2%~98%百分位)p2, p98 = np.percentile(img, (298))img_stretch = exposure.rescale_intensity(img, in_range=(p2, p98))# 2. Gamma校正gamma = 0.6img_gamma = exposure.adjust_gamma(img, gamma=gamma)fig, axes = plt.subplots(13, figsize=(9.03.2))for ax, data, title in zip(axes, [img, img_stretch, img_gamma],                           ['原始图像'f'对比度拉伸\n(2%~98%)'f'Gamma校正\n(γ={gamma})']):    im = ax.imshow(data, cmap='gray', extent=[-55-55], origin='lower')    ax.set_title(title, fontsize=10)    ax.set_xlabel('x (μm)')    ax.set_ylabel('y (μm)')    plt.colorbar(im, ax=ax, fraction=0.046, pad=0.04)plt.tight_layout()plt.show()fig.savefig('电镜图像_对比度调整.pdf', dpi = 600,  bbox_inches='tight', pad_inches=0.05)fig.savefig('电镜图像_对比度调整.png',  dpi = 600, bbox_inches='tight', pad_inches=0.05)

执行结果分析:

对比度拉伸去除了极端值影响,增强了中间灰度层次。

Gamma校正()提升暗部细节,使低强度粒子更清晰。

调整后图像更易于识别微弱特征,是电镜图像处理的常规步骤。

进阶3:局部对比度增强(CLAHE自适应直方图均衡)

使用限制对比度自适应直方图均衡(CLAHE)改善局部对比度,同时抑制噪声放大。

import numpy as npimport matplotlib.pyplot as pltfrom skimage import exposuredefset_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()img = np.load('电镜图像强度.npy')# CLAHEimg_clahe = exposure.equalize_adapthist(img, clip_limit=0.03)fig, axes = plt.subplots(12, figsize=(6.53.5))ax1, ax2 = axesim1 = ax1.imshow(img, cmap='gray', extent=[-55-55], origin='lower')ax1.set_title('原始图像', fontsize=10)plt.colorbar(im1, ax=ax1, fraction=0.046, pad=0.04)im2 = ax2.imshow(img_clahe, cmap='gray', extent=[-55-55], origin='lower')ax2.set_title('CLAHE增强', fontsize=10)plt.colorbar(im2, ax=ax2, fraction=0.046, pad=0.04)for ax in axes:    ax.set_xlabel('x (μm)')    ax.set_ylabel('y (μm)')plt.tight_layout()plt.show()fig.savefig('电镜图像_CLAHE.pdf', dpi = 600,bbox_inches='tight', pad_inches=0.05)fig.savefig('电镜图像_CLAHE.png', dpi = 600,bbox_inches='tight', pad_inches=0.05)

执行结果分析:

CLAHE使图像整体亮度均衡,暗区细节显现,同时限制噪声过度放大。

适用于存在光照不均或阴影的电镜/显微镜图像。

处理后图像可能显示更多颗粒边界,有助于后续图像分割。

进阶4:添加比例尺与伪彩色覆盖层

在图像上叠加比例尺条,并将局部区域用伪彩色高亮(如标记高表达区域)。

import numpy as npimport matplotlib.pyplot as pltfrom matplotlib_scalebar.scalebar import ScaleBar #pip install matplotlib-scalebardefset_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()img = np.load('电镜图像强度.npy')fig, ax = plt.subplots(figsize=(5.05.0))im = ax.imshow(img, cmap='gray', extent=[-55-55], origin='lower')# 添加比例尺(需安装 pip install matplotlib-scalebar)scalebar = ScaleBar(1'um', location='lower right', scale_loc='bottom',                    frameon=False, color='white', box_alpha=0)ax.add_artist(scalebar)# 在特定区域覆盖伪彩色(模拟阈值分割结果)threshold = np.percentile(img, 85)mask = img > threshold# 用半透明红色覆盖高亮区域ax.contourf(np.linspace(-55, img.shape[1]), np.linspace(-55, img.shape[0]),            mask, levels=[0.51], colors='red', alpha=0.3)ax.set_xlabel('x (μm)')ax.set_ylabel('y (μm)')plt.tight_layout()plt.show()fig.savefig('电镜图像_比例尺与覆盖层.pdf', dpi = 600, bbox_inches='tight', pad_inches=0.05)fig.savefig('电镜图像_比例尺与覆盖层.png', dpi = 600,bbox_inches='tight', pad_inches=0.05)

执行结果分析:

比例尺条自动根据extent的单位生成,符合学术出版要求。

红色半透明覆盖层标记了高强度区域(前15%),可用于展示感兴趣区域(ROI)。

此技巧常见于电镜图像分析中的粒子识别或缺陷标记。

实操任务3:处理非结构化三角网格模拟数据,绘制光滑伪彩色云图,优化色彩过渡

非结构化网格在有限元分析中极为常见。本任务将演示如何读取三角网格数据,绘制tripcolor云图、进行插值平滑、优化渲染及添加网格线。

基础版:tripcolor绘制三角网格伪彩色图

读取节点坐标和场值,使用tripcolor直接渲染。

import numpy as npimport matplotlib.pyplot as pltimport matplotlib.tri as tridefset_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()data = np.load('非结构网格数据.npz')x = data['x']y = data['y']z = data['z']simplices = data['simplices']# 创建Triangulation对象triang = tri.Triangulation(x, y, simplices)fig, ax = plt.subplots(figsize=(5.04.5))tcf = ax.tripcolor(triang, z, shading='flat', cmap='viridis')cbar = plt.colorbar(tcf, ax=ax, fraction=0.046, pad=0.04)cbar.set_label('场值', fontsize=9)ax.set_xlabel('x')ax.set_ylabel('y')ax.set_aspect('equal')ax.set_title('非结构化网格云图 (flat shading)', fontsize=10)plt.tight_layout()plt.show()fig.savefig('非结构网格_tripcolor_flat.pdf', dpi = 600,bbox_inches='tight', pad_inches=0.05)fig.savefig('非结构网格_tripcolor_flat.png', dpi = 600,bbox_inches='tight', pad_inches=0.05)

执行结果分析:

shading='flat'为每个三角形赋予单一颜色,速度最快,但网格边界可见,画面略显粗糙。

数据为圆形区域内模拟的物理场,中心高值边缘低值,并带有三瓣状波动。

进阶1:Gouraud着色平滑过渡

使用Gouraud着色在三角形内部进行颜色插值,实现平滑过渡。

import numpy as npimport matplotlib.pyplot as pltimport matplotlib.tri as tridefset_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()data = np.load('非结构网格数据.npz')triang = tri.Triangulation(data['x'], data['y'], data['simplices'])z = data['z']fig, axes = plt.subplots(12, figsize=(8.04.0))# 左:flat shadingtcf1 = axes[0].tripcolor(triang, z, shading='flat', cmap='viridis')axes[0].set_title('flat 着色(三角边界可见)')plt.colorbar(tcf1, ax=axes[0], fraction=0.046, pad=0.04)# 右:gouraud shadingtcf2 = axes[1].tripcolor(triang, z, shading='gouraud', cmap='viridis')axes[1].set_title('gouraud 着色(平滑过渡)')plt.colorbar(tcf2, ax=axes[1], fraction=0.046, pad=0.04)for ax in axes:    ax.set_xlabel('x')    ax.set_ylabel('y')    ax.set_aspect('equal')plt.tight_layout()plt.show()fig.savefig('非结构网格_shading对比.pdf', dpi = 600,bbox_inches='tight', pad_inches=0.05)fig.savefig('非结构网格_shading对比.png', dpi = 600,bbox_inches='tight', pad_inches=0.05)

执行结果分析:

Gouraud着色在每个三角形内部基于顶点颜色进行双线性插值,消除了三角边界,画面光滑。

对于较粗网格,Gouraud可显著提升视觉效果,更接近连续场。

推荐在有限元后处理中使用shading='gouraud'

进阶2:叠加网格线(轮廓)与节点标记

在云图上叠加三角网格线,清晰显示离散化细节。

import numpy as npimport matplotlib.pyplot as pltimport matplotlib.tri as tridefset_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()data = np.load('非结构网格数据.npz')triang = tri.Triangulation(data['x'], data['y'], data['simplices'])z = data['z']fig, ax = plt.subplots(figsize=(5.04.5))tcf = ax.tripcolor(triang, z, shading='gouraud', cmap='plasma', alpha=0.9)# 叠加网格线(仅绘制边缘)ax.triplot(triang, color='white', linewidth=0.3, alpha=0.5)# 标记部分节点(稀疏显示)ax.scatter(data['x'][::15], data['y'][::15], s=5, c='black', edgecolors='white', linewidth=0.5)cbar = plt.colorbar(tcf, ax=ax, fraction=0.046, pad=0.04)cbar.set_label('场值', fontsize=9)ax.set_xlabel('x')ax.set_ylabel('y')ax.set_aspect('equal')ax.set_title('非结构网格 + 网格线', fontsize=10)plt.tight_layout()plt.show()fig.savefig('非结构网格_叠加网格线.pdf',  dpi = 600,bbox_inches='tight', pad_inches=0.05)fig.savefig('非结构网格_叠加网格线.png',  dpi = 600,bbox_inches='tight', pad_inches=0.05)

执行结果分析:

triplot绘制三角网格边线,展示了离散化密度,帮助评估网格质量。

节点散点标记了部分顶点位置,便于理解有限元节点分布。

半透明白色网格线不会过度干扰色彩信息,适合技术报告。

进阶3:不规则边界裁剪与掩膜

通过定义掩膜数组,隐藏不需要显示的区域(如计算域外部)。

import numpy as npimport matplotlib.pyplot as pltimport matplotlib.tri as tridefset_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()data = np.load('非结构网格数据.npz')x, y, z, simplices = data['x'], data['y'], data['z'], data['simplices']# ===================== 修复部分开始 =====================# 1. 先创建三角网格(不带mask)triang = tri.Triangulation(x, y, simplices)# 2. 计算每个三角形的【中心点半径】tri_center_x = x[simplices].mean(axis=1)tri_center_y = y[simplices].mean(axis=1)tri_r = np.sqrt(tri_center_x**2 + tri_center_y**2)# 3. 给三角形做mask(超出半径5的三角形屏蔽)tri_mask = tri_r > 5.0triang.set_mask(tri_mask)fig, ax = plt.subplots(figsize=(5.04.5))tcf = ax.tripcolor(triang, z, shading='gouraud', cmap='viridis')cbar = plt.colorbar(tcf, ax=ax, fraction=0.046, pad=0.04)cbar.set_label('场值', fontsize=9)# 绘制圆形边界theta = np.linspace(02*np.pi, 200)ax.plot(5*np.cos(theta), 5*np.sin(theta), 'k--', linewidth=1, label='计算域边界')ax.set_xlabel('x')ax.set_ylabel('y')ax.set_aspect('equal')ax.legend(fontsize=8)ax.set_title('裁剪后的计算域', fontsize=10)plt.tight_layout()plt.show()fig.savefig('非结构网格_掩膜裁剪.pdf', dpi=600, bbox_inches='tight', pad_inches=0.05)fig.savefig('非结构网格_掩膜裁剪.png', dpi=600, bbox_inches='tight', pad_inches=0.05)

执行结果分析:

Triangulationmask参数接受布尔数组,标记不需要绘制的三角形(若三角形任一顶点被掩蔽则整个三角形不显示)。

裁剪后仅显示圆形域内部,边界清晰,符合有限元计算域展示习惯。

可用于复杂几何形状(如机翼、管道截面)的后处理。

进阶4:网格自适应细化与插值到规则网格

将非结构数据插值到规则网格,再用contourf绘制,获得极致平滑的视觉效果。

import numpy as npimport matplotlib.pyplot as pltfrom 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()data = np.load('非结构网格数据.npz')x, y, z = data['x'], data['y'], data['z']# 定义规则网格xi = np.linspace(-5.55.5300)yi = np.linspace(-5.55.5300)Xi, Yi = np.meshgrid(xi, yi)# 线性插值Zi = griddata((x, y), z, (Xi, Yi), method='cubic')  # 三次样条更平滑# 掩膜圆形外部r_i = np.sqrt(Xi**2 + Yi**2)Zi = np.ma.masked_where(r_i > 5.0, Zi)fig, ax = plt.subplots(figsize=(5.04.5))cf = ax.contourf(Xi, Yi, Zi, levels=50, cmap='viridis')cbar = plt.colorbar(cf, ax=ax, fraction=0.046, pad=0.04)cbar.set_label('场值', fontsize=9)ax.set_xlabel('x')ax.set_ylabel('y')ax.set_aspect('equal')ax.set_title('插值到规则网格(平滑云图)', fontsize=10)plt.tight_layout()plt.show()fig.savefig('非结构网格_规则插值.pdf', dpi=600, bbox_inches='tight', pad_inches=0.05)fig.savefig('非结构网格_规则插值.png', dpi=600, bbox_inches='tight', pad_inches=0.05)

执行结果分析:

通过griddata将散点数据插值到细密规则网格,再使用contourf绘制,色彩过渡极其平滑。

三次样条插值(method='cubic')比线性插值更光滑,但计算稍慢。

掩膜数组np.ma.masked_where隐藏了计算域外部区域,保持图形整洁。

此方法适用于需要出版级高质量图片的场合。

实操任务4:在二维等高线图下方叠加三维曲面图,调整视角与光照,增强立体感

本任务将二维等高线图与三维曲面图结合,使用plot_surface绘制三维曲面,并通过视角、光照和颜色映射增强立体感。

基础版:三维曲面图与等高线投影

使用格点温度数据,绘制三维曲面,并在底部平面投影等高线。

import 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'] = 300set_academic_style()data = np.load('grid_T_P.npz')x, y, T = data['x'], data['y'], data['T']X, Y = np.meshgrid(x, y)fig = plt.figure(figsize=(6.05.0))ax = fig.add_subplot(111, projection='3d')# 绘制曲面surf = ax.plot_surface(X, Y, T, cmap='hot', linewidth=0, antialiased=True, alpha=0.9)# 在z轴底部平面绘制等高线投影(偏移z值)ax.contour(X, Y, T, zdir='z', offset=T.min()-5, cmap='hot', linewidths=0.8)ax.set_xlabel('x (m)')ax.set_ylabel('y (m)')ax.set_zlabel('温度 (°C)')ax.view_init(elev=30, azim=-60)  # 设置视角fig.colorbar(surf, ax=ax, shrink=0.5, aspect=10, pad = 0.1, label='温度 (°C)'# 添加颜色条plt.tight_layout()plt.show()fig.savefig('三维曲面_基础.pdf', dpi=600, bbox_inches='tight', pad_inches=0.05)fig.savefig('三维曲面_基础.png', dpi=600, bbox_inches='tight', pad_inches=0.05)

执行结果分析:

plot_surface根据网格数据生成曲面,颜色映射反映温度高低。

contourzdir='z'offset参数将等高线投影到底部平面,形成二维参考。

视角elev=30, azim=-60提供良好的立体观察角度。

进阶1:调整光照与材质

通过设置shade=True并添加自定义光源,增强曲面立体感。

import numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3Dfrom matplotlib.colors import LightSourcedefset_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()data = np.load('grid_T_P.npz')x, y, T = data['x'], data['y'], data['T']X, Y = np.meshgrid(x, y)fig = plt.figure(figsize=(6.05.0))ax = fig.add_subplot(111, projection='3d')# 创建光源(从西北方向照射)ls = LightSource(azdeg=315, altdeg=45)# 将颜色映射与光照结合rgb = plt.cm.hot(T / T.max())illuminated = ls.shade_rgb(rgb, T, fraction=0.5)surf = ax.plot_surface(X, Y, T, facecolors=illuminated, linewidth=0, antialiased=True)ax.set_xlabel('x (m)')ax.set_ylabel('y (m)')ax.set_zlabel('温度 (°C)')ax.view_init(elev=25, azim=-50)# 添加虚拟颜色条mappable = plt.cm.ScalarMappable(cmap='hot')mappable.set_array(T)fig.colorbar(mappable, ax=ax, shrink=0.5, aspect=10, pad = 0.1, label='温度 (°C)')plt.tight_layout()plt.show()fig.savefig('三维曲面_自定义光照.pdf', dpi=600, bbox_inches='tight', pad_inches=0.05)fig.savefig('三维曲面_自定义光照.png', dpi=600, bbox_inches='tight', pad_inches=0.05)

执行结果分析:

LightSource模拟定向光源,使曲面产生明暗变化,山峰和山谷更立体。

shade_rgb将光照叠加到原始颜色上,比默认的shade=True更可控。

调整azdegaltdeg可改变光源方向,突出特定地形特征。

进阶2:叠加彩色等高线投影 + 垂直连线

在底部平面绘制填充等高线,并从等高线向曲面引垂直线,增强空间关联。

import 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'] = 300set_academic_style()data = np.load('grid_T_P.npz')x, y, T = data['x'], data['y'], data['T']X, Y = np.meshgrid(x, y)fig = plt.figure(figsize=(7.06.0))ax = fig.add_subplot(111, projection='3d')# 曲面surf = ax.plot_surface(X, Y, T, cmap='terrain', linewidth=0, antialiased=True, alpha=0.8)# 底部填充等高线(投影)offset = T.min() - 5ax.contourf(X, Y, T, zdir='z', offset=offset, cmap='terrain', alpha=0.6)levels = [406080]for level in levels:# 绘制等高线    ax.contour(X, Y, T, levels=[level], colors='black', linewidths=0.5)# 绘制底部等高线    ax.contour(X, Y, T, levels=[level], colors='gray', linewidths=0.5, offset=offset, alpha=0.5)    xx = X[::10, ::10]    yy = Y[::10, ::10]    zz = T[::10, ::10]    mask = np.isclose(zz, level, atol=2)  # 接近当前等高线    xs = xx[mask]    ys = yy[mask]for xi, yi in zip(xs.flat, ys.flat):        ax.plot([xi, xi], [yi, yi], [offset, level],                color='gray', linestyle=':', linewidth=0.3, alpha=0.5)# ==============================================================================ax.set_xlabel('x (m)')ax.set_ylabel('y (m)')ax.set_zlabel('温度 (°C)')ax.view_init(elev=30, azim=-60)# 颜色条位置fig.colorbar(surf, ax=ax, shrink=0.5, pad=0.1, aspect=10, label='温度 (°C)')plt.tight_layout()plt.show()fig.savefig('三维曲面_等高线投影连线.pdf', dpi=600, bbox_inches='tight', pad_inches=0.05)fig.savefig('三维曲面_等高线投影连线.png', dpi=600, bbox_inches='tight', pad_inches=0.05)

执行结果分析:

底部填充等高线提供了二维温度分布的直观参考。

垂直线连接等高线与对应曲面高度,帮助观察者将二维信息映射到三维。

适用于地形可视化、势能面展示等场景。

进阶3:双曲面叠加对比

在同一三维坐标系中绘制两个半透明曲面,展示不同物理场的空间关系。

import 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'] = 300set_academic_style()data = np.load('grid_T_P.npz')x, y, T, P = data['x'], data['y'], data['T'], data['P']X, Y = np.meshgrid(x, y)fig = plt.figure(figsize=(7.06.0))ax = fig.add_subplot(111, projection='3d')# 温度曲面(暖色,半透明)surf_T = ax.plot_surface(X, Y, T, cmap='hot', alpha=0.7, linewidth=0)# 压力曲面(缩放至相近范围,冷色,半透明)P_scaled = (P - P.min()) / (P.max() - P.min()) * (T.max() - T.min()) + T.min()surf_P = ax.plot_surface(X, Y, P_scaled, cmap='winter', alpha=0.5, linewidth=0)# 添加图例(手动)import matplotlib.patches as mpatchespatch_T = mpatches.Patch(color=plt.cm.hot(0.7), label='温度场', alpha=0.7)patch_P = mpatches.Patch(color=plt.cm.winter(0.7), label='压力场 (缩放)', alpha=0.5)ax.legend(handles=[patch_T, patch_P], loc='upper left', fontsize=8)ax.set_xlabel('x (m)')ax.set_ylabel('y (m)')ax.set_zlabel('温度 (°C) / 压力 (缩放)')ax.view_init(elev=30, azim=-60)plt.tight_layout()plt.show()fig.savefig('三维曲面_双场叠加.pdf', dpi=600,bbox_inches='tight', pad_inches=0.05)fig.savefig('三维曲面_双场叠加.png', dpi=600,bbox_inches='tight', pad_inches=0.05)

执行结果分析:

温度(红-黄)与压力(蓝-青)曲面叠加,透明效果使重叠区域可见。

压力值已缩放至温度值域,便于在同一坐标轴显示(需在标题或图例中说明缩放)。

适用于展示耦合物理场(如热-力耦合)的空间分布关系。

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

将三维视图与二维平面图结合在同一图中,使用GridSpecsubplot_mosaic布局。

import numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3Dfrom 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()data = np.load('grid_T_P.npz')x, y, T = data['x'], data['y'], data['T']X, Y = np.meshgrid(x, y)fig = plt.figure(figsize=(8.04.5))gs = GridSpec(12, width_ratios=[1.21], wspace=0.3#设置子图比例# 左侧:三维曲面ax1 = fig.add_subplot(gs[0], projection='3d')surf = ax1.plot_surface(X, Y, T, cmap='hot', linewidth=0, antialiased=True)ax1.contour(X, Y, T, zdir='z', offset=T.min()-5, cmap='hot', linewidths=0.6)ax1.set_xlabel('x (m)')ax1.set_ylabel('y (m)')ax1.set_zlabel('温度 (°C)')ax1.view_init(elev=30, azim=-60)ax1.set_title('三维温度曲面', fontsize=10)# 右侧:二维填充等高线(俯视图)ax2 = fig.add_subplot(gs[1])cf = ax2.contourf(X, Y, T, levels=20, cmap='hot')ax2.contour(X, Y, T, levels=8, colors='black', linewidths=0.4)ax2.set_xlabel('x (m)')ax2.set_ylabel('y (m)')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='温度 (°C)')plt.tight_layout(rect=[000.911])plt.show()fig.savefig('三维曲面_组合二维等高线.pdf',  dpi=1200,bbox_inches='tight', pad_inches=0.05)fig.savefig('三维曲面_组合二维等高线.png',  dpi=1200,bbox_inches='tight', pad_inches=0.05)

执行结果分析:

左三维右二维的布局兼顾立体感与定量读取,是科学可视化中的经典组合。

共用颜色条确保色彩映射一致,便于对比。

适用于有限元分析报告中的多角度展示。

- END -

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-04 02:43:41 HTTP/2.0 GET : https://f.mffb.com.cn/a/486708.html
  2. 运行时间 : 0.135708s [ 吞吐率:7.37req/s ] 内存消耗:5,195.89kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=a70183dba7e48fb689a65d43c976ec03
  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.000509s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000674s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000251s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000298s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000485s ]
  6. SELECT * FROM `set` [ RunTime:0.000207s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000598s ]
  8. SELECT * FROM `article` WHERE `id` = 486708 LIMIT 1 [ RunTime:0.000709s ]
  9. UPDATE `article` SET `lasttime` = 1783104221 WHERE `id` = 486708 [ RunTime:0.028031s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.006316s ]
  11. SELECT * FROM `article` WHERE `id` < 486708 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001679s ]
  12. SELECT * FROM `article` WHERE `id` > 486708 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.007887s ]
  13. SELECT * FROM `article` WHERE `id` < 486708 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.015498s ]
  14. SELECT * FROM `article` WHERE `id` < 486708 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.004405s ]
  15. SELECT * FROM `article` WHERE `id` < 486708 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.001025s ]
0.137227s