Wie ändere ich die Figurengröße für ein Grundstück auf See?

223

Wie ändere ich die Größe meines Bildes, damit es zum Drucken geeignet ist?

Zum Beispiel möchte ich A4-Papier verwenden, dessen Abmessungen im Querformat 11,7 x 8,27 Zoll betragen.

Michael Grazebrook
quelle

Antworten:

196

Sie müssen die Objekte matplotlib Figure und Axes im Voraus erstellen und angeben, wie groß die Figur ist:

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.
quelle
7
Diese Lösung scheint mit dem folgenden Code nicht zu funktionieren (andere Art von Plot). Irgendwelche Ideen? Ich gehe davon aus, dass "mylib" nur eine Bibliothek ist, in der Sie Ihre Daten gespeichert haben und die in diesem Code nicht benötigt wird: `fig, ax = pyplot.subplots (figsize = (12,6)); sns.jointplot (memoryPrice ['price'], memoryPrice ['Memory']) `
TMWP
3
Diese Antwort funktioniert im Fall von @ TMWP nicht, da Jointplot eine Methode auf Figurenebene ist. Siehe Antwort unten.
Elz
5
Diese Antwort funktioniert nicht mit den Handlungstypen, die zum Beispiel keine Axt als Eingabe akzeptierensns.lmplot()
Chris
2
Die Grundstücksgröße bei Seegeborenen sollte mithilfe der Parameter heightund aspectwie hier beschrieben eingestellt werden. Stackoverflow.com/a/51602446/2412831
LeandroOrdonez
@LeandroOrdonez, das für Funktionen auf Achsenebene nicht wirklich anwendbar ist.
Paul H
233

Sie können die Figurengröße auch festlegen, indem Sie das Wörterbuch an den rcParameter mit dem Schlüssel 'figure.figsize'in der Seaborn- setMethode übergeben:

import seaborn as sns

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

Andere Alternative kann zu benutzen , figure.figsizeder rcParamswie unten Satz Abbildung Größe:

from matplotlib import rcParams

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

Weitere Details finden Sie in der matplotlib-Dokumentation

Student
quelle
5
Im Gegensatz zu anderen Lösungen setzt diese Lösung keine bestimmte Art der Definition des Diagramms voraus. Vielen Dank.
LoMaPh
6
Beachten Sie, dass beim Aufrufen von sns.set () Ihre Figurenstile standardmäßig die Standardeinstellung sns anstelle der Standardeinstellung matplotlib verwenden. Beispielsweise hätten Ihre Figuren dann plötzlich einen grauen Hintergrund mit weißem Raster - siehe hier: seaborn.pydata.org/ Tutorial / Ästhetik.html . Dies hatte auch keinen Einfluss auf die Größe meines Grundstücks (ein sns.pairplot).
Melissa
Noch meins als sns.boxplot
Gordon
Danke dafür @Melissa. Das machte mir klar , ich muss nennen .set()vor.set_style()
jorijnsmit
89

Sie können den Kontext posterfestlegen oder manuell festlegen 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')

Geben Sie hier die Bildbeschreibung ein

Jianxun Li
quelle
3
Diese Antwort funktioniert nicht mit den Handlungstypen, die zum Beispiel keine Axt als Eingabe akzeptierensns.lmplot()
Chris
Um Chris 'Antwort zu erweitern, generieren einige Diagramme auf See zusammengesetzte Figuren mit mehreren Achsen, sodass sie NICHT eine einzige Achse als Argument verwenden können.
Marmaduke
73

Beachten Sie , wenn Sie auf eine „-Figur Ebene“ Methode in Seaborn zu passieren versuchen (zB lmplot, catplot/ factorplot, jointplot) Sie können und dies innerhalb der Argumente angeben sollten mit heightund aspect.

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

Siehe https://github.com/mwaskom/seaborn/issues/488 und Plotten mit Seaborn mit der matplotlib objektorientierten Schnittstelle für weitere Details über die Tatsache , dass Abbildung Ebene Methoden nicht gehorchen Achsen Spezifikationen.

elz
quelle
11
Dies ist die einzige Antwort, die sich bisher korrekt mit Sns-Plots befasst, die Axe nicht als Argument akzeptieren.
Melissa
Beachten Sie, dass Höhe und Aspekt die Abmessungen einer einzelnen "Facette" steuern, dh einer Nebenhandlung. Dadurch werden die Abmessungen der gesamten Figur nicht direkt angepasst.
Bernie
43

Importieren Sie zuerst matplotlib und stellen Sie damit die Größe der Figur ein

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
quelle
20

Dies kann erfolgen mit:

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

Das soll auch funktionieren.

from matplotlib import pyplot as plt
import seaborn as sns    

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

Für meine Handlung (eine sns-Faktor-Handlung) funktionierte die vorgeschlagene Antwort nicht gut.

Also benutze ich

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

Kurz nach der Handlung mit Seaborn (also keine Notwendigkeit, eine Axt an Seaborn zu übergeben oder die RC-Einstellungen zu ändern).

head7
quelle
1
Dies ist die einzige Lösung, die für mich mit einem FacetGrid funktioniertpython 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
Hier gilt das gleiche. Es scheint, als sns.FacetGridwürde eine Figurengröße gemäß einem berechneten Wert (eingestellt durch heightund aspect) festgelegt, und das Ändern der Figurengröße direkt nach dem Plotten auf See funktioniert. Und andere Feinabstimmungen der Handlung können nach Änderung der Figurengröße erfolgen
Yunting Zhao
16

Zusätzlich zur elz- Antwort bezüglich "Figurenebene" -Methoden, die Rasterobjekte mit mehreren Plots zurückgeben, ist es möglich, die Höhe und Breite der Figur explizit ( dh ohne Verwendung des Seitenverhältnisses) unter Verwendung des folgenden Ansatzes festzulegen :

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
quelle
set_figwidthund set_figheightfunktionieren gut für Gitterobjekte. >>> Seaborn importieren >>> matplotlib.pyplot als Pyplot importieren >>> 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)
Paul Rougieux
1
Vielleicht hat sich die API geändert, aber für mich war es g.figure.set_figwidth anstelle von g.fig.set_figwidth. Ich verwende Matplotlib Version 3.1.0 und Seaborn 0.9.0
NateW
6

Die Top-Antworten von Paul H und J. Li funktionieren nicht für alle Arten von Seegeborenen. Verwenden Sie für den FacetGridTyp (zum Beispiel sns.lmplot()) den Parameter sizeund aspect.

Size Ändert sowohl die Höhe als auch die Breite, wobei das Seitenverhältnis beibehalten wird.

Aspect Ändert nur die Breite und hält die Höhe konstant.

Sie können immer die gewünschte Größe erhalten, indem Sie mit diesen beiden Parametern spielen.

Gutschrift: https://stackoverflow.com/a/28765059/3901029

Chris
quelle