2013-05-01 20 views
5

PROBLEMAMatplotlib - normali sbagliato su 3D da trama


Quando si utilizza matplotlib e tramando barre 3d su un grafico ho ottenuto valori Normali sbagliate su alcuni volti a barre.


ESEMPIO


Quando ho tracciare un alto grafo bidoni densità, con 240 bar, ottengo questo risultato: enter image description here

vedere che alcuni volti di alcuni bar sono sbagliate ? Anche le battute Z sbagliano.


INFO


Sto utilizzando l'ultima versione stabile di Matplotlib e Numpy. La mia versione di Python è 2.7.3


TRONCHI


Questo è l'unico avvertimento il che ricevo da console:

RuntimeWarning: valore non valido incontrato nel dividere per n nelle normali])


Qualsiasi aiuto è molto apprezzato.


EDIT

Con @Saullo Castro risposta, questo è il nuovo grafico prodotto: enter image description here

Oppure, utilizzando il campione presentato nella risposta (vedere la regione contrassegnata con i puntini rossi):

enter image description here

Il l'unico problema rimasto è il lato della barra in alto, ma è già abbastanza buono. Se qualcuno ha commenti su questo, sentiti libero di aiutarmi.

risposta

4

Utilizzando il parametro zsort='max' quando si chiama ax.bar3d() risolve il problema (vedi here):

ax.bar3d(xpos,ypos,zpos, dx, dy, dz, color='b', alpha=1., zsort='max') 

Ho usato una versione modificata del codice da this other question di giocare con il vostro problema:

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

data = np.array([[0,1,0,2,0], 
       [0,3,0,2,0], 
       [6,1,1,7,0], 
       [0,5,0,2,9], 
       [0,1,0,4,0], 
       [9,1,3,4,2], 
       [0,0,2,1,3], ]) 

column_names = ['a','b','c','d','e'] 
row_names = ['Mon','Tue','Wed','Thu','Fri','Sat','Sun'] 

fig = plt.figure() 
ax = Axes3D(fig) 

lx= len(data[0])   # Work out matrix dimensions 
ly= len(data[:,0]) 
xpos = np.arange(0,lx,1) # Set up a mesh of positions 
ypos = np.arange(0,ly,1) 
xpos, ypos = np.meshgrid(xpos+0.5, ypos+0.5) 

xpos = xpos.flatten() # Convert positions to 1D array 
ypos = ypos.flatten() 
zpos = np.ones(lx*ly)*1e-10 

dx = 1. * np.ones_like(zpos) 
dy = dx.copy() 
dz = data.flatten() 

ax.bar3d(xpos,ypos,zpos, dx, dy, dz, color='b', alpha=1., zsort='max') 
plt.ion() 
plt.show() 
+0

Grazie @SaulloCastro Questa modifica è quasi perfetta. L'ordine Z ora è ok, tranne che per la faccia superiore delle barre. Posterò la nuova immagine prodotta –

+0

Buono a sapersi! Pubblica e possiamo dare un'occhiata a questo ... –

+0

È già lì. Se avete commenti, per favore, sentitevi liberi di modificare. Grazie! –

Problemi correlati