Wykresy dna morskiego nie pojawiają się

205

Jestem pewien, że zapominam o czymś bardzo prostym, ale nie mogę zmusić pewnych fabuł do współpracy z Seaborn.

Jeśli zrobię:

import seaborn as sns

Następnie wszelkie wątki, które tworzę jak zwykle za pomocą matplotlib, otrzymują styl Seaborn (z szarą siatką w tle).

Jeśli jednak spróbuję wykonać jeden z przykładów, na przykład:

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>

Funkcja pairplot zwraca obiekt PairGrid, ale wykres nie pojawia się.

Jestem trochę zdezorientowany, ponieważ matplotlib wydaje się działać poprawnie, a style Seaborn są stosowane do innych wykresów matplotlib, ale funkcje Seaborn wydają się nic nie robić. Czy ktoś ma pojęcie, co może być problemem?

robc89
źródło
12
Wystarczy zgadnąć ... jeśli używasz ipython, musisz zadzwonić, %matplotlib inlineaby określić wbudowany backend. W przeciwnym razie możesz zadzwonić, sns.plt.show()aby renderować wykres w osobnym oknie.
Jakob

Odpowiedzi:

360

Wykresy utworzone przy użyciu dna morskiego muszą być wyświetlane jak zwykłe wykresy matplotlib. Można to zrobić za pomocą

plt.show()

funkcja z matplotlib.

Pierwotnie zamieściłem rozwiązanie, aby użyć już zaimportowanego obiektu matplotlib z seaborn ( sns.plt.show()), ale jest to uważane za złą praktykę. Dlatego po prostu zaimportuj bezpośrednio moduł matplotlib.pyplot i pokaż swoje wykresy za pomocą

import matplotlib.pyplot as plt
plt.show()

Jeśli używany jest notatnik IPython, można wywołać wbudowany backend, aby wyeliminować konieczność wywoływania show po każdym wątku. Odpowiednia magia to

%matplotlib inline
Jakob
źródło
4
Nadal nie wyświetla się interaktywnie wykres sns. sns.plt.show () nie działa. Ale kiedy zmieniam go na wbudowany, otrzymuję fabułę (ale nie interaktywnie). Masz pomysł, dlaczego?
użytkownik 3317704,
można próbować określić backend przy użyciu coś jak %matplotlib qt, %matplotlib gtk, %matplotlib tkitp zobaczyć %matplotlib?więcej informacji
Jakob
17
To naprawdę denerwujące, że w przykładach na stronie seaborn nie ma polecenia sns.plt.show (). Jak mogą zapomnieć o czymś tak elementarnym?
Michael Hecht,
@MichaelHecht Brak plt.show () został w jakiś sposób rozwiązany w tym problemie , możesz rozwiązać tam swoje skargi. Może dodadzą to do dokumentów.
Jakob
@Jakob jest sposób w Jupyter (przez Anacondę), aby dodać tę magię %matplotlib inlinedo jakiegoś pliku konfiguracyjnego, aby zawsze był stosowany? Czy zawsze muszę dodawać go do każdego nowego skoroszytu?
whytheq
41

Przychodzę do tego pytania dość regularnie i zawsze zajmuje mi trochę czasu znalezienie tego, czego szukam:

import seaborn as sns
import matplotlib.pyplot as plt

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

Uwaga: W Pythonie 2 możesz także używać sns.plt.show(), ale nie w Pythonie 3.

Kompletny przykład

#!/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()

Daje

wprowadź opis zdjęcia tutaj

Martin Thoma
źródło
1
AttributeError: module 'seaborn' has no attribute 'plt'
weberc2
@ weberc2 Naprawiono. Problem był tylko w Pythonie 3, którego nie masns.plt
Martin Thoma,
19

Aby uniknąć nieporozumień (jak się wydaje w komentarzach). Zakładając, że jesteś na Jupyter:

%matplotlib inline> wyświetla wykresy WEWNĄTRZ notebooka

sns.plt.show()> wyświetla wykresy NA ZEWNĄTRZ notebooka

%matplotlib inlinebędzie przesłonić sns.plt.show() w tym sensie, że działki zostaną pokazane IN notebooka nawet gdy sns.plt.show()nazywa.

I tak, łatwo jest dołączyć linię do konfiguracji:

Automatycznie uruchom% matplotlib inline w IPython Notebook

Wydaje się jednak, że lepszą konwencją jest utrzymanie go razem z importem w rzeczywistym kodzie.

mikkokotila
źródło
Do notebooków Spark?
technazi
8

To zadziałało dla mnie

import matplotlib.pyplot as plt
import seaborn as sns
.
.
.
plt.show(sns)
emon
źródło
4

Moja rada to tylko dać

plt.figure()i podaj trochę wykresu sns. Na przykład

sns.distplot(data).

Choć będzie wyglądać, nie pokazuje żadnej fabuły, gdy zmaksymalizujesz figurę, będziesz mógł zobaczyć fabułę.

użytkownik 3317704
źródło
Zapomniałem utworzyć figury ( plt.figure()) przed wykonaniem mojego wykresu liniowego i nie rozumiałem, dlaczego wykres nie pojawił się. Wspaniale, dziękuje!
Sander Vanden Hautte
2

Jeśli drukujesz w konsoli IPython (gdzie nie możesz używać %matplotlib inline) zamiast w notesie Jupyter i nie chcesz uruchamiać się plt.show()wielokrotnie, możesz uruchomić konsolę IPython za pomocą ipython --pylab:

$ 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
Czad
źródło
1

Mówiąc po stylu fragmentu kodu, przypuszczam, że używasz IPython zamiast Jupyter Notebook.

W tym wydaniu GitHub członek IPython w 2016 roku wyjaśnił, że wyświetlanie wykresów będzie działało tylko wtedy, gdy „będzie działać tylko wtedy, gdy jest to jądro Jupyter”. Zatem %matplotlib inlinenie zadziałałoby.

Właśnie miałem ten sam problem i zasugerowałem, aby użyć do wizualizacji Notatnika Jupyter.

Weisi Zhan
źródło