Как изменить размер фигуры для морского участка?

224

Как изменить размер моего изображения, чтобы оно подходило для печати?

Например, я хотел бы использовать для бумаги формата А4, размеры которой составляют 11,7 дюйма на 8,27 дюйма в альбомной ориентации.

Майкл Грейзбрук
источник

Ответы:

197

Вам нужно заранее создать объекты Matplotlib Figure и Axes, указав, насколько велика фигура:

from matplotlib import pyplot
import seaborn

import mylib

a4_dims = (11.7, 8.27)
df = mylib.load_data()
fig, ax = pyplot.subplots(figsize=a4_dims)
seaborn.violinplot(ax=ax, data=df, **violin_options)
Пол Х
источник
7
похоже, что это решение не работает с кодом, который следует (другой тип сюжета). Любые идеи? Я предполагаю, что «mylib» - это просто библиотека, в которой вы сохранили свои данные и не нужны в этом коде: `fig, ax = pyplot.subplots (figsize = (12,6)); sns.jointplot (memoryPrice ['price'], memoryPrice ['Memory']) `
TMWP
3
Этот ответ не работает в случае @ TMWP, потому что JointPlot - это метод уровня фигуры. Смотрите ответ ниже.
Elz
5
этот ответ не работает с теми типами сюжетов, которые не принимают, например, топор в качестве входных данныхsns.lmplot()
Chris
2
Площадь участка в Сиборне должна быть установлена с использованием heightи aspectпараметров , как описано здесь stackoverflow.com/a/51602446/2412831
LeandroOrdonez
@LeandroOrdonez, который на самом деле не применим к функции уровня осей.
Пол Х
234

Вы также можете установить размер фигуры, передав словарь rcпараметру с ключом 'figure.figsize'в setметоде seaborn :

import seaborn as sns

sns.set(rc={'figure.figsize':(11.7,8.27)})

Другой альтернативой может быть использование figure.figsizeпо rcParamsустановить размер фигуры , как показано ниже:

from matplotlib import rcParams

# figure size in inches
rcParams['figure.figsize'] = 11.7,8.27

Более подробную информацию можно найти в документации matplotlib

ученик
источник
5
В отличие от других решений, это решение не предполагает определенного способа определения сюжета. Спасибо.
LoMaPh
7
Обратите внимание, что когда вы вызываете sns.set (), он по умолчанию использует стили фигуры по умолчанию sns вместо значения по умолчанию для matplotlib, например, ваши фигуры вдруг получат серый фон с белой сеткой - см. Здесь: seaborn.pydata.org/ tutorial / aesthetics.html . Кроме того, это не повлияло на размер моего сюжета (sns.pairplot).
Мелисса
Ни мой как sns.boxplot
Гордон
Спасибо за это @Melissa. Это заставило меня понять, что я должен позвонить .set()раньше.set_style()
jorijnsmit
90

Вы можете установить контекст posterили установить вручную fig_size.

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

np.random.seed(0)
n, p = 40, 8
d = np.random.normal(0, 2, (n, p))
d += np.log(np.arange(1, p + 1)) * -5 + 10


# plot
sns.set_style('ticks')
fig, ax = plt.subplots()
# the size of A4 paper
fig.set_size_inches(11.7, 8.27)
sns.violinplot(data=d, inner="points", ax=ax)    
sns.despine()

fig.savefig('example.png')

введите описание изображения здесь

Цзянсун Ли
источник
3
этот ответ не работает с теми типами сюжетов, которые не принимают, например, топор в качестве входных данныхsns.lmplot()
Chris
Чтобы расширить ответ Криса, некоторые морские графики генерируют составные фигуры с несколькими осями, поэтому они НЕ МОГУТ использовать одну ось в качестве аргумента.
Мармадьюк
74

Обратите внимание, что если вы пытаетесь перейти к методу «на уровне фигуры» в seaborn (например lmplot, catplot/ factorplot, jointplot), вы можете и должны указать это в аргументах, используя heightи aspect.

sns.catplot(data=df, x='xvar', y='yvar', 
    hue='hue_bar', height=8.27, aspect=11.7/8.27)

См. Https://github.com/mwaskom/seaborn/issues/488 и Plotting with seaborn с использованием объектно-ориентированного интерфейса matplotlib для получения более подробной информации о том, что методы уровня фигуры не подчиняются спецификациям осей.

Elz
источник
12
Пока это единственный ответ, который правильно работает с графиками sns, которые не принимают ax в качестве аргумента.
Мелисса
Обратите внимание, что высота и аспект управляют размерами одного «фасета», то есть участка. Так что это напрямую не регулирует полные размеры фигуры.
Берни
43

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

from matplotlib import pyplot as plt
import seaborn as sns

plt.figure(figsize=(15,8))
ax = sns.barplot(x="Word", y="Frequency", data=boxdata)
Gucci148
источник
20

Это можно сделать с помощью:

plt.figure(figsize=(15,8))
sns.kdeplot(data,shade=True)
PSN
источник
19

Это также должно работать.

from matplotlib import pyplot as plt
import seaborn as sns    

plt.figure(figsize=(15,16))
sns.countplot(data=yourdata, ...)
Муфаддал Тахир
источник
16

Для моего сюжета (sns factorplot) предложенный ответ не работает нормально.

Таким образом я использую

plt.gcf().set_size_inches(11.7, 8.27)

Сразу после сюжета с Морским борном (поэтому нет необходимости передавать топор морскому морю или менять настройки радиоуправления).

head7
источник
1
Это единственное решение, которое работает для меня с FacetGridpython g = sns.FacetGrid(df.set_index('category'), col="id") pyplot.gcf().set_size_inches(11.7, 8.27) g.map(lambda data, color: data.plot.barh(color=color), "count")
Nicolas78
Тоже самое. Кажется, sns.FacetGridчто нужно установить размер фигуры в соответствии с вычисленным значением (установленным с помощью heightи aspect) и изменить размер фигуры непосредственно после того, как будет работать рисование морского дна. И другая тонкая настройка сюжета может произойти после изменения размера фигуры
Юнтинг Чжао
16

В дополнение к ответу elz, касающемуся методов «уровня фигуры», которые возвращают многосюжетные объекты сетки, можно явно установить высоту и ширину фигуры (то есть без использования соотношения сторон), используя следующий подход:

import seaborn as sns 

g = sns.catplot(data=df, x='xvar', y='yvar', hue='hue_bar')
g.fig.set_figwidth(8.27)
g.fig.set_figheight(11.7)
dmainz
источник
set_figwidthи set_figheightхорошо работают для объектов сетки. >>> импорт seaborn >>> импорт matplotlib.pyplot в виде pyplot >>> tips = seaborn.load_dataset ("tips") >>> g = seaborn.FacetGrid (tips, col = "time", row = "smoker") >>> g = g.map (pyplot.hist, "total_bill") >>> g.fig.set_figwidth (10) >>> g.fig.set_figheight (10)
Поль Ружье
1
Возможно, API изменился, но для меня это был g.figure.set_figwidth вместо g.fig.set_figwidth. Я использую Matplotlib версии 3.1.0 и Seaborn 0.9.0
NateW
6

Лучшие ответы Пола Х и Дж. Ли не работают для всех типов морских фигур. Для FacetGridтипа (например sns.lmplot()), использовать sizeи aspectпараметр.

Size изменяет высоту и ширину, сохраняя пропорции.

Aspect только изменяет ширину, сохраняя высоту постоянной.

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

Кредит: https://stackoverflow.com/a/28765059/3901029

Крис
источник