сохранение фигуры с изменением размера в matplotlib

Отображая свой график в matplotlib, я также пытаюсь сохранить его в формате png, используя разные размеры. Я делаю копию своей основной фигуры (print_fig = fig), а затем меняю размер print_fig (print_fig.set_size_inches(7,3)). Однако это относится к изменению моего исходного рисунка, а не только к print_fig. Есть ли способ «клонировать» объект фигуры?

Мой код выглядит примерно так:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(10)

fig = plt.figure()
ax = plt.subplot(111)
ax.set_ylabel("y-label")

for i in xrange(5):
    ax.plot(x, i * x, label='$y = %ix$' % i)

ax.legend()
#change dimension of figure for print 
#clone fig displayed
print_fig = fig
print_fig.set_size_inches(7,3)
print_fig.savefig('print_fig.png')
plt.show()

вот как выглядит мой экран: введите здесь описание изображения


person dimka    schedule 16.01.2013    source источник


Ответы (2)


Если вы хотите сохранить png в разных разрешениях, вам не нужно изменять размер рисунка. Вы можете просто контролировать размер изображения с помощью ключевого слова dpi в savefig.

Когда вы вызываете savefig, по умолчанию используется rc savefig.dpi (вы можете проверить это в файле .matplotlibrc, обычно это 100). Поэтому, если вы хотите изменить разрешение выходного файла, вы просто масштабируете dpi на желаемую величину:

plt.savefig('myfig100.png', dpi=100)
plt.savefig('myfig50.png', dpi=50)

Второй будет иметь половину ширины и высоты первого.

Если вы хотите изменить пропорции ширина/высота, то конечно это не поможет. То, что вы делаете, - это правильный способ изменить пропорции фигуры для сохранения. Но это изменит ваше окно, как вы видите. Если вы не планируете ничего другого после show(), вы можете сделать следующее:

  1. Делайте свои звонки
  2. Звоните show()
  3. Do fig.set_size_inches(7,3)
  4. Наконец-то сделай savefig()

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

person tiago    schedule 16.01.2013
comment
Спасибо за ваш ответ. Я знаю об изменении dpi, однако я хочу изменить соотношение высоты и ширины. Как вы думаете, почему это сложная задача? на самом деле мне трудно понять, почему внесение изменений в print_fig изменяет свойства исходного рисунка. - person dimka; 16.01.2013
comment
Когда вы делаете print_fig = fig, вы ничего не копируете, а просто вызываете fig по другому имени (копия по ссылке). Таким образом, любое изменение в print_fig изменит исходное fig. Я обновил ответ, добавив дополнительную информацию об изменении пропорций. - person tiago; 16.01.2013
comment
Как можно было получить реальную копию фигуры? Я спрашиваю, потому что я использую matplotlib-canvas в графическом интерфейсе PyQt4 и хочу сохранить фигуру с размерами, отличными от размера холста. Но если я изменю размер, обновится и холст-рисунок. Так что я ищу то же самое, что и threadopener. Я пробовал copy.copy, но безуспешно. - person feinmann; 20.05.2015

Вот идея: некоторые бэкенды Matplotlib ничего не отображают, если я правильно помню (например, бэкэнд pdf), поэтому, возможно, вы могли бы переключиться на другой бэкенд, изменить размер фигуры (который не будет отображаться на экране) и сохранить его (а затем вернуться к исходному бэкенду).

Однако я не проверял эту идею, и переключение бэкенда все еще экспериментально. Но, возможно, стоит попробовать.

person Eric O Lebigot    schedule 06.06.2015