2015-08-13 2 views
5

J'essaie d'utiliser ax.scatter pour tracer un graphique de diffusion 3D. J'ai lu les données d'un fichier fits et stocké les données de trois colonnes dans x, y, z. Et j'ai vérifié que les données x, y, z sont de la même taille. z a été normalisé entre 0 et 1.Matplotlib 3D utiliser colormap

import numpy as np 
import matplotlib 
from matplotlib import pylab,mlab,pyplot,cm 
plt = pyplot 
import pyfits as pf 
from mpl_toolkits.mplot3d import Axes3D 
import fitsio 

data = fitsio.read("xxx.fits") 

x=data["x"] 
y=data["y"] 
z=data["z"] 
z = (z-np.nanmin(z)) /(np.nanmax(z) - np.nanmin(z)) 

Cen3D = plt.figure() 
ax = Cen3D.add_subplot(111, projection='3d') 

cmap=cm.ScalarMappable(norm=z, cmap=plt.get_cmap('hot')) 
ax.scatter(x,y,z,zdir=u'z',cmap=cmap) 

ax.set_xlabel('x') 
ax.set_ylabel('y') 
ax.set_zlabel('z') 
plt.show() 

Ce que j'essaie de faire, c'est d'utiliser la couleur pour indiquer la taille de z. Comme une valeur plus élevée de z obtiendra une couleur plus sombre. Mais je continue à obtenir un complot sans la palette de couleurs que je veux, ils sont tous la même couleur par défaut en bleu. Qu'ai-je fait de mal? Merci.

Répondre

5

Vous pouvez utiliser le mot-clé c dans la commande scatter pour lui indiquer comment colorer les points.

Vous n'avez pas besoin de mettre zdir, comme that is for when you are plotting a 2d set

Comme @Lenford a souligné, vous pouvez utiliser cmap='hot' dans ce cas aussi, puisque vous avez déjà normalisé vos données.

J'ai modifié votre exemple pour utiliser des données aléatoires plutôt que votre fichier d'ajustement.

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

x = np.random.rand(100) 
y = np.random.rand(100) 
z = np.random.rand(100) 

z = (z-np.nanmin(z)) /(np.nanmax(z) - np.nanmin(z)) 

Cen3D = plt.figure() 
ax = Cen3D.add_subplot(111, projection='3d') 

ax.scatter(x,y,z,cmap='hot',c=z) 

ax.set_xlabel('x') 
ax.set_ylabel('y') 
ax.set_zlabel('z') 
plt.show() 

enter image description here

+0

Ça a marché, merci! – frankgut

+1

@frankgut Comme cette réponse a fonctionné pour vous s'il vous plaît [accepter la réponse] (http://stackoverflow.com/help/someone-answers), de sorte que la question montre comme réponse. –

+1

Notez également - si vous voulez que les valeurs * supérieures * aient une couleur * plus foncée * selon le Q, utilisez 'c = -z'. –

2

Selon le pyplot.scatter documentation, les points spécifiés pour être tracés doivent être sous la forme d'un tableau de flottants pour que cmap s'applique, sinon la couleur par défaut (dans ce cas, jet) continuera à s'appliquer. En outre, simplement indiquer cmap='hot' fonctionnera pour ce code, comme la carte de couleur hot est une carte de couleur enregistrée dans matplotlib.

+0

Il a travaillé, je vous remercie! – frankgut