2014-09-14 5 views
6

У меня есть сюжет с 9 строками, представляющий наборы данных с двумя переменными параметрами, скажем f_11, f_12, f_13, ..., f_33. Чтобы сделать график (бит) яснее, я кодирую первый параметр как цвет линии, а второй - как linestyle (поэтому f_11 красный & пунктир, f12 красный & пунктир, f21 зеленый & пунктирный, f22 - зеленый & пунктир и т.п.). Так, для легенды, я хотел бы сделать таблицу 3х3, похожийТабличная легенда для matplotlib

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

Есть ли способ, что я могу сделать это с Matplotlib? Идея заключалась бы в том, чтобы сделать эту коробку с LaTeX, но мне нужен способ запечатлеть художников-легенд в правильном положении.

Спасибо!

(crosspossted от Matplotlib пользователей)

ответ

1

Если вам необходимо создать читаемую таблицу, вы можете использовать модуль PrettyTable

Например, в 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 

Может производить этот выход:

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

Нет, я хочу эту таблицу для встраивания в Matplotlib рисунке. Создание таблицы ASCII легко (даже утомительно). – antony

12

Не очень простой вопрос, но я фигурирую это. Трюк, который я использую, заключается в инициализации пустого прямоугольника, который действует как дескриптор. Эти дополнительные пустые дескрипторы используются для построения таблицы. Избавиться от любого чрезмерного пространства с помощью 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, но это элегантно и удивительно. Очень очень хорошо. – Ajean

+0

Это потрясающее решение и действительно заслуживает щедрости. – antony

Смежные вопросы