it-swarm-pt.tech

Como posso colocar uma tabela em uma plotagem no Matplotlib?

Não estou tendo sucesso em fazer com que os comandos da tabela matplotlib funcionem. Aqui está um exemplo do que eu gostaria de fazer:

Alguém pode ajudar com o código de construção da tabela?

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

AFAIK, você não pode arbitrariamente colocar uma tabela no gráfico matplotlib usando apenas recursos nativos matplotlib. O que você pode fazer é aproveitar a possibilidade de latex renderização de texto . No entanto, para fazer isso, você deve ter o ambiente de trabalho latex em seu sistema. Se você tiver um, poderá produzir gráficos como abaixo:

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

O resultado é:

enter image description here

Por favor, lembre-se de que este é um exemplo rápido; você poderá posicionar a mesa corretamente jogando com coordenadas de texto. Consulte também docs se você precisar alterar fontes etc.

UPDATE: mais sobre pyplot.table

De acordo com documentação , plt.table Adiciona uma tabela aos eixos atuais. De fontes, é óbvio que a localização da tabela no gráfico é determinada em relação aos eixos. A coordenada Y pode ser controlada com as palavras-chave top (gráfico acima), upper (na metade superior), center (no centro), lower (na metade inferior) e bottom (abaixo do gráfico). A coordenada X é controlada com as palavras-chave left e right. Qualquer combinação dos dois trabalhos, p. qualquer um de top left, center right e bottom podem ser usados.

Portanto, o gráfico mais próximo do que você deseja pode ser criado:

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 isso lhe dá

enter image description here

Espero que isto ajude!

47
Andrey Sobolev

Não tenho certeza se as respostas anteriores satisfazem sua pergunta, eu também estava procurando uma maneira de adicionar uma tabela ao enredo e encontrei a possibilidade de superar a limitação "loc". Você pode usar a caixa delimitadora para controlar a posição exata da tabela (isso contém apenas a criação da tabela, mas deve ser suficiente):

        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 o resultado é (não tenho reputação de postar imagens, por isso aqui está um link): http://www.viresco.pl/media/test.png .

Observe que as unidades bbox são normalizadas (não na escala de plotagem).

6
lutecki