Як змінити розмір фігури для сюжету з морепродуктом?


223

Як змінити розмір свого зображення, щоб воно було придатним для друку?

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

Відповіді:


197

Вам потрібно заздалегідь створити об'єкти matplotlib Figure and 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()
Кріс,

2
Площа ділянки в Сіборн повинна бути встановлена з використанням heightі aspectпараметрів , як описано тут stackoverflow.com/a/51602446/2412831
LeandroOrdonez

@LeandroOrdonez, що не дуже застосовно до функцій рівня осей.
Пол H

234

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

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/ посібник / естетика.html . Крім того, це не вплинуло на розмір мого сюжету (sns.pairplot).
Меліса

Ні міна як sns.boxplot
Гордон

Дякую за це @Melissa. Це дало мені зрозуміти, що я повинен зателефонувати .set()раніше.set_style()
jorijnsmit

89

Ви можете встановити контекст 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()
Кріс,

Для розширення відповіді Кріса деякі сюжети з новонароджених генерують складені фігури з декількома осями, тому вони НЕ МОЖУТЬ приймати одну вісь як аргумент.
Мармадуке

73

Зауважте, що якщо ви намагаєтеся перейти до методу "фігурного рівня" у новонароджених (наприклад 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/isissue/488 та " Плотування з морем" за допомогою об'єктно-орієнтованого інтерфейсу matplotlib .


11
Це єдина відповідь на даний момент, що правильно стосується 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)

20

Це можна зробити за допомогою:

plt.figure(figsize=(15,8))
sns.kdeplot(data,shade=True)


16

Для мого сюжету (sns factorplot) запропонована відповідь не спрацювала нормально.

Таким чином я використовую

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

Одразу після сюжету з новонародженим (так що не потрібно передавати сокиру новонародженому або змінювати настройки rc).


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)

set_figwidthі set_figheightдобре працювати над об’єктами сітки. >>> імпортувати новонароджених >>> імпортувати matplotlib.pyplot як pyplot >>> tips = seaborn.load_dataset ("поради") >>> 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 та новонародженого 0.9.0
NateW

6

Найпопулярніші відповіді Пола Н та Дж. Лі діють не для всіх типів фігур моряків. Для FacetGridтипу (наприклад sns.lmplot()) використовуйте параметр sizeі aspect.

Size змінює як висоту, так і ширину, зберігаючи співвідношення сторін.

Aspect змінюється лише ширина, зберігаючи висоту постійною.

Ви завжди можете отримати потрібний розмір, граючи з цими двома параметрами.

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

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