2009-05-09 23 views
6

Ho bisogno di tracciare alcuni dati in varie forme. Attualmente sto usando Matplotlib e sono abbastanza soddisfatto delle trame che sono in grado di produrre.Barchart (o plot) 3D in Python

Questa domanda è su come tracciare l'ultimo. I dati sono simili alla "tabella delle distanze", come this (appena più grande, il mio tavolo è 128x128 e ha ancora 3 o più numeri per elemento).

Ora, i miei dati sono molto meglio "strutturati" di una tabella di distanza (i miei dati non variano "casualmente" come in una tabella di distanza in ordine alfabetico), quindi un 3D barchart, o forse 3 di essi, sarebbe perfezionare. La mia comprensione è che tale grafico manca in Matplotlib.

Potrei usare un (colorato) Countor3d come these o qualcosa in 2D come imshow, ma non è davvero ben rappresentativo di ciò che i dati sono (i dati hanno significato solo nei miei 128 punti, non c'è nulla tra due punti). E l'altezza delle barre è più leggibile del colore, IMO.

Così le domande:

  1. E 'possibile creare barchart 3D in Matplotlib? Dovrebbe essere chiaro che intendo con un dominio 2D, non solo un diagramma a barre 2D con un rendering 3D "finto" a fini estetici
  2. se la risposta alla domanda precedente è no, allora c'è qualche altra libreria in grado di farlo ? Preferisco fortemente qualcosa basato su Python, ma sto bene con altre possibilità compatibili con Linux
  3. se la risposta alla domanda precedente è no, allora avete qualche suggerimento su come mostrare quei dati? Per esempio. creare una tabella con i valori, sovrapposti all'immagine o ad altri colori?

risposta

5

MyavaVi2 può fare 3D barcharts (scorrere verso il basso un po '). Una volta che hai MayaVi/VTK/ETS/ecc. installato tutto funziona magnificamente, ma può essere un po 'di lavoro ottenere tutto installato. Ubuntu ha tutto il pacchetto, ma sono l'unica distribuzione Linux che conosco.

+1

Sembra buono un è un pezzo di torta da installare in Ubuntu, basta sudo apt-get install mayavi2 Purtroppo questo esempio non funzionano: da enthought.mayavi. MLAB import * ImportError: No module named MLAB mentre (suggerimento trovato on-line) da enthought.mayavi.tools.mlab import * opere, ma non forniscono barchart() Suggerimenti? – Davide

+0

quale versione di mayavi2 hai? Credo che mlab sia stato revisionato per la versione 3.1.0, e questo è ciò che la documentazione copre. – Autoplectic

+0

"mayavi2 -V" restituisce "MayaVi 2.0.2a1" – Davide

7

Per un po 'di tempo, matplotlib non ha avuto il supporto 3D, ma è stato aggiunto di nuovo recently. Avrai bisogno di usare la versione svn, dato che non è stata rilasciata alcuna release da allora, e la documentazione è un po 'scarsa (vedi esempi/mplot3d/demo.py). Non so se mplot3d supporti grafici a barre 3D reali, ma uno dei demo sembra un po 'come potrebbe essere esteso a qualcosa del genere.

Modifica: il codice sorgente per la demo è the examples ma per qualche motivo il risultato non lo è. Voglio dire la funzione test_polys, ed ecco come sembra:

example figure http://www.iki.fi/jks/tmp/poly3d.png

La funzione test_bar2D sarebbe ancora meglio, ma è commentata nella demo in quanto provoca un errore con la versione svn corrente. Potrebbe essere un problema banale, o qualcosa che è più difficile da risolvere.

+0

Il risultato della demo può essere visto da qualche parte online? In caso contrario, è possibile eseguirlo sul computer locale e modificare la risposta per mostrare il codice sorgente e l'immagine risultante? – Davide

+0

Grazie, non accetto la tua risposta dato che non funziona in questo momento, ma l'ho svalutato, e non vedo l'ora di vederlo funzionare – Davide

0

Si potrebbe verificare Direttore Grafico:

http://www.advsofteng.com

Ha un piuttosto ampia gamma di tabelle e grafici e ha una bella Python (e diverse altre lingue) API.

Ci sono due edizioni: la versione gratuita mette un mix sull'immagine generata, e la versione a pagamento ha un prezzo piuttosto ragionevole.

Ecco uno dei più interessanti 3D, guardando i grafici a barre in pila:

sample graph http://www.advsofteng.com/images/demo10.png

5

più Una possibilità è Gnuplot, che può trarre un qualche tipo di pseudo 3D bar charts, e gnuplot.py permette l'interfacciamento a gnuplot da Python. Non l'ho provato da solo, però.

+2

+1 Wow, gnuplot sta venendo dalla porta posteriore in python :-) I l'ho usato molto negli anni '90 ... Lo vedrò (ma i grafici a barre pseudo 3D sono brutti, rispetto ai nuovi strumenti ...) – Davide

1

Questo è il mio codice per un semplice Bar-3d usando matplotlib.

import mpl_toolkits 
from mpl_toolkits.mplot3d import Axes3D 
import matplotlib.pyplot as plt 
%matplotlib inline 

## The value you want to plot 
zval=[0.020752244,0.078514652,0.170302899,0.29543857,0.45358061,0.021255922,0.079022499,\ 
    0.171294169,0.29749654,0.457114286,0.020009631,0.073154019,0.158043498,0.273889264,0.419618287]  

fig = plt.figure(figsize=(12,9)) 
ax = fig.add_subplot(111,projection='3d') 
col=["#ccebc5","#b3cde3","#fbb4ae"]*5 
xpos=[1,2,3]*5 
ypos=range(1,6,1)*5 
zpos=[0]*15 
dx=[0.4]*15 
dy=[0.5]*15 
dz=zval 

for i in range(0,15,1): 
    ax.bar3d(ypos[i], xpos[i], zpos[i], dx[i], dy[i], dz[i],  
color=col[i],alpha=0.75) 

ax.view_init(azim=120) 
plt.show()  

http://i8.tietuku.com/ea79b55837914ab2.png

+0

Un po 'tardi alla festa (non lo faccio nemmeno ricorda cosa stavo cercando di tracciare in quel momento!) ma è bello vedere questa funzione finalmente implementata in matplotlib – Davide