Как изменить размер фигуры в host_subplot? [Дубликат]

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

  • вы сами будете нести ответственность за этот словарь, включая сбор мусора (из переменных in-dict) и т. Д. .
  • нет никакой локальности или глобальности для переменных переменных, это зависит от глобальности словаря
  • , если вы хотите переименовать имя переменной, вам придется сделать это вручную
  • однако вы гораздо более гибкие, например вы можете решить перезаписать существующие переменные или ... ... выбрать реализацию константных переменных для создания исключения при перезаписи для разных типов и т. д.

Тем не менее, я реализовал variable variables manager -класс, который предоставляет некоторые из вышеперечисленных идей. Он работает для python 2 и 3.

Вы использовали бы класс следующим образом:

from variableVariablesManager import VariableVariablesManager

myVars = VariableVariablesManager()
myVars['test'] = 25
print(myVars['test'])

# define a const variable
myVars.defineConstVariable('myconst', 13)
try:
    myVars['myconst'] = 14 # <- this raises an error, since 'myconst' must not be changed
    print("not allowed")
except AttributeError as e:
    pass

# rename a variable
myVars.renameVariable('myconst', 'myconstOther')

# preserve locality
def testLocalVar():
    myVars = VariableVariablesManager()
    myVars['test'] = 13
    print("inside function myVars['test']:", myVars['test'])
testLocalVar()
print("outside function myVars['test']:", myVars['test'])

# define a global variable
myVars.defineGlobalVariable('globalVar', 12)
def testGlobalVar():
    myVars = VariableVariablesManager()
    print("inside function myVars['globalVar']:", myVars['globalVar'])
    myVars['globalVar'] = 13
    print("inside function myVars['globalVar'] (having been changed):", myVars['globalVar'])
testGlobalVar()
print("outside function myVars['globalVar']:", myVars['globalVar'])

Если вы хотите разрешить переписывание переменных с помощью только тот же тип:

myVars = VariableVariablesManager(enforceSameTypeOnOverride = True)
myVars['test'] = 25
myVars['test'] = "Cat" # <- raises Exception (different type on overwriting)

1206
задан tatwright 1 December 2008 в 22:24
поделиться

13 ответов

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

from matplotlib import pyplot as plt
F = 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

9
ответ дан Blairg23 20 August 2018 в 21:14
поделиться

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

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

Перед тем, как вы нарисуете, вам нужно установить размер фигуры.

156
ответ дан cbare 20 August 2018 в 21:14
поделиться
  • 1
    Этот ответ говорит мне, что это m atplotlib.pyplot.figure, о котором другие не говорят так четко. Я продолжаю пробовать такие вещи, как matplotlib.figure и matplotlib.figure.Figure – Lyndon White 24 December 2014 в 06:29
  • 2
    & quot; _tkinter.TclError: недостаточно свободной памяти для буфера изображений & quot; – Cerin 30 March 2017 в 00:16
  • 3
    plt.figure(figsize=(1,1)) - это крутой ход. Спасибо. – ximiki 15 November 2017 в 17:24
  • 4
    Это сработало для меня – xssChauhan 2 March 2018 в 20:09
  • 5
    Это не работает для меня в ноутбуке jupyter – Selah 16 August 2018 в 18:52

Поскольку 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))
67
ответ дан Community 20 August 2018 в 21:14
поделиться
  • 1
    Каждый раз, когда я пытаюсь вспомнить, как это сделать, я попадаю в этот пост. Итак, это код, который я обычно ищу: fig = plt.figure() default_size = fig.get_size_inches() fig.set_size_inches( (default_size[0]*2, default_size[1]*2) ) – yauheni_selivonchyk 12 October 2016 в 11:58

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

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

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

Это очень полезно при построении встроенного (например, с IPython Notebook).

Преобразование в cm

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

128
ответ дан G M 20 August 2018 в 21:14
поделиться
  • 1
    Отлично! Также полезно устанавливать его один раз и многократно рисовать. – automorphic 18 October 2017 в 22:44
  • 2
    По какой-то причине, похоже, это больше не работает в ноутбуке Jupyter (но используется). – Ray 13 December 2017 в 15:01
  • 3
    @Ray Можете ли вы написать версию своего ноутбука Jupyter и поведение для меня это работает – G M 13 December 2017 в 17:41
  • 4
    @GM в прошлый раз, когда я тестировал, это была версия Jupyter 4.3.0 и Python 3.6.2 от Anaconda, в Windows 10 и Google Chrome 63.0.3239.84. – Ray 19 December 2017 в 18:13
  • 5
    Чтобы он работал, мне нужно вызвать plt.rcParams["figure.figsize"] = (20,3) в дополнительной ячейке. Когда я вызываю его в той же ячейке, что и оператор импорта, он игнорируется. – asmaier 11 May 2018 в 07:33

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

df['some_column'].plot(figsize=(10, 5))

, где df - это кадр данных Pandas. Если вы хотите изменить настройки по умолчанию, вы можете сделать следующее:

import matplotlib

matplotlib.rc('figure', figsize=(10, 5))
41
ответ дан Kris 20 August 2018 в 21:14
поделиться

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

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

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

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

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

259
ответ дан Peter Duniho 20 August 2018 в 21:14
поделиться
  • 1
    Это также хорошо работает в верхней части ноутбука iPython, который (с учетом --pylab = inline) имеет rcParams, уже импортированный на верхнем уровне. – nealmcb 10 December 2013 в 22:57
  • 2
    Это не сработало на моей Windows-машине с интерфейсом OO на pyplot и Qt-сервере. fig.set_size_inches(18.5, 10.5, forward=True) работал. – Bennett Brown 6 February 2016 в 20:18
  • 3
    Этот ответ в настоящее время обсуждается на Meta – Mischa 10 July 2017 в 14:17
  • 4

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

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

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

13
ответ дан psihodelia 20 August 2018 в 21:14
поделиться

Попробуйте прокомментировать строку 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()
19
ответ дан Renaud 20 August 2018 в 21:14
поделиться

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

20
ответ дан River 20 August 2018 в 21:14
поделиться

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

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)
535
ответ дан tacaswell 20 August 2018 в 21:14
поделиться
  • 1
    Решил меня проблему с imshow, теперь я использую этот код сразу после удаления пространства вокруг области графика с помощью plt.subplots_adjust(left=0.0, right=1.0, bottom=0.0, top=1.0). – heltonbiker 26 November 2012 в 16:21
  • 2
    Аналогично, вы можете запустить fig.set_dpi(100). – Erik Shilts 27 March 2015 в 20:07
  • 3
    @drevicko Вам просто нужно добавить forward=True к вызову set_size_inches. – tacaswell 7 June 2015 в 19:38

figure сообщает вам сигнатуру вызова:

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

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

679
ответ дан Tahlor 20 August 2018 в 21:14
поделиться
  • 1
    Если вы уже создали фигуру, скажите, что это цифра 1 (это по умолчанию используется при использовании pyplot), вы можете использовать цифру (num = 1, figsize = (8, 6), ...) изменить размер и т. д. Если вы используете pyplot / pylab и show() для создания всплывающего окна, вам нужно вызвать figure(num=1,...) перед , что вы рисуете что-либо - pyplot / pylab создает цифру как как только вы рисуете что-то, и размер всплывающего окна, по-видимому, фиксируется на этом этапе. – drevicko 3 July 2013 в 00:31
  • 2
    Я чувствую, что ваш ответ будет лучше, если вы удалите аргументы по умолчанию. Это уменьшает отношение сигнал / шум без необходимости. – frmsaul 5 April 2017 в 18:06
  • 3
    Означает ли это, если вы установили DPI в 1, то figsize станет пиксельным блоком вместо единицы дюймов? Это было бы более полезно при использовании matplotlib для веб-интерфейсов и интерфейсов GUI. – CMCDragonkai 17 July 2017 в 10:48
  • 4
    с figsize (1,1) у вас будет соотношение в изображении как 1: 1? потому что все мои круговые диаграммы показывают овальную форму, и единственный способ, которым я нашел их округлить, - использовать plot.axis («equals»). они будут иметь тот же эффект или они будут вести себя по-другому? – Breno Baiardi 9 November 2017 в 18:43
  • 5
    @BrenoBaiardi Этот вопрос касается размера фигуры. Оси сверху фигуры могут по-прежнему иметь неравномерное соотношение сторон, даже если цифра в целом равна 1: 1, и даже если поле осей равно 1: 1, данные могут масштабироваться по-разному в направлениях x и y. Таким образом, нет, эта команда не гарантирует равное соотношение сторон. – Jouni K. Seppänen 13 November 2017 в 15:43

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

matplotlib.pyplot.get_current_fig_manager().resize(width_px, height_px)
6
ответ дан wilywampa 20 August 2018 в 21:14
поделиться
69
ответ дан Community 31 October 2018 в 16:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: