Як ви змінюєте розмір фігур, намальованих за допомогою matplotlib?


2035

Як ви змінюєте розмір фігури, намальованої matplotlib?


741
plt.figure(figsize=(20,10))
StackG

306
АБОfig, ax = plt.subplots(figsize=(20, 10))
alexw

99
Думаючи, що розмір фігури в пікселях, я вказав (800 600) і програма вийшла з ладу! Зверніть увагу, що пристрій знаходиться в дюймах.
Раджа

2
@alexw це в документації?
laang

48
fig = plt.gcf()-> fig.set_size_inches(11,8)щоб уникнути плутанини раз і назавжди.
Ufos

Відповіді:


1099

цифра повідомляє вам підпис дзвінка:

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), ви можете використовувати фігуру (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. Отже, ні, ця команда не гарантуватиме рівне співвідношення сторін.
Джоні К. Сеппанен

741

Якщо ви вже створили фігуру, ви можете швидко зробити це:

fig = matplotlib.pyplot.gcf()
fig.set_size_inches(18.5, 10.5)
fig.savefig('test2png.png', dpi=100)

Для розповсюдження зміни розміру до наявного вікна gui додати 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).
heltonbiker

7
Аналогічно можна і бігати fig.set_dpi(100).
Ерік Шильц

1
Я використовую це в OS X під ipython 3.7, matplotlib 3.0.3. Я в змозі відрегулювати розмір фігури, але вікно не змінює розмір (полотно фігури регулюється, але вікно не росте і не зменшується для розміщення полотна). Аргумент ключового слова forward = True, схоже, не має наміченого ефекту на цій платформі.
К. Нільсон

Ця робота для мене у співпраці Google
carlosaar22

355

Примітка про депресія:
Відповідно до офіційного посібника Matplotlib , використання pylabмодуля більше не рекомендується. Будь ласка, подумайте про використання matplotlib.pyplotмодуля, як описано в цій іншій відповіді .

Здається, працює таке:

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

Це робить ширину фігури 5 дюймів, а її висоту - 10 дюймів .

Потім клас Figure використовує це як значення за замовчуванням для одного з його аргументів.


3
Це також чудово працює у верхній частині ноутбука iPython, який (з урахуванням --pylab = inline) має rcParams, вже імпортований на верхньому рівні.
nealmcb

4
Це не спрацювало на моїй машині Windows з інтерфейсом OO для pyplot та Qt backkend. 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

314

ВИКОРИСТАННЯ plt.rcParams

Існує також таке рішення, якщо ви хочете змінити розмір, не використовуючи середовище фігури. Так що, plt.plot()наприклад, ви використовуєте кортеж шириною та висотою.

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

Це дуже корисно, коли ви плануєте вбудований малюнок (наприклад, із ноутбуком IPython). Як зауважив @asamaier, бажано не ставити цю заяву в одну клітинку декларацій про імпорт.

Перерахунок на см

figsizeКортеж приймає дюймів , так що якщо ви хочете , щоб встановити його в сантиметрах ви повинні розділити їх на 2,54 поглянути на це питання .


4
Відмінно! Також корисно для того, щоб встановити його один раз і побудувати графік кілька разів.
Автоморфні

Чомусь це здається, що це більше не працює в зошиті Юпітера (але раніше).
Рей

@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)в додаткову клітинку. Коли я називаю це в тій же комірці, що й імпорт, він ігнорується.
asmaier

269

Спробуйте простий код наступним чином:

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

5
plt.figure(figsize=(1,1))суттєвий хід. Дякую.
ximiki

У зошиті з юпітером це працювало для мене: plt.figure (figsize = (20,10))
Abhishek

Для тих, хто використовує ноутбук юпітера, переконайтеся, що ви використовуєте 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))

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. Ця відповідь дозволяє легко комбінувати всі три зображення в одному файлі зображень, щоб побачити різницю в розмірах.


7
Кожен раз, коли я намагаюся згадати, як це зробити, я опиняюся на цій посаді. Отже, це код, який я зазвичай шукаю:fig = plt.figure() default_size = fig.get_size_inches() fig.set_size_inches( (default_size[0]*2, default_size[1]*2) )
y.selivonchyk

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.


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

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


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.


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)

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) 

Після зміни поточного розміру може статися, що вам доведеться налагодити макет субплоти . Це можна зробити у графічному вікні GUI або за допомогою команди subplots_adjust

Наприклад,

plt.subplots_adjust(left=0.16, bottom=0.19, top=0.82)

5

Інший варіант, щоб використовувати функцію rc () в matplotlib (одиниця є дюймом)

import matplotlib
matplotlib.rc('figure', figsize=[10,5])

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.