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

2042

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

tatwright
источник
742
plt.figure(figsize=(20,10))
StackG
307
ИЛИfig, ax = plt.subplots(figsize=(20, 10))
alexw
101
Думая, что размер фигуры в пикселях, я указал (800 600), и программа упала! Обратите внимание, что устройство в дюймах.
Раджа
2
@alexw это в документации?
Лян
48
fig = plt.gcf()-> fig.set_size_inches(11,8)чтобы избежать путаницы раз и навсегда.
Ufos

Ответы:

1100

цифра говорит вам подпись вызова:

from matplotlib.pyplot import figure
figure(num=None, figsize=(8, 6), dpi=80, facecolor='w', edgecolor='k')

figure(figsize=(1,1)) создаст изображение дюйм-дюйм, которое будет размером 80 на 80 пикселей, если вы не укажете другой аргумент в dpi.

Йоуни К. Сеппанен
источник
95
Если у вас уже есть созданная фигура, скажем, это «цифра 1» (это та, которая используется по умолчанию при использовании pyplot), вы можете использовать figure (num = 1, figsize = (8, 6), ...) изменить его размер и т. д. Если вы используете pyplot / pylab и show()создаете всплывающее окно, вам нужно вызвать его figure(num=1,...) перед тем, как что-то нарисовать - pyplot / pylab создает фигуру, как только вы что-то рисуете, и появляется размер всплывающего окна. быть исправленным в этой точке.
drevicko
22
Я чувствую, что ваш ответ будет лучше, если вы удалите аргументы по умолчанию. Это уменьшает отношение сигнал / шум без необходимости.
frmsaul
3
Означает ли это, что если вы установите DPI в 1, то figsize станет единицей пикселя, а не дюймовой? Это было бы более полезно при использовании matplotlib на веб-интерфейсах и интерфейсах GUI.
CMCDragonkai
1
с figsize (1,1) у вас будет соотношение в изображении как 1: 1? потому что все мои круговые диаграммы показаны овальными, и я нашел единственный способ сделать их круглыми - использовать plot.axis («равно»). они будут иметь тот же эффект, или они ведут себя по-разному?
Брено Байарди
2
@BrenoBaiardi Этот вопрос о размере фигуры. Оси в верхней части фигуры могут по-прежнему иметь неравное соотношение сторон, даже если фигура в целом равна 1: 1, и даже если поле осей равно 1: 1, данные могут масштабироваться по-разному в направлениях x и y. Так что нет, эта команда не гарантирует равное соотношение сторон.
Джоуни К. Сеппанен
743

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

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)
Пит
источник
3
Решил мне проблему с imshow, теперь я использую этот код сразу после удаления пространства вокруг области построения с помощью plt.subplots_adjust(left=0.0, right=1.0, bottom=0.0, top=1.0).
Хелтонбайкер
7
Точно так же вы можете бежать fig.set_dpi(100).
Эрик Шилтс
1
Я использую это на OS X под ipython 3.7, matplotlib 3.0.3. Я могу настроить размер фигуры, но размер окна не изменяется (холст фигуры корректируется, но окно не увеличивается и не сжимается для размещения холста). Ключевое слово forward = True не имеет ожидаемого эффекта на этой платформе.
К. Нильсон
Эта работа для меня в Google
Colab Laboratory
355

Примечание об устаревании:
Согласно официальному руководству Matplotlib , использование pylabмодуля больше не рекомендуется. Пожалуйста, рассмотрите возможность использования matplotlib.pyplotмодуля вместо этого, как описано в этом другом ответе .

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

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

Это делает ширину фигуры 5 дюймов, а ее высоту 10 дюймов .

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

tatwright
источник
3
Это также хорошо работает в верхней части записной книжки iPython, в которой (учитывая --pylab = inline) уже импортированы rcParams на верхнем уровне.
nealmcb
4
Это не сработало на моей Windows-машине с OO-интерфейсом к pyplot и Qt backend. fig.set_size_inches(18.5, 10.5, forward=True)работал.
Беннет Браун
2
Этот ответ в настоящее время обсуждается на Meta
Mischa
Для Python версии: 3.6.4, matplotlib: 2.2.3 Я думаю, вам нужно передать список или кортеж, например, rcParams ['figure.figsize'] = (5, 10)
Стив Гон
2
Кто-нибудь знает, почему это не работает при первом запуске клетки?
g07kore
315

ИСПОЛЬЗОВАНИЕ plt.rcParams

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

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

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

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

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

GM
источник
4
Отлично! Также полезно установить его один раз и построить несколько раз.
Автоморф
По какой-то причине кажется, что это больше не работает в ноутбуке Jupyter (но раньше).
Рэй
@Ray Можете ли вы написать версию вашего ноутбука Jupyter и поведение для меня, это работает
GM
@GM в прошлый раз, когда я тестировал, это была Jupyter версии 4.3.0 и Python 3.6.2 от Anaconda, в Windows 10 и Google Chrome 63.0.3239.84.
Рэй
8
Чтобы это работало, мне нужно позвонить plt.rcParams["figure.figsize"] = (20,3)в дополнительную ячейку. Когда я вызываю его в той же ячейке, что и оператор import, он игнорируется.
Asmaier
270

Пожалуйста, попробуйте простой код, как показано ниже:

from matplotlib import pyplot as plt
plt.figure(figsize=(1,1))
x = [1,2,3]
plt.plot(x, x)
plt.show()

Вы должны установить размер фигуры, прежде чем строить.

ИПАС
источник
14
Этот ответ говорит мне, что это м atplotlib.pyplot.figure, о чем другие не говорят так ясно. Я продолжаю пробовать такие вещи, как matplotlib.figureиmatplotlib.figure.Figure
Линдон Уайт
"_tkinter.TclError: недостаточно свободной памяти для буфера изображения"
Cerin
6
plt.figure(figsize=(1,1))это основной шаг. Спасибо.
ximiki
В блокноте Jupyter это сработало для меня: plt.figure (figsize = (20,10))
Абхишек Пуджары
Для тех, кто использует ноутбук jupyter, пожалуйста, убедитесь, что вы используете plt.figure (figsize = (15, 10)) перед другими командами plt.
Юйхан Лин
90

Если вы ищете способ изменить размер фигуры в Pandas , вы можете сделать, например:

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))
Kris
источник
73

Первая ссылка в Google для 'matplotlib figure size'- AdjustingImageSize ( кеш страницы Google ).

Вот тестовый скрипт с вышеуказанной страницы. Создает 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. Этот ответ позволяет легко объединить все три изображения в один файл изображения, чтобы увидеть разницу в размерах.

JFS
источник
7
Каждый раз, когда я пытаюсь вспомнить, как это сделать, я попадаю в этот пост. Итак, вот код, который я обычно ищу:fig = plt.figure() default_size = fig.get_size_inches() fig.set_size_inches( (default_size[0]*2, default_size[1]*2) )
y.selivonchyk
46
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))
amalik2205
источник
45

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

река
источник
31

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

Это хорошо работает для меня:

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

Blairg23
источник
16

Чтобы увеличить размер вашей фигуры в N раз, вам нужно вставить это непосредственно перед вашим pl.show ():

N = 2
params = pl.gcf()
plSize = params.get_size_inches()
params.set_size_inches( (plSize[0]*N, plSize[1]*N) )

Это также хорошо работает с ноутбуком ipython.

psihodelia
источник
10

Поскольку 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))
Франк Дернонкур
источник
8

Это изменяет размер фигуры сразу же после того, как фигура была нарисована (по крайней мере, используя Qt4Agg / TkAgg - но не MacOSX - с matplotlib 1.4.0):

matplotlib.pyplot.get_current_fig_manager().resize(width_px, height_px)
wilywampa
источник
7

Обобщающий и упрощающий ответ психоделии. Если вы хотите изменить текущий размер фигуры с коэффициентом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)
loved.by.Jesus
источник
5

Другой вариант - использовать функцию rc () в matplotlib (единица измерения - дюйм)

import matplotlib
matplotlib.rc('figure', figsize=[10,5])
Student222
источник
-3

Вы напрямую изменяете размер фигуры, используя

plt.set_figsize(figure=(10, 10))
Калян Моханты
источник
4
pyplotне имеет метода с именем set_figsize.
Принцесса