2012-01-17 31 views
12

¿Cómo puedo crear una trama 3D con un degradado de color para los puntos? Vea el ejemplo a continuación, que funciona para un diagrama de dispersión 2D.Diagrama de dispersión 3D de Matplotlib con gradiente de color

Editar (gracias a Chris): Lo que espero ver de la trama 3D es un gradiente de color de los puntos que van del rojo al verde como en el gráfico de dispersión 2D. Lo que veo en el gráfico de dispersión 3D son solo puntos rojos.

Solución: por alguna razón (relacionada con el ejemplo de gradiente que copié en otro lugar) ajusto xrange a len-1, lo cual altera todo en el gráfico 3D.

import numpy as np 
import matplotlib.pyplot as plt 
from mpl_toolkits.mplot3d import Axes3D 

# Create Map 
cm = plt.get_cmap("RdYlGn") 

x = np.random.rand(30) 
y = np.random.rand(30) 
z = np.random.rand(30) 
#col = [cm(float(i)/(29)) for i in xrange(29)] # BAD!!! 
col = [cm(float(i)/(30)) for i in xrange(30)] 

# 2D Plot 
fig = plt.figure() 
ax = fig.add_subplot(111) 
ax.scatter(x, y, s=10, c=col, marker='o') 

# 3D Plot 
fig = plt.figure() 
ax3D = fig.add_subplot(111, projection='3d') 
ax3D.scatter(x, y, z, s=10, c=col, marker='o') 

plt.show() 
+0

¿Qué hay de malo el diagrama de dispersión 3D? ¿Qué esperas ver de él y qué ves en realidad? Desde el código, su llamada a ['Axes3D.scatter'] (http://matplotlib.sourceforge.net/mpl_toolkits/mplot3d/tutorial.html#scatter-plots) parece estar bien. – Chris

+0

Lo que espero ver de la trama 3D es un gradiente de color de los puntos que van del rojo al verde como en la gráfica de dispersión 2D. Lo que veo en el diagrama de dispersión 3D son solo puntos rojos. –

Respuesta

0

Los siguientes trabajos: No entiendo por qué el tuyo no. Debería poder establecer el color como una secuencia de flotantes RGBA, o simplemente secuencia de flotadores.

# Create Map 
cm = plt.get_cmap("RdYlGn") 

x = np.random.rand(30) 
y = np.random.rand(30) 
z = np.random.rand(30) 
col = np.arange(30) 

# 2D Plot 
fig = plt.figure() 
ax = fig.add_subplot(111) 
ax.scatter(x, y, s=10, c=col, marker='o') 

# 3D Plot 
fig = plt.figure() 
ax3D = fig.add_subplot(111, projection='3d') 
p3d = ax3D.scatter(x, y, z, s=30, c=col, marker='o')                     

plt.show() 

Sin embargo, en ayuda de scatter, veo lo siguiente, puede estar relacionado.

A :class:`matplotlib.colors.Colormap` instance or registered 
    name. If *None*, defaults to rc ``image.cmap``. *cmap* is 
    only used if *c* is an array of floats. 
+1

Agregando ", cmap = cm" (ax3D.scatter (x, y, z, s = 30, c = col, marcador = 'o', cmap = cm)) a la función de dispersión Tengo el degradado de color también en la gráfica de dispersión 3D. Lo que extraño ahora parece ser la profundidad, pero supongo que no puedo tener ambas cosas. –

+0

¿Qué quieres decir con que no tienes profundidad? – Cenkoloji

15

Aquí se muestra un ejemplo de dispersión 3D con gradiente de colores:

import matplotlib.cm as cmx 
from mpl_toolkits.mplot3d import Axes3D 
def scatter3d(x,y,z, cs, colorsMap='jet'): 
    cm = plt.get_cmap(colorsMap) 
    cNorm = matplotlib.colors.Normalize(vmin=min(cs), vmax=max(cs)) 
    scalarMap = cmx.ScalarMappable(norm=cNorm, cmap=cm) 
    fig = plt.figure() 
    ax = Axes3D(fig) 
    ax.scatter(x, y, z, c=scalarMap.to_rgba(cs)) 
    scalarMap.set_array(cs) 
    fig.colorbar(scalarMap) 
    plt.show() 

Por supuesto, se puede elegir la escala a variar entre los diferentes valores, al igual que 0 y 1.

+3

'ax.scatter (z, y, z, c = scalarMap.to_rgba (cs))' debe ser 'ax.scatter (x, y, z, c = scalarMap.to_rgba (cs))' – orange

Cuestiones relacionadas