2017-10-11 2 views
0

J'ai un ensemble de données, avec des coordonnées que j'extrais pour former les composantes x, y et z de mon point. Dans cette même base de données, j'ai une intensité (appelons-la j) que je voudrais utiliser pour mapper la carte de couleurs sur le point. Mon script pour ajouter des points sur l'itération de mon Pandas dataframe:La carte de couleurs pour les diagrammes de dispersion 3D dans matplotlib n'est pas correctement appliquée

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

for row, index in df.iterrows(): 
    x = df[row]['x'] 
    y = df[row]['y'] 
    z = df[row]['z'] 
    ax.scatter(x, y, z, cmap='bwr', c=df[row]['j']) 

plt.show() 

Cependant, tous les points sont d'une couleur singulière et ne répondent pas à avoir différentes nuances de couleurs par point, tel que défini par df[row]['j'] (qui retourne un entier correspondant à l'intensité de mon point). Ai-je manqué quelque chose d'évident ou la boucle for rend-elle impossible le mappage des couleurs (c'est-à-dire définir une référence pour la couleur à chaque itération et ne pas distinguer un min/max puisque chaque nouveau point crée un nouveau min/max)?

Merci!

Répondre

1

Cela devrait fonctionner:

ax.scatter(df['x'], df['y'], df['z'], cmap='bwr', c=df['j']) 

(sans boucle)

1

Je pense que vous voulez obtenir la carte comme ceci: enter image description here

Mon code est d'utiliser directement le df.column vous vouloir tracer:

import pandas as pd 
import matplotlib.pyplot as plt 
import io 
from mpl_toolkits.mplot3d import Axes3D 
t=""" 
0 , 1 , 0 , b 
2 , 1 , 2 , b 
3 , 2 , 1 , r 
2 , 3 , 5 , r 
3 , 2 , 5 , b 
7 , 3 , 6 , g 
8 , 3 , 6 , g 
2 , 3 , 6 , g 
7 , 3 , 6 , g 
8 , 3 , 6 , g 
2 , 3 , 6 , g 
2 , 3 , 6 , g 
3 , 4 , 6 , g 
5 , 2 , 6 , r 
6 , 2 , 6 , r 
7 , 3 , 6 , r 
2 , 1 , 6 , g 
7 , 13 , 6 , r 
8 , 23 , 6 , r 
2 , 33 , 6 , r 
""" 

df=pd.read_csv(io.StringIO(t),names=['x','y','z','j'],sep=',') 
fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 


ax.scatter(df.x, df.y, df.z,c=df.y) 

plt.show() 

J'espère vous aider.