【问题标题】:Plot a 3D surface from {x,y,z}-scatter data in python在 python 中从 {x,y,z}-scatter 数据绘制 3D 表面
【发布时间】:2023-03-17 22:35:01
【问题描述】:

我正在尝试绘制一个 3D 曲面,该曲面构造为适合 python 中的一些 {x,y,z} 点——理想情况下类似于 Mathematica ListSurfacePlot3D 函数。到目前为止,我在我的观点上尝试了 plot_surfaceplot_wireframe 无济于事。

只有坐标区使用plot_surface 渲染。 plot_wireframe 给出了一堆 squigglys,模糊地呈现对象的形状,但不是文档中显示的漂亮类型: 与ListSurfacePlot3D 的结果比较:

这是一个最小的工作示例,使用我发布的 here 的 test.csv 文件:

import csv
from matplotlib import pyplot
import pylab
from mpl_toolkits.mplot3d import Axes3D

hFile = open("test.csv", 'r')
datfile = csv.reader(hFile)
dat = []

for row in datfile:
        dat.append(map(float,row))

temp = zip(*(dat))

fig = pylab.figure(figsize=pyplot.figaspect(.96))
ax = Axes3D(fig)

那么,要么

ax.plot_surface(temp[0], temp[1], temp[2])
pyplot.show()

ax.plot_wireframe(temp[0], temp[1], temp[2])
pyplot.show()

这是使用plot_surface 渲染的方式: 并使用plot_wireframe: 并使用ListSurfacePlot3D

【问题讨论】:

  • plot_surfaceplot_wireframe 到底有什么问题?
  • @ali_m 只是用plot_surface 渲染的轴(我得到了一个无法描述的Visual C++ 运行时错误)。 plot_wireframe 给出了一堆波浪线,模糊地呈现对象的形状,但不是文档中显示的那种很好的类型。
  • @Marcin 很难获得 MWE,因为我无法共享我正在尝试绘制的数据集,抱歉。我可以使用scatter 绘制点,所以我很确定我已经正确设置了其他东西。
  • 你能创建一些相同格式的虚拟数据吗?或者至少显示代码?
  • @Marcin 我正在尝试查看是否可以生成一些我可以共享的数据/有意义的代码。

标签: python 3d matplotlib


【解决方案1】:

plot_surface 需要二维数组形式的 X、Y、Z 值,这将由 np.meshgrid 返回。当输入以这种方式规则网格化时,绘图函数隐含地知道曲面中的哪些顶点彼此相邻,因此应该与边连接。但是,在您的示例中,您将其处理为一维坐标向量,因此绘图函数需要能够确定应该连接哪些顶点。

plot_trisurf 函数确实通过进行 Delaunay 三角剖分来处理不规则间隔的点,以确定哪些点应与边缘连接以避免“细三角形”:

【讨论】:

  • 不错!这正是我一直在寻找的。有没有办法调整三角剖分的密度?还是我需要手动精简我的数据集?
  • @EliLansey 见this answer
  • 这在我的实际数据集上做得不错,但仍然存在一些问题,请参阅:i.stack.imgur.com/hcRbX.png 任何提示?
  • 实际上,这似乎过于复杂了。我去了一个更大的数据集,它在各处绘制连接(想象一个球,但它不是一个球体,而是被切碎的,三角形从上半球切到下半球)。
  • 您的 x,y,z 点从何而来?如果您通过某个函数z = f(x,y) 生成它们,您可以修改f 使其接受x,y 坐标的二维数组。或者,您可以尝试在常规网格上重新采样数据,例如使用scipy.interpolate.griddata。在一组常规二维数组中获得 x、y、z 值后,您可以使用 plot_surface
猜你喜欢
  • 2011-04-28
  • 1970-01-01
  • 2015-12-04
  • 1970-01-01
  • 2015-11-03
  • 1970-01-01
  • 1970-01-01
  • 2013-09-20
  • 1970-01-01
相关资源
最近更新 更多