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

avatar
tatwright
1 декабря 2008 в 21:24
3973001
25
2584

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

Источник

Ответы (25)

avatar
Derrick Kuria
20 апреля 2022 в 02:33
1

Вы также можете попробовать инициализировать это:

import matplotlib as mpl
import matplotlib.pyplot as plt
mpl.rcParams['figure.figsize'] = (8, 6)
mpl.rcParams['axes.grid'] = False
avatar
Dev Parzival
31 декабря 2021 в 05:04
1
import random
import math
import matplotlib.pyplot as plt
start=-20
end=20
x=[v for v in range(start,end)]
#sigmoid function
def sigmoid(x):
    return 1/(1+math.exp(x))
plt.figure(figsize=(8,5))#setting the figure size
plt.scatter([abs(v) for v in x],[sigmoid(v) for v in x])
plt.scatter(x,[sigmoid(sigmoid(v)) for v in x])

sigmoid image

avatar
nizarhamood
29 октября 2021 в 11:58
3

Вот мой собственный пример.

Ниже я дал вам ваш ответ и расширил его, чтобы вы могли поэкспериментировать.

Также обратите внимание, что размеры инжира измеряются в дюймах

import matplotlib.pyplot as plt

data = [2,5,8,10,15] # Random data, can use existing data frame column

fig, axs = plt.subplots(figsize = (20,6)) # This is your answer to resize the figure

# The below will help you expand on your question and resize individual elements within your figure. Experiement with the below parameters.
axs.set_title("Data", fontsize = 17.5)
axs.tick_params(axis = 'x', labelsize = 14)
axs.set_xlabel('X Label Here', size = 15)
axs.tick_params(axis = 'y', labelsize =14)
axs.set_ylabel('Y Label Here', size = 15)

plt.plot(data)

Вывод: enter image description here

avatar
Ali Muhammad Khowaja
16 июня 2021 в 12:27
5

Вот как я напечатал свой собственный график с нестандартным размером

import matplotlib.pyplot as plt
from matplotlib.pyplot import figure

figure(figsize=(16, 8), dpi=80)
plt.plot(x_test, color = 'red', label = 'Predicted Price')
plt.plot(y_test, color = 'blue', label = 'Actual Price')
plt.title('Dollar to PKR Prediction')
plt.xlabel('Predicted Price')
plt.ylabel('Actual Dollar Price')
plt.legend()
plt.show()
           
avatar
iacob
20 апреля 2021 в 13:48
4

Когда создает новую фигуру , вы можете указать размер (в дюймах) с помощью аргумента figsize:

import matplotlib.pyplot as plt
fig = plt.figure(figsize=(w,h))

Если вы хотите изменить существующую фигуру , используйте метод set_size_inches():

fig.set_size_inches(w,h)

Если вы хотите изменить размер рисунка по умолчанию (6,4 "x 4,8"), используйте "команды запуска" rc <33>: <33>: <33>

plt.rc('figure', figsize=(w,h))

avatar
Shahriar Kabir Khan
15 марта 2021 в 13:25
11

Следующее обязательно будет работать, но убедитесь, что вы добавили строку 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.

avatar
circassia_ai
22 февраля 2021 в 12:17
12

Используйте это:

plt.figure(figsize=(width,height))

Значения width и height указаны в дюймах. Если не указан, по умолчанию используется rcParams["figure.figsize"] = [6.4, 4.8]. Подробнее здесь.

avatar
Ciro Santilli 新疆再教育营六四事件法轮功郝海东
10 ноября 2020 в 10:31
14

Сравнение различных подходов к установке точных размеров изображения в пикселях

В этом ответе основное внимание будет уделено:

  • savefig
  • установка размера в пикселях

Вот краткое сравнение некоторых подходов, которые я пробовал, с изображениями, показывающими, что они дают.

Пример базовой линии без попытки установить размеры изображения

Просто для сравнения:

base.py

#!/usr/bin/env python3

import sys

import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl

fig, ax = plt.subplots()
print('fig.dpi = {}'.format(fig.dpi))
print('fig.get_size_inches() = ' + str(fig.get_size_inches())
t = np.arange(-10.  10.  1.)
plt.plot(t, t, '.')
plt.plot(t, t**2, '.')
ax.text(0.  60.  'Hello', fontdict=dict(size=25))
plt.savefig('base.png', format='png')

запустить:

./base.py
identify base.png

выходы:

fig.dpi = 100.0
fig.get_size_inches() = [6.4 4.8]
base.png PNG 640x480 640x480+0+0 8-bit sRGB 13064B 0.000u 0:00.000

enter image description here

Мой лучший подход на данный момент: plt.savefig(dpi=h/fig.get_size_inches()[1] управление только высотой

Я думаю, что большую часть времени я буду использовать именно этот вариант, поскольку он прост и масштабируется:

get_size.py

#!/usr/bin/env python3

import sys

import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl

height = int(sys.argv[1])
fig, ax = plt.subplots()
t = np.arange(-10.  10.  1.)
plt.plot(t, t, '.')
plt.plot(t, t**2, '.')
ax.text(0.  60.  'Hello', fontdict=dict(size=25))
plt.savefig(
    'get_size.png',
    format='png',
    dpi=height/fig.get_size_inches()[1]
)

запуск:

./get_size.py 431

выходы:

get_size.png PNG 574x431 574x431+0+0 8-bit sRGB 10058B 0.000u 0:00.000

enter image description here

и

./get_size.py 1293

выходы:

main.png PNG 1724x1293 1724x1293+0+0 8-bit sRGB 46709B 0.000u 0:00.000

enter image description here

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

plt.savefig(bbox_inches='tight' изменяет размер изображения

Мне всегда кажется, что вокруг изображений слишком много белого пространства, и я обычно добавляю bbox_inches='tight' из: Удаление пробелов вокруг сохраненного изображения в matplotlib

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

Вместо этого, этот другой подход, предложенный в том же вопросе, кажется, работает хорошо:

plt.tight_layout(pad=1)
plt.savefig(...

, что дает точную желаемую высоту для высоты, равной 431:

enter image description here

Фиксированная высота, set_aspect, автоматически изменяемая ширина и небольшие поля

Эммм, set_aspect снова портит ситуацию и не позволяет plt.tight_layout фактически удалить поля ...

Вопрос: Как получить фиксированную высоту в пикселях, фиксированное соотношение сторон x / y и автоматически удалить горизонтальные поля пробелов в Matplotlib?

plt.savefig(dpi=h/fig.get_size_inches()[1] + контроль ширины

Если вам действительно нужна определенная ширина в дополнение к высоте, это, похоже, сработает:

width.py

#!/usr/bin/env python3

import sys

import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl

h = int(sys.argv[1])
w = int(sys.argv[2])
fig, ax = plt.subplots()
wi, hi = fig.get_size_inches()
fig.set_size_inches(hi*(w/h), hi)
t = np.arange(-10.  10.  1.)
plt.plot(t, t, '.')
plt.plot(t, t**2, '.')
ax.text(0.  60.  'Hello', fontdict=dict(size=25))
plt.savefig(
    'width.png',
    format='png',
    dpi=h/hi
)

запустить:

./width.py 431 869

вывод:

width.png PNG 869x431 869x431+0+0 8-bit sRGB 10965B 0.000u 0:00.000

enter image description here

и для небольшой ширины:

./width.py 431 869

вывод:

width.png PNG 211x431 211x431+0+0 8-bit sRGB 6949B 0.000u 0:00.000

enter image description here

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

Мне удалось обойти тех, у кого Удаление пробелов вокруг сохраненного изображения в matplotlib

plt.tight_layout(pad=1)

, что дает:

width.png PNG 211x431 211x431+0+0 8-bit sRGB 7134B 0.000u 0:00.000

enter image description here

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

Фиксированная базовая высота магии, dpi на fig.set_size_inches и plt.savefig(dpi= масштабирование

Я считаю, что это эквивалентно подходу, упомянутому по адресу: https://coderhelper.com/a/13714720/895245

magic.py

#!/usr/bin/env python3

import sys

import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl

magic_height = 300
w = int(sys.argv[1])
h = int(sys.argv[2])
dpi = 80
fig, ax = plt.subplots(dpi=dpi)
fig.set_size_inches(magic_height*w/(h*dpi), magic_height/dpi)
t = np.arange(-10.  10.  1.)
plt.plot(t, t, '.')
plt.plot(t, t**2, '.')
ax.text(0.  60.  'Hello', fontdict=dict(size=25))
plt.savefig(
    'magic.png',
    format='png',
    dpi=h/magic_height*dpi,
)

запуск:

./magic.py 431 231

выходы:

magic.png PNG 431x231 431x231+0+0 8-bit sRGB 7923B 0.000u 0:00.000

enter image description here

И чтобы посмотреть, хорошо ли масштабируется:

./magic.py 1291 693

выходы:

magic.png PNG 1291x693 1291x693+0+0 8-bit sRGB 25013B 0.000u 0:00.000

enter image description here

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

Фиксированный DPI + set_size_inches

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

set_size_inches.py

#!/usr/bin/env python3

import sys

import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl

w = int(sys.argv[1])
h = int(sys.argv[2])
fig, ax = plt.subplots()
fig.set_size_inches(w/fig.dpi, h/fig.dpi)
t = np.arange(-10.  10.  1.)
plt.plot(t, t, '.')
plt.plot(t, t**2, '.')
ax.text(
    0,
    60. 
    'Hello',
    # Keep font size fixed independently of DPI.
    # https://coderhelper.com/questions/39395616/matplotlib-change-figsize-but-keep-fontsize-constant
    fontdict=dict(size=10*h/fig.dpi),
)
plt.savefig(
    'set_size_inches.png',
    format='png',
)

запуск:

./set_size_inches.py 431 231

выходы:

set_size_inches.png PNG 430x231 430x231+0+0 8-bit sRGB 8078B 0.000u 0:00.000

, поэтому высота немного отклонена, а изображение:

enter image description here

Размеры пикселей также верны, если я увеличу их в 3 раза:

./set_size_inches.py 1291 693

выходы:

set_size_inches.png PNG 1291x693 1291x693+0+0 8-bit sRGB 19798B 0.000u 0:00.000

enter image description here

Однако мы понимаем, что для правильного масштабирования этого подхода вам необходимо сделать каждую настройку, зависящую от DPI, пропорциональной размеру в дюймах.

В предыдущем примере мы сделали пропорциональным только текст «Hello», и он сохранил свою высоту от 60 до 80, как и следовало ожидать. Но все, для чего мы этого не сделали, выглядит крошечным, в том числе:

  • ширина линии осей
  • метки-отметки
  • точечные маркеры

SVG

Я не смог найти, как установить его для изображений SVG, мои подходы работали только для PNG, например:

get_size_svg.py

#!/usr/bin/env python3

import sys

import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl

height = int(sys.argv[1])
fig, ax = plt.subplots()
t = np.arange(-10.  10.  1.)
plt.plot(t, t, '.')
plt.plot(t, t**2, '.')
ax.text(0.  60.  'Hello', fontdict=dict(size=25))
plt.savefig(
    'get_size_svg.svg',
    format='svg',
    dpi=height/fig.get_size_inches()[1]
)

запуск:

./get_size_svg.py 431

, а сгенерированные выходные данные содержат:

<svg height="345.6pt" version="1.1" viewBox="0 0 460.8 345.6" width="460.8pt"

и идентификация говорит:

get_size_svg.svg SVG 614x461 614x461+0+0 8-bit sRGB 17094B 0.000u 0:00.000

, и если я открою его в Chromium 86, при наведении изображения мыши в инструментах отладки браузера эта высота будет равна 460,79.

Но, конечно, поскольку SVG является векторным форматом, теоретически все должно масштабироваться, поэтому вы можете просто преобразовать его в любой формат фиксированного размера без потери разрешения, например:

inkscape -h 431 get_size_svg.svg -b FFF -e get_size_svg.png

дает точную высоту:

enter image description here

Я использую Inkscape вместо Imagemagick convert здесь, потому что вам нужно возиться с -density, чтобы получить резкие изменения размеров SVG с помощью ImageMagick:

И установка <img height="" в HTML также должна работать в браузере.

Проверено на matplotlib == 3.2.2.

avatar
Luguecos
22 октября 2020 в 20:42
0

Я всегда использую следующий шаблон:

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 графики заполняют вашу фигуру без границ.

avatar
loved.by.Jesus
29 ноября 2019 в 16:18
14

Обобщение и упрощение ответ психоделии:

Если вы хотите изменить текущий размер фигуры на коэффициент 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)
avatar
amalik2205
8 июля 2019 в 19:13
74
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))
avatar
Student222
27 мая 2019 в 22:56
7

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

import matplotlib
matplotlib.rc('figure', figsize=[10,5])
Jakob
27 января 2021 в 18:51
1

Это очень полезно, так как размер назначается глобально. Таким образом, вам не нужно указывать его для каждого участка. Однако может быть более распространенным выполнение import matplotlib.pyplot as plt, а затем plt.rc('figure', figsize=(10,5)).

avatar
River
30 октября 2017 в 15:23
55

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

avatar
G M
18 января 2017 в 10:55
481

Использование plt.rcParams

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

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

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

Чтобы восстановить глобальный размер фигуры по умолчанию для последующих графиков:

plt.rcParams["figure.figsize"] = plt.rcParamsDefault["figure.figsize"]

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

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

automorphic
18 октября 2017 в 22:44
5

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

Ray
13 декабря 2017 в 14:01
1

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

G M
13 декабря 2017 в 16:41
0

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

Ray
19 декабря 2017 в 17:13
0

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

asmaier
11 мая 2018 в 07:33
13

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

ivanleoncz
21 ноября 2018 в 00:30
0

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

Alberto Chiusole
7 июня 2019 в 23:49
0

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

Deepak Rajendran
5 октября 2019 в 07:34
0

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

Łukasz Rajchel
3 декабря 2019 в 02:59
0

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

Eiron
11 мая 2021 в 21:46
1

Чтобы сбросить глобальный размер фигуры для последующих графиков обратно к значениям по умолчанию, используйте plt.rcParams['figure.figsize'] = plt.rcParamsDefault['figure.figsize']

G M
12 мая 2021 в 08:53
0

@Eiron, это хороший трюк, не стесняйтесь редактировать ответ, если хотите

avatar
Kris
29 сентября 2016 в 12:54
139

Если вы ищете способ изменить размер рисунка в 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))
avatar
Franck Dernoncourt
3 августа 2016 в 18:04
13

Поскольку 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))
avatar
psihodelia
30 октября 2014 в 10:38
19

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

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

Он также хорошо работает с ноутбуком IPython.

avatar
wilywampa
28 октября 2014 в 05:08
11

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

matplotlib.pyplot.get_current_fig_manager().resize(width_px, height_px)
avatar
iPAS
6 июня 2014 в 03:24
353

Попробуйте ввести простой код:

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

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

Lyndon White
24 декабря 2014 в 05:29
17

Этот ответ говорит мне, что это m atplotlib.pyplot.figure, о чем другие не говорят так ясно. Я продолжаю пробовать такие вещи, как matplotlib.figure и matplotlib.figure.Figure

Cerin
30 марта 2017 в 00:16
0

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

ximiki
15 ноября 2017 в 16:24
8

plt.figure(figsize=(1,1)) - ключевой шаг. Спасибо.

Abhishek Poojary
25 мая 2019 в 12:38
2

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

Yuhang Lin
19 ноября 2019 в 08:43
1

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

avatar
Blairg23
28 мая 2014 в 05:47
41

Меня устраивает:

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

Это сообщение на форуме также может помочь: Изменение размера окна фигур

avatar
Renaud
14 марта 2014 в 08:22
43

Попробуйте закомментировать строку 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()
avatar
Pete
29 ноября 2010 в 17:30
883

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

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)
heltonbiker
26 ноября 2012 в 14:21
4

Решил мне проблему с imshow, теперь я использую этот код сразу после удаления пространства вокруг области построения с помощью plt.subplots_adjust(left=0.0, right=1.0, bottom=0.0, top=1.0).

Erik Shilts
27 марта 2015 в 19:07
12

Точно так же вы можете запустить fig.set_dpi(100).

K. Nielson
7 января 2020 в 20:12
1

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

avatar
Jouni K. Seppänen
12 марта 2009 в 12:41
1388

figure сообщает подпись вызова:

from matplotlib.pyplot import figure

figure(figsize=(8, 6), dpi=80)

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

drevicko
2 июля 2013 в 23:31
112

Если вы уже создали фигуру, скажите, что это 'цифра 1' (она используется по умолчанию, когда вы используете pyplot), вы можете использовать figure (num = 1, figsize = (8, 6), ...) чтобы изменить его размер и т. д. Если вы используете pyplot / pylab и show() для создания всплывающего окна, вам нужно вызвать figure(num=1,...) до того, как вы что-нибудь построите - pyplot / pylab создаст фигуру, как только когда вы что-то рисуете, размер всплывающего окна кажется фиксированным на этом этапе.

CMCDragonkai
17 июля 2017 в 10:48
4

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

Breno Baiardi
9 ноября 2017 в 17:43
1

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

Jouni K. Seppänen
13 ноября 2017 в 14:43
2

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

Stefano
17 апреля 2019 в 16:13
0

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

avatar
jfs
2 декабря 2008 в 16:01
79

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

y.selivonchyk
12 октября 2016 в 11:58
9

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

avatar
tatwright
1 декабря 2008 в 21:28
403

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

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

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

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

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

nealmcb
10 декабря 2013 в 20:57
3

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

Bennett Brown
6 февраля 2016 в 19:18
4

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

Mischa
10 июля 2017 в 14:17
2

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

Steve Gon
13 декабря 2018 в 03:08
0

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

g07kore
27 сентября 2019 в 06:44
2

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

jorijnsmit
25 октября 2019 в 19:32
0

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

BachT
31 мая 2020 в 21:08
0

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

Eric Duminil
24 ноября 2020 в 21:36
0

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