2012-07-13 17 views
6

Tengo una tarea simple que debería tener una solución simple, pero he estado intentando desde hace días. Intento ser específico.Mapa de color escalado de facecolors con mplot3d

  • Intento trazar una superficie usando matplotlib's mplot3d y plot_surface. Cuando trazo la superficie de un conjunto de datos 'z' y trato de escalar el mapa de colores a un determinado valor máximo, cambio la propiedad 'vmax' a este valor. Eso funciona genial

  • Cuando intento trazar una superficie de un conjunto de datos (z) y uso los colores faciales de un segundo conjunto de datos (fc), esto también funciona bien.

  • Cuando quiero escalar el mapa de colores de los colores faciales, la propiedad vmax es invalidada por los valores de facecolors. Vmax por lo tanto no tiene ningún efecto (intento1). Las líneas también desaparecieron, pero ese es otro problema.

  • También intentar cambiar los valores del dataset de facecolor (fc) no tuvo el efecto deseado (intento2).

intento conseguir una figura con un mapa de colores reducido (como en la figura 'escalada' más adelante), pero a escala para los facecolors, y no los valores z.

El código siguiente es lo que tengo ahora, y los resultados de este aspecto:

enter image description here

¿Alguien sabe lo que me falta aquí? ¡Cualquier pensamiento es apreciado!

import pylab as plt 
import numpy as np 
from mpl_toolkits.mplot3d import Axes3D 

plt.ion() 

# creating dataset 
profile = np.arange(20)**2 
z = profile.repeat(20).reshape(20,20) 
fc= np.rot90(z.copy()) 

x = np.arange(z.shape[0]) 
y = np.arange(z.shape[1]) 
X, Y = np.meshgrid(x,y) 

# plotting 
vmax = 100 
fig = plt.figure() 
ax = fig.add_subplot(1,4,1, projection='3d', azim=210) 
ax.plot_surface(X,Y,z, cmap=plt.cm.jet, cstride=1, rstride=1) 
ax.set_title('normal') 

ax = fig.add_subplot(1,4,2, projection='3d', azim=210) 
ax.plot_surface(X,Y,z, cmap=plt.cm.jet, cstride=1, rstride=1, vmax=vmax) 
ax.set_title('scaled') 

ax = fig.add_subplot(1,4,3, projection='3d', azim=210) 
ax.plot_surface(X,Y,z, facecolors=plt.cm.jet(fc), cstride=1, rstride=1, vmax=vmax) 
ax.set_title('rotated (attempt1)') 

ax = fig.add_subplot(1,4,4, projection='3d', azim=210) 
fc[fc> vmax] = vmax 
ax.plot_surface(X,Y,z, facecolors=plt.cm.jet(fc), cstride=1, rstride=1) 
ax.set_title('rotated (attempt2)') 
+0

¿Has descubierto cómo recuperar las líneas negras? Creo que estoy teniendo el mismo problema: http://stackoverflow.com/questions/12355410/fine-tuning-a-surf-plot-using-mplot3d y estoy luchando para que las líneas se muestren. – Dan

+1

Veo que su problema ya está resuelto, genial :-) – Niels

Respuesta

3

Uno - sucia - solución sería cambiar la escala de los facecolors recortadas de tal manera que el máximo es igual al máximo de su mapa de altura (además de, básicamente, lo que sugiere que el intento 2):

ax.plot_surface(X,Y,z, facecolors=plt.cm.jet(np.clip(fc,0,vmax)*np.max(z)/vmax), cstride=1, rstride=1, vmax=vmax) 

¿Esto le da el resultado que está buscando?

+0

Sí, eso hace exactamente lo que necesito. ¡Muchas gracias! – Niels

+0

Acabo de hacerlo :-), gracias de nuevo. – Niels

+0

@Niels votando respuestas útiles hace que algunas personas sean más propensas a ayudar en el futuro. Aceptar una respuesta es bueno, aceptar una respuesta que no marcó como "útil" parece extraño. – msw

Cuestiones relacionadas