2010-12-06 157 views
6

对于我的生活,我无法弄清楚如何得到与this相同的结果。matplotlib颜色以3D绘图从x,y,z数据集中不使用轮廓

该链接生成彩色3d图而不使用轮廓。如果我使用相同的技术,但使用我自己的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 

只有一种颜色被示出。另请注意,颜色栏没有刻度。

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

+0

我会说你没有使用Axes3D.plot_surface。您导入Axes3D,但不使用它。 – joaquin 2010-12-06 07:18:47

+0

它在ax = fig.add_subplot(111,projection ='3d')中使用,如果我删除Axes3d,脚本将在该行发生错误。 – hl3fx 2010-12-06 09:26:42

回答

2

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

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

sys不是必需的。

+0

哈,非常感谢您的珍闻! :) – hl3fx 2010-12-06 09:23:02

16

我认为填充“不连续”表面(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

2

我只是挣扎着类似的问题。

最后,我不得不使用natgrid(它被引用here,但链接不起作用),而不是griddata。

对我来说,切割阴谋地区的伎俩没有奏效,它总是以一种颜色。

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

祝你好运