使用x、y、z数据集在3D绘图中绘制matplotlib颜色,而不需要使用等高线。

6
我真的想不出如何获得与这个相同的结果。该链接生成了一个带颜色的三维图形,而不使用等高线。如果我使用自己的x、y、z数据集来尝试相同的技术,我只会得到一种颜色。区别必须在于我为绘图生成z数据的方式。无论如何,使用以下代码:
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.mlab import griddata
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter
import matplotlib.pyplot as plt
import numpy as np
import sys

def xyz_ret(file):
    f = open(file, 'r')

    xyz = []
    for i in f:
        ret = i.replace('\n','')
        xyz.append(map(float,(ret.split('\t'))))

    xyz =  np.array(xyz)   
    return xyz[:,0],xyz[:,1],xyz[:,2]     


x,y,z = xyz_ret('300.txt')

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

xi = np.linspace(min(x), max(x))
yi = np.linspace(min(y), max(y))

X, Y = np.meshgrid(xi, yi)
Z = griddata(x, y, z, xi, yi)

surf = ax.plot_surface(X, Y, Z, rstride=6, cstride=6, cmap=cm.jet,
        linewidth=0)

ax.set_zlim3d(min(z), max(z))

ax.w_zaxis.set_major_locator(LinearLocator(10))
ax.w_zaxis.set_major_formatter(FormatStrFormatter('%.03f'))

fig.colorbar(surf, shrink=0.5, aspect=5)

plt.show()

数据集:

-2187.99902 9380.009151 0.0209
-2187.00111 2474.994061 0.022
-10755.98931 6119.598968 0.0296
-5781.347693 609.427388 0.0301
-8761.562524 1942.391853 0.0285
-5695.576244 1894.624701 0.0251
-3801.215106 1096.153308 0.0257
-1616.821487 2452.940102 0.0182
-5790.547537 2975.622971 0.022
-8095.18467 4074.330871 0.0208
-9997.367785 2771.330212 0.0264
-10547.5635 4397.127096 0.0251
-5781.706776 3984.545588 0.0191
-3346.855289 4347.670408 0.0172
-918.639762 4518.515925 0.0142
-892.428381 5850.710005 0.0143
-5844.499993 6516.904257 0.0204
-10877.96951 6015.755723 0.0265
-10813.37291 7704.306099 0.0302
-7991.878303 7733.626264 0.0223
-5861.073574 8725.943697 0.0217
-3188.107715 6997.19893 0.0206
-897.427629 7474.426336 0.0188
-1388.841321 8786.642046 0.0194
-3370.72325 8825.154803 0.0225
-8561.226722 8851.111988 0.0285
-10275.58972 8849.798032 0.0341
-5853.645621 10113.77051 0.0255
-8101.002878 10754.8429 0.0332
-5765.080546 11378.95524 0.0299
-3081.969839 10549.46676 0.0242

只显示了一种颜色。另外请注意,色条上没有标记。

您能解释我的问题是什么吗?


我会说你没有使用Axes3D.plot_surface。你导入了Axes3D,但是你没有使用它。 - joaquin
在 ax = fig.add_subplot(111, projection='3d') 中使用了 Axes3d,如果我删除 Axes3d,脚本将在该行出错。 - hl3fx
3个回答

17

我认为填补“不连续”的表面(griddata)存在问题。

alt text

代码:

from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import matplotlib.pyplot as plt
from matplotlib.mlab import griddata
import numpy as np

fig = plt.figure()
ax = fig.gca(projection='3d')

data = np.genfromtxt('300.txt')
x = data[:,0]
y = data[:,1]
z = data[:,2]

xi = np.linspace(min(x), max(x))
yi = np.linspace(min(y), max(y))

X, Y = np.meshgrid(xi, yi)
Z = griddata(x, y, z, xi, yi)

surf = ax.plot_surface(X, Y, Z, rstride=5, cstride=5, cmap=cm.jet,
                       linewidth=1, antialiased=True)

ax.set_zlim3d(np.min(Z), np.max(Z))
fig.colorbar(surf)

plt.show()

请注意,如果您考虑一个矩形区域上面的表面 (xi x yi),那么这段代码是有效的。换句话说,如果您“去掉”不规则的边缘。
xi = np.linspace(-4000, -9000)
yi = np.linspace(4000, 9000)

alt text


谢谢您的反馈。我还在努力弄清楚。不知道是否有其他方法可以获取z数据而不使用griddata? - hl3fx
以上问题的症状也会是色条中缺少刻度标记吗?我认为这两个问题直接相关。在示例代码中,刻度显示为代表不同颜色对Z高度的值。如果您在示例代码中打印Z,则将显示填充有数字的列表数组;但在上述代码中,如果您打印Z,则显示为一串 --- 的列表。有任何想法吗? - hl3fx
嗯,感谢您找到了这个。现在该如何修复损坏的表面呢?我在这里找到了另一个遇到同样问题的人:http://old.nabble.com/plot_surface-masked-array-tt27266471.html#a27266471。不幸的是,他的问题没有得到回复。 - hl3fx
表面没有破裂,但是对于所有点(xi, yi),Z的值并未指定。我不知道如何填充不规则表面。 - kros
我会把这个问题带到Matplotlib邮件列表中,看看那里是否有人能够提供一些想法,并稍后更新情况。非常感谢你们迄今为止的所有帮助。 - hl3fx
2
mlab.griddata已被弃用,推荐使用scipy.interpolate.griddata,其需要略微不同的参数:Z = griddata((x, y), z, (X.flatten(), Y.flatten()), 'nearest').reshape(50,50)。(50是np.linspace的默认num值) - Leopd

2

我曾经也遇到过类似的问题。

最后我不得不使用natgrid(在这里有提到,但链接已失效)代替griddata。

对于我来说,裁剪绘图区域的技巧并没有起到作用,它总是只有一种颜色。

安装PyNGL时,请检查您是否拥有最新版本的numpy。

祝好运


2

通过genfromtxt读取文本数据是最简单的方法:

data = np.genfromtxt('300.txt')
x = data[:,0]
y = data[:,1]
z = data[:,2]

sys 不是必需的。


我在编码时使用sys随机退出脚本以测试东西。sys.exit() - hl3fx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接