realpython guide examples python matplotlib

python - guide - Crear tablas en matplotlib



plot() python (2)

Intento crear una tabla con matplotlib y logré 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 están siendo cortados. 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 cual crea una tabla como tal (no estoy seguro de cómo mover las líneas a través de ciertas filas):

¡Cualquier ayuda es muy apreciada!


Es solo una curiosidad. Puede imprimir su tabla de látex. Si prueba 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 mesa bella en la parte superior izquierda de la trama. Ahora, es casi sencillo escribir una función para transformar sus datos en una cadena como la tabla anterior de látex.


Debería poder resolver sus problemas haciendo lo siguiente:

  • Tamaño de la figura ( editar ):

    • Mida qué tan alto y ancho es una celda (por ejemplo, hcell=0.3 , wcell=1 )
    • Obtenga / sepa la cantidad de filas y columnas (en su caso len(clust_data)+1 y 3)
    • crea la figura con el tamaño correcto (es posible que desees un relleno extra)

      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)

    simplemente esconde las etiquetas 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 un montón de operaciones inútiles. Desde su fragmento de código, me parece que clust_data ya es una lista de listas con la forma correcta y que cellText después de ser llenado será el mismo de clust_data .
Además, intente no mezclar la interfaz OO y pyplot de matplotlib.

El siguiente código debería 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")

Editar: solución completa

Forma enrevesada

Tienes que esconder las espinas de los ejes (p. Ej., Establecer su color blanco) y darles zorder bajo, luego agregar la tabla con mayor 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)

Simplemente 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")