Как изменить размер рисунка, нарисованного с помощью matplotlib?
ИЛИ fig, ax = plt.subplots(figsize=(20, 10))
Думая, что размер фигуры в пикселях, я указал (800 600) и программа вылетела! Обратите внимание, что это дюймы.
@alexw это в документации?
fig = plt.gcf() -> fig.set_size_inches(11,8), чтобы раз и навсегда избежать путаницы.
plt.rcParams ['figure.figsize'] = (20,10) не работает, пока работает plt.figure (figsize = (20,20)). Кто-нибудь может прокомментировать, почему это происходит?
За этот верхний комментарий; не забудьте from matplotlib import pyplot as plt
Для верхнего «комментария» (на самом деле это незаконченный ответ, отправленный как комментарий): этот код должен быть вызван до того, как вы создадите свой сюжет (см. Ответ @iPAS).
Обратите внимание, что это (width, height).
В Google Colaboratory мне пришлось использовать синтаксис plt.figure(figsize=[20, 10]), то есть угловые скобки, а не скобки.
plt.figure (figsize = (20,10)) ... у меня не работает! plt.subplots (figsize = (20, 10)) в порядке.
Почему есть 8000 способов сделать это? Это хаос.
Вот хороший ресурс для этого вопроса: showmecode.info/matplotlib/figure/fig-size
@StackG, если бы вы превратили этот комментарий в ответ, вы могли бы заработать 10 тысяч представителей.
rofl emoji ... это может быть "magnum opus" моей жизни






Deprecation note:
As per the official Matplotlib guide, usage of thepylabmodule is no longer recommended. Please consider using thematplotlib.pyplotmodule instead, as described by this other answer.
Кажется, работает следующее:
from pylab import rcParams
rcParams['figure.figsize'] = 5, 10
Таким образом, ширина фигуры составляет 5 дюймов, а высота - 10 дюймы.
Затем класс Figure использует это как значение по умолчанию для одного из своих аргументов.
Это также хорошо работает в верхней части записной книжки iPython, которая (с учетом --pylab = inline) имеет rcParams, уже импортированные на верхнем уровне.
Это не сработало на моей машине с Windows с интерфейсом OO для pyplot и бэкэнда Qt. fig.set_size_inches(18.5, 10.5, forward=True) работал.
Этот ответ в настоящее время обсуждается на Мета
Для версии Python: 3.6.4, matplotlib: 2.2.3 Я думаю, вам нужно передать список или кортеж, например. rcParams ['figure.figsize'] = (5, 10)
Кто-нибудь знает, почему это не работает при первом запуске ячейки?
@ g07kore есть выдающаяся ошибка, связанная с этим: github.com/ipython/ipython/issues/11098
скопировал ваш фрагмент слишком много раз, поэтому я оставляю этот комментарий здесь, для тех, кому просто нужна копипаста: plt.rcParams['figure.figsize'] = 5, 10
@ g07kore: Я думаю, что это работает, когда обе строки (import и figsize) находятся в разных ячейках. Не спрашивайте меня, почему.
Первая ссылка в Google для 'matplotlib figure size' - AdjustingImageSize (Гугл кеш страницы).
Вот тестовый сценарий со страницы выше. Он создает файлы test[1-3].png разных размеров одного и того же образа:
#!/usr/bin/env python
"""
This is a small demo file that helps teach how to adjust figure sizes
for matplotlib
"""
import matplotlib
print "using MPL version:", matplotlib.__version__
matplotlib.use("WXAgg") # do this before pylab so you don'tget the default back end.
import pylab
import numpy as np
# Generate and plot some simple data:
x = np.arange(0, 2*np.pi, 0.1)
y = np.sin(x)
pylab.plot(x,y)
F = pylab.gcf()
# Now check everything with the defaults:
DPI = F.get_dpi()
print "DPI:", DPI
DefaultSize = F.get_size_inches()
print "Default size in Inches", DefaultSize
print "Which should result in a %i x %i Image"%(DPI*DefaultSize[0], DPI*DefaultSize[1])
# the default is 100dpi for savefig:
F.savefig("test1.png")
# this gives me a 797 x 566 pixel image, which is about 100 DPI
# Now make the image twice as big, while keeping the fonts and all the
# same size
F.set_size_inches( (DefaultSize[0]*2, DefaultSize[1]*2) )
Size = F.get_size_inches()
print "Size in Inches", Size
F.savefig("test2.png")
# this results in a 1595x1132 image
# Now make the image twice as big, making all the fonts and lines
# bigger too.
F.set_size_inches( DefaultSize )# resetthe size
Size = F.get_size_inches()
print "Size in Inches", Size
F.savefig("test3.png", dpi = (200)) # change the dpi
# this also results in a 1595x1132 image, but the fonts are larger.
Выход:
using MPL version: 0.98.1
DPI: 80
Default size in Inches [ 8. 6.]
Which should result in a 640 x 480 Image
Size in Inches [ 16. 12.]
Size in Inches [ 16. 12.]
Два примечания:
Комментарии модуля и фактический результат различаются.
Этот ответ позволяет легко объединить все три изображения в один файл изображения, чтобы увидеть разницу в размерах.
Каждый раз, когда я пытаюсь вспомнить, как это сделать, я попадаю в этот пост. Итак, это код, который я обычно ищу: fig = plt.figure() default_size = fig.get_size_inches() fig.set_size_inches( (default_size[0]*2, default_size[1]*2) )
figure сообщает подпись вызова:
from matplotlib.pyplot import figure
figure(figsize=(8, 6), dpi=80)
figure(figsize=(1,1)) создаст изображение дюйм за дюймом, которое будет размером 80 на 80 пикселей, если вы также не укажете другой аргумент dpi.
Если вы уже создали фигуру, скажите, что это 'цифра 1' (она используется по умолчанию, когда вы используете pyplot), вы можете использовать figure (num = 1, figsize = (8, 6), ...) для изменения его размера и т. д. Если вы используете pyplot / pylab и show() для создания всплывающего окна, вам нужно вызвать figure(num=1,...)до, вы рисуете что угодно - pyplot / pylab создает фигуру, как только вы что-то рисуете, и размер всплывающее окно, похоже, исправлено на этом этапе.
Я чувствую, что ваш ответ будет лучше, если вы удалите аргументы по умолчанию. Это без надобности снижает отношение сигнал / шум.
Означает ли это, что если вы установите DPI на 1, тогда figsize станет единицей пикселей вместо единицы дюйма? Это было бы более полезно при использовании matplotlib в веб-интерфейсах и интерфейсах графического интерфейса.
с figsize (1,1) у вас будет соотношение на изображении как 1: 1? потому что все мои круговые диаграммы имеют овальную форму, и я нашел единственный способ сделать их круглыми - это использовать plot.axis ("равно"). они будут иметь такой же эффект или они будут вести себя по-разному?
@BrenoBaiardi Это вопрос о размере фигуры. Оси в верхней части рисунка могут по-прежнему иметь неравное соотношение сторон, даже если фигура в целом составляет 1: 1, и даже если блок осей равен 1: 1, данные могут масштабироваться по-разному в направлениях x и y. Итак, нет, эта команда не гарантирует равное соотношение сторон.
Обратите внимание, что если вы установите слишком большое число в figsize, цифра будет увеличиваться только до краев экрана. Это открывает возможность для горизонтальной максимизации и вертикальной максимизации.
Если у вас уже есть фигура, вы можете быстро сделать это:
fig = matplotlib.pyplot.gcf()
fig.set_size_inches(18.5, 10.5)
fig.savefig('test2png.png', dpi=100)
Чтобы распространить изменение размера на существующее окно графического интерфейса, добавьте forward=True
fig.set_size_inches(18.5, 10.5, forward=True)
Решил мне проблему с imshow, теперь я использую этот код сразу после удаления пространства вокруг области построения с помощью plt.subplots_adjust(left=0.0, right=1.0, bottom=0.0, top=1.0).
Аналогичным образом можно запустить fig.set_dpi(100).
Я использую это в OS X под ipython 3.7, matplotlib 3.0.3. Я могу отрегулировать размер фигуры, но размер окна не изменяется (холст фигуры настраивается, но окно не увеличивается и не сжимается, чтобы вместить холст). Аргумент ключевого слова forward = True не оказывает ожидаемого эффекта на этой платформе.
Попробуйте закомментировать строку fig = ...
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
N = 50
x = np.random.rand(N)
y = np.random.rand(N)
area = np.pi * (15 * np.random.rand(N))**2
fig = plt.figure(figsize=(18, 18))
plt.scatter(x, y, s=area, alpha=0.5)
plt.show()
У меня это хорошо работает:
from matplotlib import pyplot as plt
F = plt.gcf()
Size = F.get_size_inches()
F.set_size_inches(Size[0]*2, Size[1]*2, forward=True) # Set forward to True to resize window along with plot in figure.
plt.show() # or plt.imshow(z_array) if using an animation, where z_array is a matrix or numpy array
Это также может помочь: http://matplotlib.1069221.n5.nabble.com/Resizing-figure-windows-td11424.html
Пожалуйста, попробуйте следующий простой код:
from matplotlib import pyplot as plt
plt.figure(figsize=(1,1))
x = [1,2,3]
plt.plot(x, x)
plt.show()
Вам необходимо установить размер фигуры перед тем, как вы начнете строить.
Этот ответ говорит мне, что это matplotlib.pyplot.figure, о котором другие не говорят так ясно. Я продолжаю пробовать такие вещи, как matplotlib.figure и matplotlib.figure.Figure
"_tkinter.TclError: недостаточно свободной памяти для буфера изображений"
plt.figure(figsize=(1,1)) - ключевой шаг. Спасибо.
В ноутбуке jupyter это сработало для меня: plt.figure (figsize = (20,10))
Тем, кто использует jupyter notebook, убедитесь, что вы используете plt.figure (figsize = (15, 10)) перед другими командами plt.
Этот пример завершен, показывая, как это связано с pyplot.plot() и pyplot.show().
Это изменяет размер фигуры сразу же, даже после того, как она была нарисована (по крайней мере, с использованием Qt4Agg / TkAgg - но не MacOSX - с matplotlib 1.4.0):
matplotlib.pyplot.get_current_fig_manager().resize(width_px, height_px)
Чтобы увеличить размер вашей фигуры в N раз, вам нужно вставить это непосредственно перед вашим pl.show ():
N = 2
params = pl.gcf()
plSize = params.get_size_inches()
params.set_size_inches( (plSize[0]*N, plSize[1]*N) )
Он также хорошо работает с ноутбуком ipython.
Поскольку Matplotlib не может использует метрическую систему изначально, если вы хотите указать размер вашей фигуры в разумных единицах длины, таких как сантиметры, вы можете сделать следующее (код из gns-ank):
def cm2inch(*tupl):
inch = 2.54
if isinstance(tupl[0], tuple):
return tuple(i/inch for i in tupl[0])
else:
return tuple(i/inch for i in tupl)
Тогда вы можете использовать:
plt.figure(figsize=cm2inch(21, 29.7))
Если вы ищете способ изменить размер фигуры в Панды, вы можете сделать, например:
df['some_column'].plot(figsize=(10, 5))
где df - фрейм данных Pandas. Или, чтобы использовать существующую фигуру или оси
fig, ax = plt.subplots(figsize=(10,5))
df['some_column'].plot(ax=ax)
Если вы хотите изменить настройки по умолчанию, вы можете сделать следующее:
import matplotlib
matplotlib.rc('figure', figsize=(10, 5))
Существует также этот обходной путь, если вы хотите изменить размер без использования среды фигуры. Итак, если вы, например, используете plt.plot(), вы можете установить кортеж с шириной и высотой.
import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = (20,3)
Это очень полезно при построении встроенного графика (например, с помощью IPython Notebook). Как заметил @asamaier, предпочтительно не помещать этот оператор в ту же ячейку операторов импорта.
Кортеж figsize принимает дюймы, поэтому, если вы хотите установить его в сантиметрах, вам нужно разделить их на 2,54, посмотрите этот вопрос.
Превосходно! Также полезно для однократной настройки и многократного построения графика.
По какой-то причине кажется, что это больше не работает в блокноте Jupyter (но раньше).
@Ray Можете ли вы написать версию своей записной книжки Jupyter и поведение, для меня это работает?
@GM в прошлый раз, когда я тестировал, это были Jupyter версии 4.3.0 и Python 3.6.2 от Anaconda в Windows 10 и Google Chrome 63.0.3239.84.
Чтобы он заработал, мне нужно вызвать plt.rcParams["figure.figsize"] = (20,3) в дополнительной ячейке. Когда я вызываю его в той же ячейке, что и оператор импорта, он игнорируется.
Очень прагматично, прямо как в документе: matplotlib.org/api/_as_gen/matplotlib.pyplot.figure.html Стоит отметить одно: значениями этого кортежа являются ширина и высота соответственно.
@asmaier Я заметил такое же поведение. Более того, если вы просто хотите удвоить / N-умножить размер и доступно число, вы можете сделать: plt.rcParams["figure.figsize"] = np.array(plt.rcParams["figure.figsize"]) * 3
Я широко использую это в своем рабочем процессе. Я установил plt.rcParams['figure.figsize'] = (w, h), чтобы установить глобальный размер для всех графиков и изменить индивидуальные размеры фигур в зависимости от случая, используя plt.figure(figsize=(w, h)).
Быстрый способ масштабирования, скажем, только по вертикали: plt.rcParams["figure.figsize"][1] *= 1.5 fig, axs = plt.subplots(nrows = 2, sharex = True)
Вы можете просто использовать (из matplotlib.figure.Figure):
fig.set_size_inches(width,height)
Начиная с Matplotlib 2.0.0, изменения в вашем холсте будут видны немедленно, как ключевое слово forwardпо умолчанию True.
Если вы хотите просто изменить ширину или же высота вместо обоих, вы можете использовать
fig.set_figwidth(val) или fig.set_figheight(val)
Они также немедленно обновят ваш холст, но только в Matplotlib 2.2.0 и новее.
Вам необходимо явно указать forward=True, чтобы обновить холст в версиях, более старых, чем указано выше. Обратите внимание, что функции set_figwidth и set_figheight не поддерживают параметр forward в версиях старше Matplotlib 1.5.0.
Другой вариант, использовать функцию rc () в matplotlib (единица измерения - дюйм)
import matplotlib
matplotlib.rc('figure', figsize=[10,5])
Это очень полезно, так как размер назначается глобально. Таким образом, вам не нужно указывать его для каждого участка. Однако может быть более распространенным делать import matplotlib.pyplot as plt, а затем plt.rc('figure', figsize=(10,5)).
import matplotlib.pyplot as plt
plt.figure(figsize=(20,10))
plt.plot(x,y) ## This is your plot
plt.show()
Вы также можете использовать:
fig, ax = plt.subplots(figsize=(20, 10))
Обобщающий и упрощающий ответ психоделии.
Если вы хотите изменить текущий размер фигуры на коэффициент sizefactor
import matplotlib.pyplot as plt
# here goes your code
fig_size = plt.gcf().get_size_inches() #Get current size
sizefactor = 0.8 #Set a zoom factor
# Modify the current size by the factor
plt.gcf().set_size_inches(sizefactor * fig_size)
После изменения текущего размера может потребоваться точная настройка план подзаговора. Вы можете сделать это в графическом интерфейсе окна рисунка или с помощью команды subplots_adjust
Например,
plt.subplots_adjust(left=0.16, bottom=0.19, top=0.82)
Вы напрямую меняете размер фигуры, используя
plt.set_figsize(figure=(10, 10))
pyplot не имеет метода с именем set_figsize.
Я считаю, что они должны иметь в виду plt.figure(figsize=(50,50))
Я всегда использую такую схему:
x_inches = 150*(1/25.4) # [mm]*constant
y_inches = x_inches*(0.8)
dpi = 96
fig = plt.figure(1, figsize = (x_inches,y_inches), dpi = dpi, constrained_layout = True)
В этом примере вы можете установить размеры фигуры в дюймах или миллиметрах и установить constrained_layout на графики True, заполняющие вашу фигуру без границ.
Использовать это:
plt.figure(figsize=(width,height))
width и height указаны в дюймах.
Если не указан, по умолчанию используется rcParams["figure.figsize"] = [6.4, 4.8]. См. Еще здесь.
Следующее, безусловно, будет работать, но убедитесь, что вы поместили эту строку plt.figure(figsize=(20,10)) выше plt.plot(x,y) или plt.pie() и т. д.
import matplotlib.pyplot as plt
plt.figure(figsize=(20,10))
plt.plot(x,y) ## This is your plot
plt.show()
Код скопирован из @ amalik2205
plt.figure(figsize=(20,10))