Seaborn-Parzellen werden nicht angezeigt

204

Ich bin sicher, ich vergesse etwas sehr Einfaches, aber ich kann bestimmte Pläne nicht dazu bringen, mit Seaborn zu arbeiten.

Wenn ich mache:

import seaborn as sns

Dann erhalten alle Diagramme, die ich wie gewohnt mit matplotlib erstelle, das Seaborn-Styling (mit dem grauen Gitter im Hintergrund).

Wenn ich jedoch versuche, eines der Beispiele zu erstellen, wie z.

In [1]: import seaborn as sns

In [2]: sns.set()

In [3]: df = sns.load_dataset('iris')

In [4]: sns.pairplot(df, hue='species', size=2.5)
Out[4]: <seaborn.axisgrid.PairGrid at 0x3e59150>

Die Pairplot-Funktion gibt ein PairGrid-Objekt zurück, das Plot wird jedoch nicht angezeigt.

Ich bin ein wenig verwirrt, weil matplotlib anscheinend richtig funktioniert und die Seaborn-Stile auf andere matplotlib-Plots angewendet werden, aber die Seaborn-Funktionen scheinen nichts zu bewirken. Hat jemand eine Idee, was das Problem sein könnte?

robc89
quelle
12
Nur eine kurze Vermutung ... Wenn Sie ipython verwenden, müssen Sie aufrufen %matplotlib inline, um das Inline-Backend anzugeben. Andernfalls können Sie aufrufen sns.plt.show(), um das Diagramm in einem separaten Fenster zu rendern.
Jakob

Antworten:

359

Mit Seaborn erstellte Diagramme müssen wie normale Matplotlib-Diagramme angezeigt werden. Dies kann mit dem erfolgen

plt.show()

Funktion von matplotlib.

Ursprünglich habe ich die Lösung veröffentlicht, um das bereits importierte matplotlib-Objekt von seaborn ( sns.plt.show()) zu verwenden. Dies wird jedoch als schlechte Praxis angesehen. Importieren Sie daher einfach direkt das Modul matplotlib.pyplot und zeigen Sie Ihre Plots mit

import matplotlib.pyplot as plt
plt.show()

Wenn das IPython-Notizbuch verwendet wird, kann das Inline-Backend aufgerufen werden, um die Notwendigkeit zu beseitigen, nach jedem Plot show aufzurufen. Die jeweilige Magie ist

%matplotlib inline
Jakob
quelle
4
Ich bekomme immer noch keine Sns-Handlung, die interaktiv gezeigt wird. sns.plt.show () funktioniert nicht. Aber wenn ich es in Inline ändere, bekomme ich die Handlung (aber nicht interaktiv). Irgendeine Idee warum?
Benutzer 3317704
Sie könnten versuchen , einen Backend mit so etwas wie zu spezifizieren %matplotlib qt, %matplotlib gtk, %matplotlib tketc. siehe %matplotlib?für weitere Informationen
Jakob
15
Es ist wirklich ärgerlich, dass es in den Beispielen auf der Seaborn-Seite keinen Befehl sns.plt.show () gibt. Wie können sie etwas so Elementares vergessen?
Michael Hecht
@MichaelHecht Das Fehlen von plt.show () wurde in dieser Ausgabe irgendwie behoben , Sie könnten Ihre Beschwerden dort ansprechen. Vielleicht fügen sie es den Dokumenten hinzu.
Jakob
@Jakob gibt es in Jupyter (über Anaconda) eine Möglichkeit, diese Magie %matplotlib inlineeiner Reihe von Konfigurationsdateien hinzuzufügen , damit sie immer angewendet wird? Oder muss ich es immer zu jeder neuen Arbeitsmappe hinzufügen?
Whytheq
41

Ich komme ziemlich regelmäßig zu dieser Frage und es dauert immer eine Weile, bis ich finde, wonach ich suche:

import seaborn as sns
import matplotlib.pyplot as plt

plt.show()  # <--- This is what you are looking for

Bitte beachten Sie: In Python 2 können Sie auch sns.plt.show()Python 3 verwenden , jedoch nicht.

Vollständiges Beispiel

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""Visualize C_0.99 for all languages except the 10 with most characters."""

import seaborn as sns
import matplotlib.pyplot as plt

l = [41, 44, 46, 46, 47, 47, 48, 48, 49, 51, 52, 53, 53, 53, 53, 55, 55, 55,
     55, 56, 56, 56, 56, 56, 56, 57, 57, 57, 57, 57, 57, 57, 57, 58, 58, 58,
     58, 59, 59, 59, 59, 59, 59, 59, 59, 60, 60, 60, 60, 60, 60, 60, 60, 61,
     61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 62, 62, 62, 62, 62, 62, 62, 62,
     62, 63, 63, 63, 63, 63, 63, 63, 63, 63, 64, 64, 64, 64, 64, 64, 64, 65,
     65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 66, 66, 66, 66, 66, 66, 66,
     67, 67, 67, 67, 67, 67, 67, 67, 68, 68, 68, 68, 68, 69, 69, 69, 70, 70,
     70, 70, 71, 71, 71, 71, 71, 72, 72, 72, 72, 73, 73, 73, 73, 73, 73, 73,
     74, 74, 74, 74, 74, 75, 75, 75, 76, 77, 77, 78, 78, 79, 79, 79, 79, 80,
     80, 80, 80, 81, 81, 81, 81, 83, 84, 84, 85, 86, 86, 86, 86, 87, 87, 87,
     87, 87, 88, 90, 90, 90, 90, 90, 90, 91, 91, 91, 91, 91, 91, 91, 91, 92,
     92, 93, 93, 93, 94, 95, 95, 96, 98, 98, 99, 100, 102, 104, 105, 107, 108,
     109, 110, 110, 113, 113, 115, 116, 118, 119, 121]

sns.distplot(l, kde=True, rug=False)

plt.show()

Gibt

Geben Sie hier die Bildbeschreibung ein

Martin Thoma
quelle
1
AttributeError: module 'seaborn' has no attribute 'plt'
weberc2
@ weberc2 Behoben. Das Problem war nur in Python 3, das nicht hatsns.plt
Martin Thoma
19

Um Verwirrung zu vermeiden (wie es einige in den Kommentaren zu geben scheint). Angenommen, Sie sind auf Jupyter:

%matplotlib inline> Zeigt die Plots INSIDE dem Notebook

sns.plt.show()> zeigt die Diagramme AUSSERHALB des Notebooks an

%matplotlib inlinewird üBERSCHREIBT sns.plt.show() in dem Sinne , dass Grundstücke gezeigt werden IN dem Notebook selbst wenn sns.plt.show()genannt wird.

Und ja, es ist einfach, die Zeile in Ihre Konfiguration aufzunehmen:

Führen Sie% matplotlib automatisch in IPython Notebook inline aus

Es scheint jedoch eine bessere Konvention zu sein, sie zusammen mit Importen im eigentlichen Code zu halten.

Mikkokotila
quelle
Für Funkenhefte?
Technazi
8

Das hat bei mir funktioniert

import matplotlib.pyplot as plt
import seaborn as sns
.
.
.
plt.show(sns)
Emon
quelle
4

Mein Rat ist nur zu geben

plt.figure()und geben Sie einige sns Handlung. Beispielsweise

sns.distplot(data).

Obwohl es so aussieht, zeigt es kein Diagramm. Wenn Sie die Figur maximieren, können Sie das Diagramm sehen.

Benutzer 3317704
quelle
Ich habe vergessen, eine Figur ( plt.figure()) zu erstellen, bevor ich mein Liniendiagramm erstellt habe, und habe nicht verstanden, warum das Diagramm nicht angezeigt wurde. Großartig, danke!
Sander Vanden Hautte
2

Wenn Sie in der IPython-Konsole (wo Sie sie nicht verwenden können %matplotlib inline) anstelle des Jupyter-Notebooks plotten und nicht plt.show()wiederholt ausführen möchten , können Sie die IPython-Konsole mit ipython --pylabfolgenden Funktionen starten :

$ ipython --pylab     
Python 3.6.6 |Anaconda custom (64-bit)| (default, Jun 28 2018, 17:14:51) 
Type 'copyright', 'credits' or 'license' for more information
IPython 7.0.1 -- An enhanced Interactive Python. Type '?' for help.
Using matplotlib backend: Qt5Agg

In [1]: import seaborn as sns

In [2]: tips = sns.load_dataset("tips")

In [3]: sns.relplot(x="total_bill", y="tip", data=tips) # you can see the plot now
Tschad
quelle
1

Um anhand des Stils Ihres Code-Snippets zu erkennen, haben Sie vermutlich IPython anstelle von Jupyter Notebook verwendet.

In dieser Ausgabe auf GitHub wurde von einem Mitglied von IPython im Jahr 2016 klargestellt, dass die Anzeige von Diagrammen nur funktionieren würde, wenn "nur funktioniert, wenn es sich um einen Jupyter-Kernel handelt". Somit %matplotlib inlinewürde das nicht funktionieren.

Ich hatte gerade das gleiche Problem und schlage vor, dass Sie Jupyter Notebook für die Visualisierung verwenden.

Weisi Zhan
quelle