Как изменить размер фигур, нарисованных с помощью matplotlib?

Как изменить размер рисунка, нарисованного с помощью matplotlib?

plt.figure(figsize=(20,10))
StackG 25.04.2015 13:16

ИЛИ fig, ax = plt.subplots(figsize=(20, 10))

alexw 14.03.2016 04:15

Думая, что размер фигуры в пикселях, я указал (800 600) и программа вылетела! Обратите внимание, что это дюймы.

Raja 08.10.2017 14:03

@alexw это в документации?

liang 01.03.2018 03:59
fig = plt.gcf() -> fig.set_size_inches(11,8), чтобы раз и навсегда избежать путаницы.
Ufos 13.07.2018 13:00

plt.rcParams ['figure.figsize'] = (20,10) не работает, пока работает plt.figure (figsize = (20,20)). Кто-нибудь может прокомментировать, почему это происходит?

Joonho Park 26.02.2019 10:02

За этот верхний комментарий; не забудьте from matplotlib import pyplot as plt

Constantino 26.03.2019 20:11

Для верхнего «комментария» (на самом деле это незаконченный ответ, отправленный как комментарий): этот код должен быть вызван до того, как вы создадите свой сюжет (см. Ответ @iPAS).

Qaswed 06.05.2019 12:01

Обратите внимание, что это (width, height).

alphabetasoup 27.05.2019 00:42

В Google Colaboratory мне пришлось использовать синтаксис plt.figure(figsize=[20, 10]), то есть угловые скобки, а не скобки.

Michael Osofsky 17.09.2019 06:03

plt.figure (figsize = (20,10)) ... у меня не работает! plt.subplots (figsize = (20, 10)) в порядке.

蔡宗容 25.11.2019 12:41

Почему есть 8000 способов сделать это? Это хаос.

Dan 25.06.2020 07:39

Вот хороший ресурс для этого вопроса: showmecode.info/matplotlib/figure/fig-size

luc 25.06.2020 23:43

@StackG, если бы вы превратили этот комментарий в ответ, вы могли бы заработать 10 тысяч представителей.

NearHuscarl 27.03.2021 00:41

rofl emoji ... это может быть "magnum opus" моей жизни

StackG 27.03.2021 05:15
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2 442
15
3 583 069
20

Ответы 20

Deprecation note:
As per the official Matplotlib guide, usage of the pylab module is no longer recommended. Please consider using the matplotlib.pyplot module instead, as described by this other answer.

Кажется, работает следующее:

from pylab import rcParams
rcParams['figure.figsize'] = 5, 10

Таким образом, ширина фигуры составляет 5 дюймов, а высота - 10 дюймы.

Затем класс Figure использует это как значение по умолчанию для одного из своих аргументов.

Это также хорошо работает в верхней части записной книжки iPython, которая (с учетом --pylab = inline) имеет rcParams, уже импортированные на верхнем уровне.

nealmcb 11.12.2013 00:57

Это не сработало на моей машине с Windows с интерфейсом OO для pyplot и бэкэнда Qt. fig.set_size_inches(18.5, 10.5, forward=True) работал.

Bennett Brown 06.02.2016 22:18

Этот ответ в настоящее время обсуждается на Мета

Mischa 10.07.2017 17:17

Для версии Python: 3.6.4, matplotlib: 2.2.3 Я думаю, вам нужно передать список или кортеж, например. rcParams ['figure.figsize'] = (5, 10)

Steve Gon 13.12.2018 06:08

Кто-нибудь знает, почему это не работает при первом запуске ячейки?

g07kore 27.09.2019 09:44

@ g07kore есть выдающаяся ошибка, связанная с этим: github.com/ipython/ipython/issues/11098

jorijnsmit 25.10.2019 22:32

скопировал ваш фрагмент слишком много раз, поэтому я оставляю этот комментарий здесь, для тех, кому просто нужна копипаста: plt.rcParams['figure.figsize'] = 5, 10

BachT 01.06.2020 00:08

@ g07kore: Я думаю, что это работает, когда обе строки (import и figsize) находятся в разных ячейках. Не спрашивайте меня, почему.

Eric Duminil 25.11.2020 00:36

Первая ссылка в 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.]

Два примечания:

  1. Комментарии модуля и фактический результат различаются.

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

Каждый раз, когда я пытаюсь вспомнить, как это сделать, я попадаю в этот пост. Итак, это код, который я обычно ищу: fig = plt.figure() default_size = fig.get_size_inches() fig.set_size_inches( (default_size[0]*2, default_size[1]*2) )

y.selivonchyk 12.10.2016 14:58

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 создает фигуру, как только вы что-то рисуете, и размер всплывающее окно, похоже, исправлено на этом этапе.

drevicko 03.07.2013 03:31

Я чувствую, что ваш ответ будет лучше, если вы удалите аргументы по умолчанию. Это без надобности снижает отношение сигнал / шум.

frmsaul 05.04.2017 21:06

Означает ли это, что если вы установите DPI на 1, тогда figsize станет единицей пикселей вместо единицы дюйма? Это было бы более полезно при использовании matplotlib в веб-интерфейсах и интерфейсах графического интерфейса.

CMCDragonkai 17.07.2017 13:48

с figsize (1,1) у вас будет соотношение на изображении как 1: 1? потому что все мои круговые диаграммы имеют овальную форму, и я нашел единственный способ сделать их круглыми - это использовать plot.axis ("равно"). они будут иметь такой же эффект или они будут вести себя по-разному?

Breno Baiardi 09.11.2017 20:43

@BrenoBaiardi Это вопрос о размере фигуры. Оси в верхней части рисунка могут по-прежнему иметь неравное соотношение сторон, даже если фигура в целом составляет 1: 1, и даже если блок осей равен 1: 1, данные могут масштабироваться по-разному в направлениях x и y. Итак, нет, эта команда не гарантирует равное соотношение сторон.

Jouni K. Seppänen 13.11.2017 17:43

Обратите внимание, что если вы установите слишком большое число в figsize, цифра будет увеличиваться только до краев экрана. Это открывает возможность для горизонтальной максимизации и вертикальной максимизации.

Stefano 17.04.2019 19:13

Если у вас уже есть фигура, вы можете быстро сделать это:

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).

heltonbiker 26.11.2012 18:21

Аналогичным образом можно запустить fig.set_dpi(100).

Erik Shilts 27.03.2015 22:07

Я использую это в OS X под ipython 3.7, matplotlib 3.0.3. Я могу отрегулировать размер фигуры, но размер окна не изменяется (холст фигуры настраивается, но окно не увеличивается и не сжимается, чтобы вместить холст). Аргумент ключевого слова forward = True не оказывает ожидаемого эффекта на этой платформе.

K. Nielson 07.01.2020 23:12

Попробуйте закомментировать строку 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

Lyndon White 24.12.2014 08:29

"_tkinter.TclError: недостаточно свободной памяти для буфера изображений"

Cerin 30.03.2017 03:16
plt.figure(figsize=(1,1)) - ключевой шаг. Спасибо.
ximiki 15.11.2017 19:24

В ноутбуке jupyter это сработало для меня: plt.figure (figsize = (20,10))

Abhishek Poojary 25.05.2019 15:38

Тем, кто использует jupyter notebook, убедитесь, что вы используете plt.figure (figsize = (15, 10)) перед другими командами plt.

Yuhang Lin 19.11.2019 11:43

Этот пример завершен, показывая, как это связано с pyplot.plot() и pyplot.show().

Wayne Workman 06.06.2020 18:03

Это изменяет размер фигуры сразу же, даже после того, как она была нарисована (по крайней мере, с использованием 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.rcParams

Существует также этот обходной путь, если вы хотите изменить размер без использования среды фигуры. Итак, если вы, например, используете plt.plot(), вы можете установить кортеж с шириной и высотой.

import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = (20,3)

Это очень полезно при построении встроенного графика (например, с помощью IPython Notebook). Как заметил @asamaier, предпочтительно не помещать этот оператор в ту же ячейку операторов импорта.

Преобразование в см

Кортеж figsize принимает дюймы, поэтому, если вы хотите установить его в сантиметрах, вам нужно разделить их на 2,54, посмотрите этот вопрос.

Превосходно! Также полезно для однократной настройки и многократного построения графика.

automorphic 19.10.2017 01:44

По какой-то причине кажется, что это больше не работает в блокноте Jupyter (но раньше).

Ray 13.12.2017 17:01

@Ray Можете ли вы написать версию своей записной книжки Jupyter и поведение, для меня это работает?

G M 13.12.2017 19:41

@GM в прошлый раз, когда я тестировал, это были Jupyter версии 4.3.0 и Python 3.6.2 от Anaconda в Windows 10 и Google Chrome 63.0.3239.84.

Ray 19.12.2017 20:13

Чтобы он заработал, мне нужно вызвать plt.rcParams["figure.figsize"] = (20,3) в дополнительной ячейке. Когда я вызываю его в той же ячейке, что и оператор импорта, он игнорируется.

asmaier 11.05.2018 10:33

Очень прагматично, прямо как в документе: matplotlib.org/api/_as_gen/matplotlib.pyplot.figure.html Стоит отметить одно: значениями этого кортежа являются ширина и высота соответственно.

ivanleoncz 21.11.2018 03:30

@asmaier Я заметил такое же поведение. Более того, если вы просто хотите удвоить / N-умножить размер и доступно число, вы можете сделать: plt.rcParams["figure.figsize"] = np.array(plt.rcParams["figure.figsize"]) * 3

Alberto Chiusole 08.06.2019 02:49

Я широко использую это в своем рабочем процессе. Я установил plt.rcParams['figure.figsize'] = (w, h), чтобы установить глобальный размер для всех графиков и изменить индивидуальные размеры фигур в зависимости от случая, используя plt.figure(figsize=(w, h)).

Deepak Rajendran 05.10.2019 10:34

Быстрый способ масштабирования, скажем, только по вертикали: plt.rcParams["figure.figsize"][1] *= 1.5 fig, axs = plt.subplots(nrows = 2, sharex = True)

Łukasz Rajchel 03.12.2019 05:59

Вы можете просто использовать (из 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)).

Jakob 27.01.2021 21:51
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.
Princy 03.05.2020 01:00

Я считаю, что они должны иметь в виду plt.figure(figsize=(50,50))

j03m 11.10.2020 16:15

Я всегда использую такую ​​схему:

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

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