2011-12-15 23 views
19

No estoy logrando que los comandos de la tabla matplotlib funcionen correctamente. Aquí hay un ejemplo de lo que me gustaría hacer:¿Cómo puedo colocar una tabla en un diagrama en Matplotlib?

¿Alguien puede ayudar con el código de construcción de la tabla?

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

¿Ha intentado mirar más de [este] (http://matplotlib.sourceforge.net/mpl_examples/pylab_examples/table_demo.py) ejemplo? O incluso podría hacer algo [similar] (http://matplotlib.sourceforge.net/examples/pylab_examples/annotation_demo3.html), pero en lugar de las anotaciones, tienes una tabla. – cosmosis

+0

Sí, vi ese ejemplo. Cuando traté de usar el código, no pude asignar los colores y la ubicación de la fila. Tampoco pude encontrar ningún documento de ayuda sobre la sintaxis o el tipo de la llamada. En cuanto a las anotaciones, creo que hay más control que especifica un segundo eje para trazar la tabla. – user1032355

Respuesta

40

yo sepa, no se puede arbitrariamente lugar una mesa en la trama matplotlib utilizando sólo nativos matplotlib características. Lo que puede hacer es aprovechar la posibilidad de latex text rendering. Sin embargo, para hacer esto, debe tener el entorno de trabajo latex en su sistema. Si usted tiene uno, usted debe ser capaz de producir gráficos como a continuación:

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

El resultado es:

enter image description here

favor, tenga en cuenta que se trata ejemplo quick'n'dirty; deberías poder colocar la mesa correctamente jugando con coordenadas de texto. Véase también la docs si necesita cambiar las fuentes etc.

ACTUALIZACIÓN: más en pyplot.table

De acuerdo con la documentation, plt.table añade una tabla a los ejes actuales. De las fuentes es obvio, que la ubicación de la tabla en el gráfico se determina en relación con los ejes. La coordenada Y se puede controlar con las palabras clave top (gráfico superior), upper (en la mitad superior), center (en el centro), lower (en la mitad inferior) y bottom (gráfico inferior). La coordenada X se controla con las palabras clave left y right. Cualquier combinación de los dos trabajos, p. cualquiera de top left, center right y bottom está bien para usar.

lo que el gráfico más cercano a lo que desea se podría hacer con:

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

Y esto le da

enter image description here

Espero que esto ayude!

+0

Gracias Andrey, esto proporciona una solución viable para el probelem. Sin embargo, no puedo encontrar ninguna discusión/documentación de las capacidades de pyplot.table o matplotlib.Table.table en matplotlib. Me gustaría ver a alguien abordar explícitamente la pregunta de la Mesa. – user1032355

+0

Si desea ver más en pyplot.table, verifique la actualización. –

+0

Gracias Andrey! No solo respondiste la pregunta de forma clara y completa, sino que extrañé por completo la documentación de matplotlib.pyplot.table. Gracias por la respuesta y guía explícita. – user1032355

5

No estoy seguro de si las respuestas anteriores satisfacen su pregunta, también estaba buscando una manera de agregar una tabla a la trama y encontré la posibilidad de superar la limitación de "loc". cuadro delimitador se puede utilizar para controlar la posición exacta de la tabla (esto sólo contiene la creación de la tabla, pero debería 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) 

Y el resultado es (no tengo la reputación para publicar imágenes asique es un enlace): http://www.viresco.pl/media/test.png.

Tenga en cuenta que las unidades de bbox están normalizadas (no en la escala de trazado).

Cuestiones relacionadas