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.

Michael Grazebrook
źródło

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)
Paul H.
źródło
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

student
źródło
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

Jianxun Li
źródło
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.

elz
źródło
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)
Gucci148
źródło
20

Można to zrobić za pomocą:

plt.figure(figsize=(15,8))
sns.kdeplot(data,shade=True)
PSN
źródło
19

To też zadziała.

from matplotlib import pyplot as plt
import seaborn as sns    

plt.figure(figsize=(15,16))
sns.countplot(data=yourdata, ...)
Mufaddal Tahir
źródło
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).

head7
źródło
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)
dmainz
źródło
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

Chris
źródło