2010-12-06 6 views
6

Por mi vida no puedo encontrar la manera de obtener los mismos resultados que this.matplotlib color en trazado 3D de un conjunto de datos x, y, z sin usar el contorno

El enlace genera la trama 3D coloreada sin usar el contorno. Si utilizo la misma técnica, pero con mi propio conjunto de datos x, y, z obtengo solo un color.

La diferencia debe estar en la forma en que estoy generando los datos z para la gráfica.

De todos modos, el uso de este:

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

conjunto de datos: se muestra

-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 

un solo color. También observe que la barra de color no tiene tics.

¿Puede explicarme cuál es mi problema?

+0

Yo diría que no estás usando Axes3D.plot_surface. Importas Axes3D pero luego no lo usas. – joaquin

+0

Se usa en ax = fig.add_subplot (111, projection = '3d'), Si elimino Axes3d, el script generará un error en esa línea. – hl3fx

Respuesta

2

La forma más fácil de leer datos de texto es a través de genfromtxt:

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

sys no es necesario.

+0

ja, ¡gracias por el bocado! :) – hl3fx

+0

Uso sys para salir de la secuencia de comandos aleatoriamente mientras codigo para probar cosas. sys.exit() – hl3fx

16

Creo que hay un problema con la superficie de relleno "discontinuo" (cuadrícula). alt text

Código:

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

Tenga en cuenta que si se tiene en cuenta la superficie por encima de un área rectangular (xi x yi), este código está funcionando correctamente. En otras palabras, si "cortó" bordes irregulares.

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

alt text

+0

Gracias por los comentarios. Todavía estoy tratando de resolverlo. Me pregunto si hay otra forma de obtener los datos z sin usar griddata. – hl3fx

+0

¿Un síntoma de lo anterior también podría ser la falta de marcas en la barra de color? Creo que estos dos problemas están directamente relacionados. en el código de ejemplo, los tics se muestran representando los diferentes colores a la altura z. Si imprime Z en el código de ejemplo, se muestra un conjunto de listas llenas de números; en el código anterior, si imprime Z, se muestra una lista de ---. ¿Algunas ideas? – hl3fx

+0

hmm, gracias por encontrar eso. Ahora, ¿cómo arreglar la superficie rota? Encontré a otra persona con el mismo problema aquí: http://old.nabble.com/plot_surface-masked-array-tt27266471.html#a27266471. Desafortunadamente no hubo respuesta a su pregunta. – hl3fx

2

acabo luchaban con el problema similar.

Finalmente, tuvimos que utilizar natgrid (que se hace referencia here pero el enlace no funciona) en lugar de gridData.

para mí el truco con el corte de la región de trazado no funcionaba, siempre estaba en un color.

Al instalar PyNGL compruebe que tiene la última versión de numpy.

Buena suerte

Cuestiones relacionadas