Les parcelles Seaborn n'apparaissent pas

205

Je suis sûr que j'oublie quelque chose de très simple, mais je ne peux pas faire fonctionner certaines parcelles avec Seaborn.

Si je fais:

import seaborn as sns

Ensuite, tous les tracés que je crée comme d'habitude avec matplotlib obtiennent le style Seaborn (avec la grille grise en arrière-plan).

Cependant, si j'essaie de faire l'un des exemples, tels que:

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 fonction pairplot renvoie un objet PairGrid, mais le tracé ne s'affiche pas.

Je suis un peu confus parce que matplotlib semble fonctionner correctement, et les styles Seaborn sont appliqués à d'autres tracés matplotlib, mais les fonctions Seaborn ne semblent rien faire. Quelqu'un at-il une idée de ce qui pourrait être le problème?

robc89
la source
12
Juste une supposition rapide ... si vous utilisez ipython, vous devez appeler %matplotlib inlinepour spécifier le backend en ligne. Sinon, vous pourriez appeler sns.plt.show()pour rendre l'intrigue dans une fenêtre distincte.
Jakob

Réponses:

361

Les tracés créés à l'aide de seaborn doivent être affichés comme des tracés matplotlib ordinaires. Cela peut être fait en utilisant le

plt.show()

fonction de matplotlib.

À l'origine, j'ai publié la solution pour utiliser l'objet matplotlib déjà importé de seaborn ( sns.plt.show()), mais cela est considéré comme une mauvaise pratique. Par conséquent, il suffit d'importer directement le module matplotlib.pyplot et d'afficher vos tracés avec

import matplotlib.pyplot as plt
plt.show()

Si le bloc-notes IPython est utilisé, le backend en ligne peut être invoqué pour supprimer la nécessité d'appeler show après chaque tracé. La magie respective est

%matplotlib inline
Jakob
la source
4
Je ne reçois toujours pas un graphique sns affiché de manière interactive. sns.plt.show () ne fonctionne pas. Mais quand je le change en ligne, j'obtiens l'intrigue (mais pas de manière interactive). Une idée pourquoi?
utilisateur 3317704
vous pouvez essayer de spécifier un back - end en utilisant quelque chose comme %matplotlib qt, %matplotlib gtk, %matplotlib tketc. voir %matplotlib?pour plus d' informations
Jakob
17
C'est vraiment ennuyeux que dans les exemples de la page seaborn, il n'y ait pas de commande sns.plt.show (). Comment peuvent-ils oublier quelque chose d'aussi élémentaire?
Michael Hecht
@MichaelHecht Le manque de plt.show () a été en quelque sorte résolu dans ce problème , vous pouvez y adresser vos plaintes. Peut-être qu'ils l'ajouteront aux documents.
Jakob
@Jakob existe-t-il un moyen au sein de Jupyter (via Anaconda) pour ajouter cette magie %matplotlib inlineà une sorte de fichier de configuration afin qu'elle soit toujours appliquée? Ou dois-je toujours l'ajouter à chaque nouveau classeur?
whytheq
41

J'arrive assez régulièrement à cette question et il me faut toujours un certain temps pour trouver ce que je recherche:

import seaborn as sns
import matplotlib.pyplot as plt

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

Remarque: en Python 2, vous pouvez également utiliser sns.plt.show(), mais pas en Python 3.

Exemple complet

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

Donne

entrez la description de l'image ici

Martin Thoma
la source
1
AttributeError: module 'seaborn' has no attribute 'plt'
weberc2
@ weberc2 Fixed. Le problème était uniquement en Python 3, qui n'a passns.plt
Martin Thoma
19

Pour éviter toute confusion (comme il semble y en avoir dans les commentaires). En supposant que vous êtes sur Jupyter:

%matplotlib inline> affiche les tracés À L' INTÉRIEUR du cahier

sns.plt.show()> affiche les tracés HORS du carnet

%matplotlib inlinesera IGNORER sns.plt.show() au sens que les parcelles seront affichés DANS l'ordinateur portable même quand sns.plt.show()on appelle.

Et oui, il est facile d'inclure la ligne dans votre configuration:

Exécutez automatiquement% matplotlib inline dans IPython Notebook

Mais il semble préférable de le conserver avec les importations dans le code actuel.

mikkokotila
la source
Pour les cahiers à étincelles?
technazi
8

Cela a fonctionné pour moi

import matplotlib.pyplot as plt
import seaborn as sns
.
.
.
plt.show(sns)
emon
la source
4

Mon conseil est juste de donner un

plt.figure()et donner quelques sns intrigue. Par exemple

sns.distplot(data).

Bien qu'il semblera ne montrer aucun tracé, Lorsque vous maximisez le chiffre, vous pourrez voir le tracé.

utilisateur 3317704
la source
J'ai oublié de créer une figure ( plt.figure()) avant de faire mon tracé et je n'ai pas compris pourquoi le tracé ne s'est pas affiché. Excellent, merci!
Sander Vanden Hautte
2

Si vous tracez dans la console IPython (où vous ne pouvez pas utiliser %matplotlib inline) au lieu du bloc-notes Jupyter et que vous ne souhaitez pas exécuter plt.show()plusieurs fois, vous pouvez démarrer la console IPython avec 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
Tchad
la source
1

Pour dire à partir du style de votre extrait de code, je suppose que vous utilisiez IPython plutôt que Jupyter Notebook.

Dans ce numéro sur GitHub, il a été précisé par un membre d'IPython en 2016 que l'affichage des graphiques ne fonctionnerait que lorsque "ne fonctionnerait que s'il s'agit d'un noyau Jupyter". Ainsi, le %matplotlib inlinene fonctionnerait pas.

J'avais juste le même problème et je vous suggère d'utiliser le bloc-notes Jupyter pour la visualisation.

Weisi Zhan
la source