Сохранение таблицы matplotlib создает много пробелов

Я использую matplotlib и python 2.7 для создания некоторых таблиц. Когда я сохраняю таблицы, изображения получаются квадратными, даже если таблица состоит всего из 1 - 2 строк, создавая много пустого пространства, когда я добавляю их в автоматически сгенерированный PDF позже. Пример того, как я использую код, здесь...

import matplotlib.pyplot as plt

t_data = ((1,2), (3,4))
table = plt.table(cellText = t_data, colLabels = ('label 1', 'label 2'), loc='center')
plt.axis('off')
plt.grid('off')
plt.savefig('test.png')

Это создает изображение, подобное этому... Вы можете видеть, что можете видеть пустое пространство вокруг него

Странно используя plt.show() выдает таблицу в графическом интерфейсе без пробелов.

Я пытался использовать различные формы tight_layout=True без удачи, а также сделать фон прозрачным (он становится прозрачным, но все еще есть).

Любая помощь будет принята с благодарностью.

1 ответ

Решение

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

import matplotlib.pyplot as plt

fig = plt.figure(figsize=(6,1))

t_data = ((1,2), (3,4))
table = plt.table(cellText = t_data, 
                  colLabels = ('label 1', 'label 2'),
                  rowLabels = ('row 1', 'row 2'),
                  loc='center')

plt.axis('off')
plt.grid('off')

plt.savefig(__file__+'test2.png', bbox_inches="tight" )
plt.show()

введите описание изображения здесь

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

import matplotlib.pyplot as plt
import matplotlib.transforms

t_data = ((1,2), (3,4))
table = plt.table(cellText = t_data, 
                  colLabels = ('label 1', 'label 2'),
                  rowLabels = ('row 1', 'row 2'),
                  loc='center')

plt.axis('off')
plt.grid('off')

#prepare for saving:
# draw canvas once
plt.gcf().canvas.draw()
# get bounding box of table
points = table.get_window_extent(plt.gcf()._cachedRenderer).get_points()
# add 10 pixel spacing
points[0,:] -= 10; points[1,:] += 10
# get new bounding box in inches
nbbox = matplotlib.transforms.Bbox.from_extents(points/plt.gcf().dpi)
# save and clip by new bounding box
plt.savefig(__file__+'test.png', bbox_inches=nbbox, )

plt.show()

введите описание изображения здесь

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