在不使用等高线的情况下,从x、y、z的数据集合中绘制出3d图像中的matplotlib颜色。

时间:2022-09-10 21:35:53

For the life of me I cannot figure out how to get the same results as this.

对于我的生活,我不知道该如何得到同样的结果。

The link generates the colored 3d plot without using contour. If I utilize the same technique but with my own x,y,z data set I get just one color.

该链接生成彩色三维图而不使用轮廓线。如果我使用相同的技术,但是用我自己的x,y,z数据集,我只得到一种颜色。

The difference must be in the way I'm generating the z data for the plot.

不同之处在于,我正在为图生成z数据。

Anyway, using this:

不管怎样,使用:

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()

Data set:

数据集:

-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

Only one color is shown. Also notice the color bar has no ticks.

只显示一种颜色。同时注意颜色条没有刻度。

Can you explain what my problem is?

你能解释一下我的问题吗?

3 个解决方案

#1


16  

I think there is a problem with fill "discontinuous" surface (griddata). 在不使用等高线的情况下,从x、y、z的数据集合中绘制出3d图像中的matplotlib颜色。

我认为填充“不连续”表面有一个问题(griddata)。

Code:

代码:

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()

Please note that if you consider the surface above a rectangular area (xi x yi), this code is working properly. In other words, if you "cut off" irregular edges.

请注意,如果你考虑一个矩形区域以上(xi x yi),这段代码运行正常。换句话说,如果你“切断”不规则的边缘。

xi = np.linspace(-4000, -9000)
yi = np.linspace(4000, 9000)

在不使用等高线的情况下,从x、y、z的数据集合中绘制出3d图像中的matplotlib颜色。

#2


2  

The easiest way to read text data is via genfromtxt:

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

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

sys is not required.

sys不是必需的。

#3


2  

I just struggled with the similar problem.

我只是纠结于类似的问题。

Finally I had to use natgrid (which is referenced here but the link doesn't work) instead of griddata.

最后,我不得不使用natgrid(这里引用了它,但是链接不工作),而不是griddata。

for me the trick with cutting of plot region didn't work, it was always in one colour.

对我来说,切割plot区域的技巧不起作用,它总是用一种颜色。

When installing PyNGL check that you have the latest version of numpy.

当安装PyNGL检查时,您有最新版本的numpy。

Good luck

祝你好运

#1


16  

I think there is a problem with fill "discontinuous" surface (griddata). 在不使用等高线的情况下,从x、y、z的数据集合中绘制出3d图像中的matplotlib颜色。

我认为填充“不连续”表面有一个问题(griddata)。

Code:

代码:

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()

Please note that if you consider the surface above a rectangular area (xi x yi), this code is working properly. In other words, if you "cut off" irregular edges.

请注意,如果你考虑一个矩形区域以上(xi x yi),这段代码运行正常。换句话说,如果你“切断”不规则的边缘。

xi = np.linspace(-4000, -9000)
yi = np.linspace(4000, 9000)

在不使用等高线的情况下,从x、y、z的数据集合中绘制出3d图像中的matplotlib颜色。

#2


2  

The easiest way to read text data is via genfromtxt:

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

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

sys is not required.

sys不是必需的。

#3


2  

I just struggled with the similar problem.

我只是纠结于类似的问题。

Finally I had to use natgrid (which is referenced here but the link doesn't work) instead of griddata.

最后,我不得不使用natgrid(这里引用了它,但是链接不工作),而不是griddata。

for me the trick with cutting of plot region didn't work, it was always in one colour.

对我来说,切割plot区域的技巧不起作用,它总是用一种颜色。

When installing PyNGL check that you have the latest version of numpy.

当安装PyNGL检查时,您有最新版本的numpy。

Good luck

祝你好运