Сохранение таблицы 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()