Создание таблиц в 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()

Вы увидите красивую таблицу в верхнем левом углу графика. Теперь почти просто написать функцию для преобразования ваших данных в строку, как в предыдущей латексной таблице.

Другие вопросы по тегам