You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于三列数据用Matplotlib绘制带网格的3D曲面图?

实现带网格的3D曲面图解决方案

问题说明

需要基于三列数据生成带网格的3D曲面图,当前使用plot_trisurf生成的曲面无网格效果,希望实现目标图的网格样式。

方案1:为三角剖分曲面添加网格线

plot_trisurf默认仅填充曲面,通过指定edgecolor(网格线颜色)和linewidth(网格线粗细)参数,即可为三角剖分的曲面添加网格:

import numpy as np
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
import os
import warnings
from mpl_toolkits.mplot3d import Axes3D

warnings.filterwarnings('ignore')
os.chdir(r"E:\SoftwareFile\stataFile")
matplotlib.use('TkAgg')

plt.figure(figsize=(10,6))

data = pd.read_stata(r"E:\SoftwareFile\stataFile\demo.dta")

ax = plt.axes(projection="3d")

# 添加edgecolor和linewidth参数实现网格效果
ax.plot_trisurf(data["age"], data["weight"], data["pr_highbp"],
                cmap=plt.cm.Spectral_r,
                edgecolor='black',  # 设置网格线颜色
                linewidth=0.2,      # 调整网格线粗细
                shade=False)        # 关闭着色,让网格更清晰

ax.set_xticks(np.arange(20, 90, step=10))
ax.set_yticks(np.arange(40, 200, step=40))
ax.set_zticks(np.arange(0, 1.2, step=0.2))

ax.set_title("Probability of Hypertension by Age and Weight")
ax.set_xlabel("Age (years)")
ax.set_ylabel("Weight (kg)")  # 修正原代码中括号缺失的错误
ax.zaxis.set_rotate_label(False)
ax.set_zlabel("Probability of Hypertension", rotation=90)

ax.view_init(elev=30, azim=240)
plt.savefig("demo_trisurf_grid.png", dpi=1200)
plt.show()

方案2:生成规则网格曲面(更贴近示例图)

如果需要示例图中的规则四边形网格,需先对散点数据进行插值,生成规则X-Y网格后,使用plot_surface绘制:

import numpy as np
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
import os
import warnings
from mpl_toolkits.mplot3d import Axes3D
from scipy.interpolate import griddata

warnings.filterwarnings('ignore')
os.chdir(r"E:\SoftwareFile\stataFile")
matplotlib.use('TkAgg')

plt.figure(figsize=(10,6))

data = pd.read_stata(r"E:\SoftwareFile\stataFile\demo.dta")

# 提取原始数据
x = data["age"].values
y = data["weight"].values
z = data["pr_highbp"].values

# 生成规则网格
xi = np.linspace(x.min(), x.max(), 50)
yi = np.linspace(y.min(), y.max(), 50)
XI, YI = np.meshgrid(xi, yi)

# 插值计算网格对应的Z值
ZI = griddata((x, y), z, (XI, YI), method='cubic')

ax = plt.axes(projection="3d")

# 绘制带网格的规则曲面
ax.plot_surface(XI, YI, ZI,
                cmap=plt.cm.Spectral_r,
                edgecolor='black',
                linewidth=0.2,
                shade=False)

ax.set_xticks(np.arange(20, 90, step=10))
ax.set_yticks(np.arange(40, 200, step=40))
ax.set_zticks(np.arange(0, 1.2, step=0.2))

ax.set_title("Probability of Hypertension by Age and Weight")
ax.set_xlabel("Age (years)")
ax.set_ylabel("Weight (kg)")
ax.zaxis.set_rotate_label(False)
ax.set_zlabel("Probability of Hypertension", rotation=90)

ax.view_init(elev=30, azim=240)
plt.savefig("demo_surface_grid.png", dpi=1200)
plt.show()

补充说明

  • 方案1基于原始数据的三角剖分,保留数据原始分布,网格为三角形样式;
  • 方案2通过插值生成规则网格,得到四边形网格,更贴近目标示例图,插值方法可选linear、cubic或nearest,可根据需求调整;
  • 原代码中ylabel存在括号缺失错误,已同步修正。

内容的提问来源于stack exchange,提问作者Manfred L

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 21:40:38