这是我第一次使用python,scipy和此任务所需的所有概念。
我已经使用Mathematica在3D图中计算和显示非常复杂的函数。从Mathematica导出是一个真正的难题,并且从来没有在合理的时间范围内提供可发布的数字。 Gnuplot在3D绘图上也不是很好,因此我将继续使用matplotlib。通过阅读文档,我发现所有绘图示例都涉及简单的函数和用户定义为矢量的变量。我的第一个问题如下:
我可以将Mathematica中的功能数据导出到一个带有3个制表符分隔列的文件中(如果有帮助的话,分隔可以是其他方式!)。第一列是x轴,第二列是y,第三列是z轴。我需要绘制的基本上是z(x,y)
。
如何导入此类数据文件进行绘图?
第二个问题是:为了获得平滑的表面图,我是否需要对数据进行某种插值?如果是这样,那么如何处理从我描述的文件中导入的数据?
在此示例here中,scipy.interpolate.interp2d
函数(?)需要两个1D向量x和y以及z的2D向量,以获得内插函数z(x,y)
。但是我的数据是x(第一列)是一维向量,y(第二列)是一维向量,z(第三列)是一维向量。
给出的示例让我有些困惑,因为它们使用定义的x和y向量以及z的函数,然后继续进行插值(我在这里看不到插值点)。
我希望有人会以此指向我正确的方向!
答案 0 :(得分:2)
否,您不需要定义的函数即可使用scipy's griddata。我们可以对任何给定的数据集进行插值,例如z =x²+y²+ 1,其中一些数据点已删除:
0 0 1
1 0 2
3 0 10
0 1 2
1 1 3
2 1 6
0 2 5
1 2 6
2 2 9
3 2 14
0 3 10
2 3 14
3 3 19
以下代码从这些数据点插入3D曲面:
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from scipy.interpolate import griddata
#read data points from text file, could be also a csv reader
arr = np.genfromtxt("test.txt")
#extract x, y, z
x = arr[:,0]
y = arr[:,1]
z = arr[:,2]
#create figure with a 3D projection axis
fig = plt.figure()
ax = fig.add_subplot(111, projection="3d")
#number of data points per axis
n = 20
#upsample evenly along x and y axis
x_up = np.linspace(np.min(x), np.max(x), n)
y_up = np.linspace(np.min(y), np.max(y), n)
#create grid from these updsampled 1D arrays
x3d, y3d = np.meshgrid(x_up, y_up)
#interpolate z-values for this regular grid
#x, y, z are your original data points
#methods other than cubic are available
z3d = griddata((x, y), z, (x3d, y3d), method = "cubic")
#plot surface
ax.plot_surface(x3d, y3d, z3d)
#plot original data points on top
ax.scatter(x, y, z, color = "black", marker = "x", s = 50)
ax.set_xlabel("X")
ax.set_ylabel("Y")
ax.set_zlabel("Z")
plt.show()