2015-08-13 7 views
5

Ich versuche mit ax.scatter ein 3D-Streudiagramm zu plotten. Ich habe die Daten aus einer Fits-Datei gelesen und Daten aus drei Spalten in x, y, z gespeichert. Und ich habe sichergestellt, dass x, y, z Daten die gleiche Größe haben. z wurde zwischen 0 und 1 normiert.Matplotlib 3D-Plot Verwendung 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() 

Was ich versuche zu erreichen, ist Farbe verwenden, um die Größe von z anzugeben. Je höher der Wert von z wird, desto dunkler wird die Farbe. Aber ich bekomme immer eine Zeichnung ohne die Colormap, die ich möchte, sie sind alle die gleiche blaue Standardfarbe. Was habe ich falsch gemacht? Vielen Dank.

Antwort

5

Sie können das Schlüsselwort c im Befehl scatter verwenden, um ihm mitzuteilen, wie die Punkte eingefärbt werden sollen.

Sie brauchen nicht zdir zu setzen, wie that is for when you are plotting a 2d set

Wie @Lenford wies darauf hin, Sie cmap='hot' in diesem Fall verwenden, da Sie bereits Ihre Daten normalisiert.

Ich habe Ihr Beispiel geändert, um einige zufällige Daten anstelle Ihrer Datei passt.

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

Es hat funktioniert, danke! – frankgut

+1

@frangkgut Da diese Antwort für dich funktioniert hat, bitte [akzeptiere die Antwort] (http://stackoverflow.com/help/someone-answers), damit die Frage wie beantwortet angezeigt wird. –

+1

Beachten Sie auch - wenn Sie wollen, dass die * höheren * Werte eine * dunklere * Farbe haben wie im Q, verwenden Sie 'c = -z'. –

2

Gemäß der pyplot.scatter documentation müssen die Punkte, die zum Plotten angegeben werden, in Form eines Arrays von Schwimmern für die Anwendung von cmap vorliegen, andernfalls wird die Standardfarbe (in diesem Fall Jet) weiterhin angewendet.

Nebenbei gesagt funktioniert einfach für diesen Code cmap='hot', da die Farbkarte hot eine registrierte Farbkarte in Matplotlib ist.

+0

Es funktionierte, danke! – frankgut