Python matplotlib 颜色在不使用轮廓的情况下从 x、y、z 数据集绘制的 3d
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/4363857/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
matplotlib color in 3d plotting from an x,y,z data set without using contour
提问by hl3fx
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.
该链接在不使用轮廓的情况下生成彩色 3d 图。如果我使用相同的技术但使用我自己的 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?
你能解释一下我的问题是什么吗?
回答by kros
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]
sysis not required.
sys不需要。
回答by kros
I think there is a problem with fill "discontinuous" surface (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)


回答by Valentin Rychkov
I just struggled with the similar problem.
我只是在与类似的问题作斗争。
Finally I had to use natgrid(which is referenced herebut 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.
对我来说,切割情节区域的技巧不起作用,它总是一种颜色。
When installing PyNGL check that you have the latest version of numpy.
安装 PyNGL 时,请检查您是否拥有最新版本的 numpy。
Good luck
祝你好运

