Подтвердить что ты не робот

Как разместить таблицу на графике в Matplotlib?

Я не добился успеха в работе команд таблицы matplotlib. Вот пример того, что я хотел бы сделать:

Может ли кто-нибудь помочь с кодом построения таблицы?

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()
4b9b3361

Ответ 1

AFAIK, вы не можете произвольно разместить таблицу на графике matplotlib, используя только собственные функции matplotlib. Что вы можете сделать, это воспользоваться возможностью latex текстового рендеринга. Однако для этого у вас должна быть рабочая среда latex в вашей системе. Если у вас есть, вы должны иметь возможность создавать графики, например, ниже:

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()

Результат:

enter image description here

Пожалуйста, имейте в виду, что это быстрый пример; вы должны правильно разместить таблицу, играя с текстовыми координатами. Пожалуйста, также обратитесь к документам, если вам нужно изменить шрифты и т.д.

ОБНОВЛЕНИЕ: больше на pyplot.table

В соответствии с документацией plt.table добавляет таблицу к текущим осям. Из источников очевидно, что расположение таблицы на графике определяется относительно осей. Координату Y можно контролировать с помощью ключевых слов top (выше графика), upper (в верхней половине), center (в центре), lower (в нижней половине) и bottom ( ниже графика). Координата X контролируется ключевыми словами left и right. Любая комбинация двух произведений, например. любой из top left, center right и bottom подходит для использования.

Итак, ближайший график к тому, что вы хотите, можно сделать с помощью

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()

И это дает вам

enter image description here

Надеюсь, это поможет!

Ответ 2

Я не уверен, что если предыдущие ответы удовлетворяют вашему вопросу, я также искал способ добавления таблицы к сюжету и нашел возможность преодолеть ограничение "loc". Вы можете использовать ограничительную рамку для управления точным расположением таблицы (это только содержит создание таблицы, но должно быть достаточно):

        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)

И результат (у меня нет репутации для отправки изображений, так что вот ссылка): http://www.viresco.pl/media/test.png.

Обратите внимание, что единицы bbox нормированы (не в масштабе графика).