Сохраните подзаголовок в matplotlib
Можно ли сохранить (в png) отдельный подзаговор в фигуре matplotlib? Допустим, у меня есть
import pylab as p
ax1 = subplot(121)
ax2 = subplot(122)
ax.plot([1,2,3],[4,5,6])
ax.plot([3,4,5],[7,8,9])
Можно ли сохранить каждую из двух подзаголовков в разные файлы или, по крайней мере, скопировать их отдельно на новую цифру, чтобы сохранить их?
Я использую версию 1.0.0 matplotlib на RHEL 5.
Спасибо,
Роберт
Ответы
Ответ 1
В то время как @Eli совершенно правильно, что обычно не так много нужно делать, это возможно. savefig
принимает аргумент bbox_inches
, который может использоваться для выборочного сохранения только части фигуры на изображение.
Вот пример:
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
# Make an example plot with two subplots...
fig = plt.figure()
ax1 = fig.add_subplot(2,1,1)
ax1.plot(range(10), 'b-')
ax2 = fig.add_subplot(2,1,2)
ax2.plot(range(20), 'r^')
# Save the full figure...
fig.savefig('full_figure.png')
# Save just the portion _inside_ the second axis boundaries
extent = ax2.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
fig.savefig('ax2_figure.png', bbox_inches=extent)
# Pad the saved area by 10% in the x-direction and 20% in the y-direction
fig.savefig('ax2_figure_expanded.png', bbox_inches=extent.expanded(1.1, 1.2))
Полная цифра:
![Full Example Figure]()
Площадь внутри второго подзаголовка:
![Inside second subplot]()
Площадь вокруг второго подзаголовка, заполненного на 10% в направлении x и 20% в направлении y:
![Full second subplot]()
Ответ 2
Применяя функцию full_extent()
в ответе @Joe через 3 года после здесь, вы можете получить именно то, что искали OP. В качестве альтернативы вы можете использовать Axes.get_tightbbox()
, который дает немного более жесткую ограничительную рамку
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
from matplotlib.transforms import Bbox
def full_extent(ax, pad=0.0):
"""Get the full extent of an axes, including axes labels, tick labels, and
titles."""
# For text objects, we need to draw the figure first, otherwise the extents
# are undefined.
ax.figure.canvas.draw()
items = ax.get_xticklabels() + ax.get_yticklabels()
# items += [ax, ax.title, ax.xaxis.label, ax.yaxis.label]
items += [ax, ax.title]
bbox = Bbox.union([item.get_window_extent() for item in items])
return bbox.expanded(1.0 + pad, 1.0 + pad)
# Make an example plot with two subplots...
fig = plt.figure()
ax1 = fig.add_subplot(2,1,1)
ax1.plot(range(10), 'b-')
ax2 = fig.add_subplot(2,1,2)
ax2.plot(range(20), 'r^')
# Save the full figure...
fig.savefig('full_figure.png')
# Save just the portion _inside_ the second axis boundaries
extent = full_extent(ax2).transformed(fig.dpi_scale_trans.inverted())
# Alternatively,
# extent = ax.get_tightbbox(fig.canvas.renderer).transformed(fig.dpi_scale_trans.inverted())
fig.savefig('ax2_figure.png', bbox_inches=extent)
Я бы опубликовал рис, но мне не хватает очков репутации