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


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.