2014-09-14 14 views
6

Ich habe ein Diagramm mit 9 Zeilen, die Datensätze mit zwei verschiedenen Parametern, sagen f_11, f_12, f_13, ..., f_33. Um das Diagramm (ein bisschen) klarer zu machen, kodiere ich den ersten Parameter als Farbe der Linie und den zweiten als Linienstil (so f_11 ist rot & gestrichelt, f12 ist rot & punktiert, f21 ist grün & gestrichelt, f22 ist grün & punktiert, usw.). Also, für die Legende, würde Ich mag einen 3x3 Tisch machen, die aussehen wieTabellenlegende Layout für Matplotlib

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

Gibt es eine Möglichkeit, dies mit matplotlib machen kann? Eine Idee wäre es, diese Box mit LaTeX zu machen, aber ich brauche eine Möglichkeit, die Legendenkünstler an der richtigen Stelle zu plazieren.

Danke!

(crosspossted von matplotlib-Benutzer)

Antwort

1

Wenn Sie eine lesbare Tabelle erstellen, müssen Sie PrettyTable Modul

Zum Beispiel in python2.7

diesen Code verwenden können
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 

Kann sich Dieser Ausgang:

+-----------+------+------------+-----------------+ 
| 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

Nein, ich möchte diese Tabelle in der matplotlib Figur eingebettet werden. Das Erstellen einer ASCII-Tabelle ist einfach (wenn auch mühsam). – antony

12

Keine sehr einfache Frage, aber ich denke d es raus. Der Trick, den ich verwende, besteht darin, ein leeres Rechteck zu initialisieren, das als Handle fungiert. Diese zusätzlichen leeren Handles werden zum Erstellen der Tabelle verwendet. Ich werde jeden übermäßigen Raum los mit 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

Ich weiß, dass wir nicht SO gesprächig sein sollen, aber das ist elegant und großartig. Sehr sehr nett. – Ajean

+0

Dies ist eine großartige Lösung und verdient wirklich die Prämie. – antony