Jak zmienić rozmiar figury dla dna morskiego?


223

Jak zmienić rozmiar mojego obrazu, aby był odpowiedni do drukowania?

Na przykład chciałbym użyć papieru A4, którego wymiary to 11,7 cala na 8,27 cala w orientacji poziomej.

Odpowiedzi:


197

Musisz wcześniej utworzyć obiekty figury i osi matplotlib, określając, jak duża jest ta figura:

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
to rozwiązanie nie działa z następującym kodem (inny rodzaj fabuły). Jakieś pomysły? Zakładam, że „mylib” jest tylko biblioteką, w której przechowujesz swoje dane i nie jest potrzebny w tym kodzie: `rys, ax = pyplot.subplots (figsize = (12,6)); sns.jointplot (memoryPrice ['cena'], memoryPrice ['Memory']) `
TMWP

3
Ta odpowiedź nie działa w przypadku @ TMWP, ponieważ jointplot jest metodą opartą na liczbach. Zobacz odpowiedź poniżej.
elz

5
ta odpowiedź nie działa z tymi typami fabuły, które nie akceptują topora jako danych wejściowych, na przykładsns.lmplot()
Chris

2
Rozmiar poletka w dnie morskim należy ustawić za pomocą parametrów heighti aspect, jak wyjaśniono tutaj stackoverflow.com/a/51602446/2412831
LeandroOrdonez

@LeandroOrdonez, który tak naprawdę nie ma zastosowania do funkcji poziomu osi.
Paul H

234

Możesz także ustawić rozmiar figury, przekazując słownik do rcparametru za pomocą klucza 'figure.figsize'w setmetodzie morskiej :

import seaborn as sns

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

Inną alternatywą może być wykorzystanie figure.figsizena rcParamsdo zadanej wielkości rysunku poniżej:

from matplotlib import rcParams

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

Więcej szczegółów można znaleźć w dokumentacji matplotlib


5
W przeciwieństwie do innych rozwiązań, to rozwiązanie nie zakłada określonego sposobu definiowania fabuły. Dzięki.
LoMaPh

7
Zauważ, że kiedy wywołasz sns.set (), domyślnie style rysunków są domyślnie ustawione na sns zamiast na matplotlib, na przykład twoje figury nagle miałyby szare tło z białą siatką - patrz tutaj: seaborn.pydata.org/ tutorial / aesthetics.html . Nie miało to również żadnego wpływu na rozmiar mojej działki (sns.pairplot).
Melissa

Ani mój jako sns.boxplot
Gordon

Dzięki za to @ Melissa. Uświadomiłem sobie, że muszę zadzwonić .set()wcześniej.set_style()
jorijnsmit

89

Możesz ustawić kontekst na posterlub ustawić ręcznie 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')

wprowadź opis zdjęcia tutaj


3
ta odpowiedź nie działa z typami fabuły, które nie akceptują topora jako danych wejściowych, na przykładsns.lmplot()
Chris

Aby rozwinąć odpowiedź Chrisa, niektóre wykresy dna morskiego generują złożone figury o wielu osiach, więc NIE MOGĄ przyjąć jednej osi za argument.
Marmaduke,

73

Zauważ, że jeśli próbuje przejść do „poziomu postać” metody w Seaborn (na przykład lmplot, catplot/ factorplot, jointplot) można i należy to określić w ciągu argumentów używając heighti aspect.

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

Zobacz https://github.com/mwaskom/seaborn/issues/488 i Plotowanie przy użyciu dna morskiego za pomocą zorientowanego obiektowo interfejsu matplotlib, aby uzyskać więcej informacji na temat tego, że metody na poziomie figury nie są zgodne ze specyfikacjami osi.


11
To jedyna jak dotąd odpowiedź, która poprawnie obsługuje wykresy sns, które nie akceptują topora jako argumentu.
Melissa

Zauważ, że wysokość i aspekt kontrolują wymiary pojedynczego „aspektu”, tj. Wykresu podrzędnego. Więc to nie reguluje bezpośrednio pełnych wymiarów figury.
bernie

43

najpierw zaimportuj matplotlib i użyj go, aby ustawić rozmiar figury

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

Można to zrobić za pomocą:

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

19

To też zadziała.

from matplotlib import pyplot as plt
import seaborn as sns    

plt.figure(figsize=(15,16))
sns.countplot(data=yourdata, ...)

16

W przypadku mojego wykresu (wykres współczynnika sns) proponowana odpowiedź nie działała dobrze.

Tak używam

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

Zaraz po poletku z dnem morskim (więc nie trzeba przepuszczać siekiery do dna morskiego ani zmieniać ustawień rc).


1
To jedyne rozwiązanie, które działa dla mnie z 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

To samo tutaj. Wygląda na to, sns.FacetGridże ustawiłbym rozmiar figury zgodnie z obliczoną wartością (ustawioną przez heighti aspect) i zmiana rozmiaru figury bezpośrednio po wykreśleniu dna morskiego będzie działać. A inne dopracowanie fabuły może nastąpić po zmianie wielkości figury
Yunting Zhao,

16

Oprócz odpowiedzi Elza dotyczącej metod „poziomu figury”, które zwracają obiekty siatki z wieloma wykresami, możliwe jest jawne ustawienie wysokości i szerokości figury (bez użycia współczynnika kształtu), stosując następujące podejście:

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_figwidthi set_figheightdziała dobrze dla obiektów siatki. >>> importuj seaborn >>> importuj matplotlib.pyplot jako pyplot >>> tips = seaborn.load_dataset („tips”) >>> g = seaborn.FacetGrid (tips, col = „time”, row = „palacz”) >>> g = g.map (pyplot.hist, "total_bill") >>> g.fig.set_figwidth (10) >>> g.fig.set_figheight (10)
Paul Rougieux

1
Być może interfejs API się zmienił, ale dla mnie był to g.figure.set_figwidth zamiast g.fig.set_figwidth. Używam matplotlib w wersji 3.1.0 i seaborn 0.9.0
NateW

6

Najważniejsze odpowiedzi Paula H i J. Li nie działają na wszystkie typy postaci z dna morskiego. Dla FacetGridtypu (na przykład sns.lmplot()) użyj sizeiaspect parametru .

Size zmienia zarówno wysokość, jak i szerokość, zachowując proporcje.

Aspect zmienia tylko szerokość, utrzymując stałą wysokość.

Zawsze możesz uzyskać pożądany rozmiar, grając z tymi dwoma parametrami.

Źródło: https://stackoverflow.com/a/28765059/3901029

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.