Le trame di Seaborn non vengono visualizzate


205

Sono sicuro di dimenticare qualcosa di molto semplice, ma non riesco a far funzionare determinate trame con Seaborn.

Se lo faccio:

import seaborn as sns

Quindi tutte le trame che creo come al solito con matplotlib ottengono lo stile Seaborn (con la griglia grigia sullo sfondo).

Tuttavia, se provo a fare uno degli esempi, come:

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>

La funzione pairplot restituisce un oggetto PairGrid, ma la trama non viene visualizzata.

Sono un po 'confuso perché matplotlib sembra funzionare correttamente e gli stili Seaborn vengono applicati ad altri grafici matplotlib, ma le funzioni Seaborn non sembrano fare nulla. Qualcuno ha idea di quale potrebbe essere il problema?


12
Solo una rapida ipotesi ... se stai usando ipython devi chiamare %matplotlib inlineper specificare il back-end in linea. Altrimenti potresti chiamare sns.plt.show()per rendere la trama in una finestra separata.
Jakob,

Risposte:


361

I grafici creati utilizzando Seaborn devono essere visualizzati come normali grafici a matplotlib. Questo può essere fatto usando il

plt.show()

funzione da matplotlib.

Inizialmente ho pubblicato la soluzione per utilizzare l'oggetto matplotlib già importato da seaborn ( sns.plt.show()), tuttavia questa è considerata una cattiva pratica. Pertanto, è sufficiente importare direttamente il modulo matplotlib.pyplot e mostrare i grafici con

import matplotlib.pyplot as plt
plt.show()

Se si utilizza il notebook IPython, è possibile richiamare il back-end in linea per rimuovere la necessità di chiamare show dopo ogni trama. La rispettiva magia è

%matplotlib inline

4
Non riesco ancora a mostrare una trama sns in modo interattivo. sns.plt.show () non funziona. Ma quando lo cambio in linea, ottengo la trama (ma non in modo interattivo). Qualche idea sul perché?
utente 3317704

si potrebbe provare a specificare un back-end con qualcosa di simile %matplotlib qt, %matplotlib gtk, %matplotlib tkecc consultare %matplotlib?per ulteriori informazioni
Jakob

17
È davvero fastidioso che negli esempi alla pagina Seaborn non vi sia alcun comando sns.plt.show (). Come possono dimenticare qualcosa di così elementare?
Michael Hecht,

@MichaelHecht La mancanza di plt.show () è stata in qualche modo affrontata in questo numero , potresti indirizzare i tuoi reclami lì. Forse lo aggiungeranno ai documenti.
Jakob,

@Jakob c'è un modo all'interno di Jupyter (via Anaconda) per aggiungere questa magia %matplotlib inlineal somesort del file di configurazione in modo che sia sempre applicato? O devo sempre aggiungerlo a ogni nuova cartella di lavoro?
whytheq,

41

Vengo a questa domanda abbastanza regolarmente e mi ci vuole sempre un po 'di tempo per trovare quello che cerco:

import seaborn as sns
import matplotlib.pyplot as plt

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

Nota: in Python 2 puoi anche usare sns.plt.show(), ma non in Python 3.

Esempio completo

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

inserisci qui la descrizione dell'immagine


1
AttributeError: module 'seaborn' has no attribute 'plt'
weberc2,

@ weberc2 Risolto. Il problema era solo in Python 3, che non hasns.plt
Martin Thoma il

19

Per evitare confusione (come sembra esserci un po 'nei commenti). Supponendo che tu sia su Jupyter:

%matplotlib inline> visualizza i grafici ALL'INTERNO del notebook

sns.plt.show()> visualizza i grafici ESTERNI del notebook

%matplotlib inlineeseguirà l' override, sns.plt.show() nel senso che i grafici verranno mostrati nel notebook anche quando sns.plt.show()viene chiamato.

E sì, è facile includere la linea nella tua configurazione:

Esegui automaticamente% matplotlib inline in Notebook IPython

Ma sembra una convenzione migliore tenerlo insieme alle importazioni nel codice attuale.


Per i notebook Spark?
technazi,

8

Questo ha funzionato per me

import matplotlib.pyplot as plt
import seaborn as sns
.
.
.
plt.show(sns)

4

Il mio consiglio è solo di dare a

plt.figure()e dare qualche trama sns. Per esempio

sns.distplot(data).

Anche se sembrerà che non mostri alcuna trama, quando massimizzi la figura, sarai in grado di vedere la trama.


Ho dimenticato di creare una figura ( plt.figure()) prima di creare il mio grafico a linee e non ho capito perché la trama non è stata visualizzata. Eccellente grazie!
Sander Vanden Hautte,

2

Se si stampa nella console IPython (dove non è possibile utilizzare %matplotlib inline) anziché nel notebook Jupyter e non si desidera eseguire plt.show()ripetutamente, è possibile avviare la console IPython con 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

1

Per dirlo dallo stile del tuo frammento di codice, suppongo che stavi usando IPython piuttosto che Jupyter Notebook.

In questo numero su GitHub, nel 2016 un membro di IPython ha chiarito che la visualizzazione dei grafici funzionerebbe solo quando "funziona solo quando si tratta di un kernel Jupyter". Pertanto, il %matplotlib inlinenon funzionerebbe.

Stavo avendo lo stesso problema e ti suggerisco di usare Jupyter Notebook per la visualizzazione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.