Creando tablas en matplotlib

Estoy tratando de hacer una tabla usando matplotlib y he logrado obtener mis datos pero estoy luchando con el formato final. Necesito editar el tamaño de la figura para incluir todos mis datos, ya que algunos se eliminan. Aquí está mi código actual:

for struct, energy, density in clust_data: fig=plt.figure() ax = plt.gca() ax.xaxis.set_visible(False) ax.yaxis.set_visible(False) colLabels=("Structure", "Energy", "Density") rows=len(clust_data) cellText=[] for row in clust_data: cellText.append(row) the_table = ax.table(cellText=cellText, colLabels=colLabels, loc='center') plt.savefig("table.png") 

Lo que crea una tabla como esa (tampoco estoy completamente seguro de cómo desplazarme de las líneas a través de ciertas filas): introduzca la descripción de la imagen aquí

¡Cualquier ayuda es muy apreciada!

Debería poder resolver sus problemas haciendo lo siguiente:

  • Tamaño de la figura ( editar ):

    • Mida cuán alto y ancho es una celda (por ejemplo, hcell=0.3 , wcell=1 )
    • Obtenga / sepa el número de filas y columnas (en su caso, len(clust_data)+1 y 3)
    • cree la figura con el tamaño correcto (es posible que desee un relleno adicional)

       fig = plt.figure(figsize=(3*wcell+wpad, nrows*hcell+hpad)) 
  • Las líneas dentro de las dos filas son las espinas de los ejes.

     ax.xaxis.set_visible(False) ax.yaxis.set_visible(False) 

    solo oculta las tags de los ejes y las marcas, no las espinas de los ejes. Tienes que esconderlos o colorearlos en blanco.

ver la solución completa a continuación


En cualquier caso: me parece que estás haciendo muchas operaciones inútiles. Desde su parte del código, me parece que clust_data ya es una lista de listas con la forma correcta y que el texto de cellText después de rellenarse será el mismo que clust_data .
Además, intente no mezclar la interfaz OO y pyplot de matplotlib.

El siguiente código debe ser equivalente al tuyo.

 fig=plt.figure() ax = fig.add_subplot(111) ax.xaxis.set_visible(False) ax.yaxis.set_visible(False) colLabels=("Structure", "Energy", "Density") the_table = ax.table(cellText=clust_data, colLabels=colLabels, loc='center') plt.savefig("table.png") 

Edición: solución completa

Manera complicada

Tienes que ocultar las espinas de los ejes (por ejemplo, establecer su color blanco) y darles un orden zorder bajo zorder luego agregar la tabla con un zorder más zorder

 colLabels=("Structure", "Energy", "Density") nrows, ncols = len(clust_data)+1, len(colLabels) hcell, wcell = 0.3, 1. hpad, wpad = 0, 0 fig=plt.figure(figsize=(ncols*wcell+wpad, nrows*hcell+hpad)) ax = fig.add_subplot(111) #remove axis ticks and labels ax.xaxis.set_visible(False) ax.yaxis.set_visible(False) #hide the spines for sp in ax.spines.itervalues(): sp.set_color('w') sp.set_zorder(0) #do the table the_table = ax.table(cellText=clust_data, colLabels=colLabels, loc='center') #put the table in front of the axes spines #for some reason zorder is not a keyword in ax.table the_table.set_zorder(10) plt.savefig("table.png") 

Manera simple (crédito @JoeKington)

Apenas apague el eje

 colLabels=("Structure", "Energy", "Density") nrows, ncols = len(clust_data)+1, len(colLabels) hcell, wcell = 0.3, 1. hpad, wpad = 0, 0 fig=plt.figure(figsize=(ncols*wcell+wpad, nrows*hcell+hpad)) ax = fig.add_subplot(111) ax.axis('off') #do the table the_table = ax.table(cellText=clust_data, colLabels=colLabels, loc='center') plt.savefig("table.png") 

Es sólo una curiosidad. Puedes imprimir tu tabla desde látex. Si intentas este código,

 import matplotlib.pyplot as plt import numpy as np table = r'\begin{table} \begin{tabular}{|l|l|l|} \hline $\alpha$ & $\beta$ & $\gamma$ \\ \hline 32 & $\alpha$ & 123 \\ \hline 200 & 321 & 50 \\ \hline \end{tabular} \end{table}' plt.plot(np.arange(100)) plt.text(10,80,table, size=50) plt.show() 

Verás una tabla hermosa en la parte superior izquierda de la ttwig. Ahora, es casi sencillo escribir una función para transformar sus datos en una cadena como la tabla de látex anterior.