Создание таблиц в matplotlib
Я пытаюсь создать таблицу, используя matplotlib, и мне удалось получить мои данные, но я борюсь с окончательным форматированием. Мне нужно отредактировать размер рисунка, чтобы он включал в себя все мои данные, так как некоторые из них отрубались. Вот мой текущий код:
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")
Который создает таблицу примерно так (я не совсем уверен, как пройти строки через определенные строки):
Любая помощь очень ценится!
2 ответа
Вы должны быть в состоянии решить ваши проблемы, выполнив следующие действия:
Размер рисунка (редактировать):
- Измерьте, насколько высокая и широкая клетка (например,
hcell=0.3
,wcell=1
) - Получить / узнать количество строк и столбцов (в вашем случае
len(clust_data)+1
и 3) создайте фигуру с правильным размером (возможно, вам понадобится дополнительный отступ)
fig = plt.figure(figsize=(3*wcell+wpad, nrows*hcell+hpad))
- Измерьте, насколько высокая и широкая клетка (например,
Линии в двух рядах - это оси осей.
ax.xaxis.set_visible(False) ax.yaxis.set_visible(False)
просто скрыть метки осей и галочки, а не шипы осей. Вы должны скрыть их или покрасить в белый цвет
Смотрите полное решение ниже
В любом случае: мне кажется, что вы делаете много бесполезных операций. Из вашего куска кода мне кажется, что clust_data
это уже список списков с правильной формой и cellText
после заполнения будет такой же, как clust_data
,
Кроме того, старайтесь не смешивать интерфейс OO и pyplot в matplotlib.
Следующий код должен быть эквивалентен вашему
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")
Редактировать: полное решение
Запутанный путь
Вы должны скрыть оси топоров (например, установив их белый цвет) и дать им низкий уровень zorder
затем добавьте таблицу с более высоким 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")
Простой способ (кредит @JoeKington)
Просто выключите ось
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")
Это просто любопытство. Вы можете распечатать свой стол из латекса. Если вы попробуете этот код,
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()
Вы увидите красивую таблицу в верхнем левом углу графика. Теперь почти просто написать функцию для преобразования ваших данных в строку, как в предыдущей латексной таблице.