2014-09-14 20 views
6

Ho un grafico con 9 righe, che rappresenta i set di dati con due parametri variabili, ad esempio f_11, f_12, f_13, ..., f_33. Per rendere la trama (un po 'più chiara), codifico il primo parametro come colore della linea e il secondo come stile di linea (quindi f_11 è rosso & tratteggiato, f12 è rosso & punteggiato, f21 è verde & tratteggiato, f22 è verde & puntinato, ecc.). Così, per la leggenda, vorrei fare una tabella 3x3, guardando comelayout legenda tabulare per matplotlib

 | value1 | value2 | value3 
--------------------------------- 
value1 | 
value2 | <artists go there> 
value3 | 

C'è un modo posso fare questo con matplotlib? Un'idea sarebbe quella di creare questa scatola con LaTeX, ma ho bisogno di un modo per tracciare gli artisti leggendari nella giusta posizione.

Grazie!

(crosspossted da matplotlib utenti)

risposta

1

Se è necessario creare una tabella leggibile, è possibile utilizzare PrettyTable modulo

Per esempio, in questo codice python2.7

from prettytable import PrettyTable 

x = PrettyTable(["City name", "Area", "Population", "Annual Rainfall"]) 
x.align["City name"] = "l" # Left align city names 
x.padding_width = 1 # One space between column edges and contents (default) 
x.add_row(["Adelaide",1295, 1158259, 600.5]) 
x.add_row(["Brisbane",5905, 1857594, 1146.4]) 
x.add_row(["Darwin", 112, 120900, 1714.7]) 
x.add_row(["Hobart", 1357, 205556, 619.5]) 
x.add_row(["Sydney", 2058, 4336374, 1214.8]) 
x.add_row(["Melbourne", 1566, 3806092, 646.9]) 
x.add_row(["Perth", 5386, 1554769, 869.4]) 
print x 

in grado di produrre questa uscita:

+-----------+------+------------+-----------------+ 
| City name | Area | Population | Annual Rainfall | 
+-----------+------+------------+-----------------+ 
| Adelaide | 1295 | 1158259 |  600.5  | 
| Brisbane | 5905 | 1857594 |  1146.4  | 
| Darwin | 112 | 120900 |  1714.7  | 
| Hobart | 1357 | 205556 |  619.5  | 
| Sydney | 2058 | 4336374 |  1214.8  | 
| Melbourne | 1566 | 3806092 |  646.9  | 
| Perth  | 5386 | 1554769 |  869.4  | 
+-----------+------+------------+-----------------+ 
+0

No, voglio questa tabella per essere incorporato in figura matplotlib. Creare una tabella ASCII è facile (anche se noioso). – antony

12

Non è una domanda molto facile ma immagino fuori Il trucco che uso è inizializzare un rettangolo vuoto che funge da maniglia. Queste maniglie vuote aggiuntive vengono utilizzate per costruire la tabella. I sbarazzarsi di qualsiasi spazio eccessivo usando handletextpad:

import numpy 
import pylab 
import matplotlib.pyplot as plt 
from matplotlib.patches import Rectangle 

fig = plt.figure() 
ax = fig.add_subplot(111) 

im1 ,= ax.plot(range(10), pylab.randn(10), "r--") 
im2 ,= ax.plot(range(10), pylab.randn(10), "g--") 
im3 ,= ax.plot(range(10), pylab.randn(10), "b--") 
im4 ,= ax.plot(range(10), pylab.randn(10), "r.") 
im5 ,= ax.plot(range(10), pylab.randn(10), "g.") 
im6 ,= ax.plot(range(10), pylab.randn(10), "b.") 
im7 ,= ax.plot(range(10), pylab.randn(10), "r^") 
im8 ,= ax.plot(range(10), pylab.randn(10), "g^") 
im9 ,= ax.plot(range(10), pylab.randn(10), "b^") 

# create blank rectangle 
extra = Rectangle((0, 0), 1, 1, fc="w", fill=False, edgecolor='none', linewidth=0) 

#Create organized list containing all handles for table. Extra represent empty space 
legend_handle = [extra, extra, extra, extra, extra, im1, im2, im3, extra, im4, im5, im6, extra, im7, im8, im9] 

#Define the labels 
label_row_1 = [r"$f_{i,j}$", r"$i = 1$", r"$i = 2$", r"$i = 3$"] 
label_j_1 = [r"$j = 1$"] 
label_j_2 = [r"$j = 2$"] 
label_j_3 = [r"$j = 3$"] 
label_empty = [""] 

#organize labels for table construction 
legend_labels = numpy.concatenate([label_row_1, label_j_1, label_empty * 3, label_j_2, label_empty * 3, label_j_3, label_empty * 3]) 

#Create legend 
ax.legend(legend_handle, legend_labels, 
      loc = 9, ncol = 4, shadow = True, handletextpad = -2) 

plt.show() 

enter image description here

+1

So che non dovremmo essere chiacchieroni su SO, ma questo è elegante e fantastico. Molto molto carino. – Ajean

+0

Questa è una soluzione eccezionale e merita davvero la taglia. – antony

Problemi correlati