2011-12-15 18 views
19

Non sto avendo alcun successo nel far funzionare i comandi della tabella matplotlib. Ecco un esempio di cosa mi piacerebbe fare:Come posso posizionare una tabella su un grafico in Matplotlib?

Qualcuno può aiutare con il codice di costruzione della tabella?

import pylab as plt 

plt.figure() 
ax=plt.gca() 
y=[1,2,3,4,5,4,3,2,1,1,1,1,1,1,1,1] 
plt.plot([10,10,14,14,10],[2,4,4,2,2],'r') 
col_labels=['col1','col2','col3'] 
row_labels=['row1','row2','row3'] 
table_vals=[11,12,13,21,22,23,31,32,33] 
# the rectangle is where I want to place the table 
plt.text(11,4.1,'Table Title',size=8) 
plt.plot(y) 
plt.show() 
+2

Hai provato a cercare su [this] (http://matplotlib.sourceforge.net/mpl_examples/pylab_examples/table_demo.py) esempio? Oppure potresti anche essere in grado di fare qualcosa [simile] (http://matplotlib.sourceforge.net/examples/pylab_examples/annotation_demo3.html), ma al posto delle annotazioni, hai una tabella. – cosmosis

+0

Sì, ho visto quell'esempio. Quando ho provato a utilizzare il codice non sono stato in grado di assegnare i colori e il posizionamento della riga. Inoltre, non sono riuscito a trovare alcuna guida per i documenti sulla sintassi o sul tipo per la chiamata. Per quanto riguarda le annotazioni, credo che ci sia più controllo che specifica un secondo asse per tracciare la tabella. – user1032355

risposta

40

per quanto ne so, non si può arbitrariamente posto un tavolo sulla matplotlib plot utilizzando solo matplotlib funzionalità native. Quello che puoi fare è sfruttare la possibilità di latex text rendering. Tuttavia, per fare questo dovresti avere un ambiente operativonel tuo sistema. Se si dispone di uno, si dovrebbe essere in grado di produrre grafici, come di seguito:

import pylab as plt 
import matplotlib as mpl 

mpl.rc('text', usetex=True) 
plt.figure() 
ax=plt.gca() 
y=[1,2,3,4,5,4,3,2,1,1,1,1,1,1,1,1] 
#plt.plot([10,10,14,14,10],[2,4,4,2,2],'r') 
col_labels=['col1','col2','col3'] 
row_labels=['row1','row2','row3'] 
table_vals=[11,12,13,21,22,23,31,32,33] 
table = r'''\begin{tabular}{ c | c | c | c } & col1 & col2 & col3 \\\hline row1 & 11 & 12 & 13 \\\hline row2 & 21 & 22 & 23 \\\hline row3 & 31 & 32 & 33 \end{tabular}''' 
plt.text(9,3.4,table,size=12) 
plt.plot(y) 
plt.show() 

Il risultato è:

enter image description here

Tiene in mente che questo è esempio quick'n'dirty; dovresti essere in grado di posizionare correttamente la tabella giocando con le coordinate del testo. Si prega di fare riferimento anche al docs se è necessario cambiare i caratteri ecc

UPDATE: più pyplot.table

Secondo il documentation, plt.table aggiunge un tavolo per assi attuali. Da fonti è ovvio, la posizione della tabella sul grafico è determinata in relazione agli assi. Y coordinata può essere controllata con le parole chiave top (grafico sopra), upper (nella metà superiore), center (al centro), lower (nella metà inferiore) e bottom (grafico in basso). La coordinata X è controllata con le parole chiave left e right. Qualsiasi combinazione dei due lavori, ad es. uno qualsiasi di top left, center right e bottom è OK da usare.

Così il grafico più vicino a ciò che si desidera potrebbe essere fatto con:

import matplotlib.pylab as plt 

plt.figure() 
ax=plt.gca() 
y=[1,2,3,4,5,4,3,2,1,1,1,1,1,1,1,1] 
#plt.plot([10,10,14,14,10],[2,4,4,2,2],'r') 
col_labels=['col1','col2','col3'] 
row_labels=['row1','row2','row3'] 
table_vals=[[11,12,13],[21,22,23],[31,32,33]] 
# the rectangle is where I want to place the table 
the_table = plt.table(cellText=table_vals, 
        colWidths = [0.1]*3, 
        rowLabels=row_labels, 
        colLabels=col_labels, 
        loc='center right') 
plt.text(12,3.4,'Table Title',size=8) 

plt.plot(y) 
plt.show() 

E questo ti dà

enter image description here

Spero che questo aiuti!

+0

Grazie Andrey, questo fornisce una soluzione praticabile al problema. Tuttavia non riesco a trovare alcuna discussione/documentazione delle funzionalità pyplot.table o matplotlib.Table.table in matplotlib. Mi piacerebbe vedere qualcuno che indirizzi esplicitamente la domanda del tavolo. – user1032355

+0

Se vuoi vedere di più su pyplot.table, controlla l'aggiornamento. –

+0

Grazie Andrey! Non solo hai risposto alla domanda in modo chiaro e completo, ma ho completamente perso la documentazione di matplotlib.pyplot.table. Grazie per la risposta e la guida esplicite. – user1032355

5

Non sono sicuro che le risposte precedenti soddisfino la tua domanda, stavo anche cercando un modo per aggiungere un tavolo alla trama e ho trovato la possibilità di superare la limitazione "loc". È possibile utilizzare casella di delimitazione per controllare la posizione esatta della tabella (questo contiene solo la creazione tavolo, ma dovrebbe essere sufficiente):

 tbl = ax1.table(
      cellText=[["a"], ["b"]], 
      colWidths=[0.25, 0.25], 
      rowLabels=[u"DATA", u"WERSJA"], 
      loc="bottom", bbox=[0.25, -0.5, 0.5, 0.3]) 

     self.ui.main_plot.figure.subplots_adjust(bottom=0.4) 

E il risultato è (non ho la reputazione di inviare le immagini ecco è un collegamento): http://www.viresco.pl/media/test.png.

Si noti che le unità di bbox sono normalizzate (non nella scala di stampa).

Problemi correlati