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))
- Mida qué tan alto y ancho es una celda (por ejemplo,
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")