web-dev-qa-db-fra.com

Les parcelles Seaborn ne se présentent pas

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

Si je fais:

import seaborn as sns

Ensuite, toutes les parcelles que je crée comme d'habitude avec matplotlib obtiennent le style Seaborn (avec la grille grise à l'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 que les styles Seaborn sont appliqués à d'autres graphiques matplotlib, mais les fonctions Seaborn ne semblent rien faire. Quelqu'un at-il une idée de ce que pourrait être le problème?

128
robc89

Les parcelles créées avec Seaborn doivent être affichées comme des parcelles matplotlib ordinaires . Cela peut être effectué à l'aide de

plt.show()

fonction de matplotlib.

A l'origine, j'avais posté 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, importez simplement le module matplotlib.pyplot et affichez vos parcelles avec

import matplotlib.pyplot as plt
plt.show()

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

%matplotlib inline
217
Jakob

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

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

 enter image description here

16
Martin Thoma

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

%matplotlib inline> affiche les tracés &AGRAVE; L'INT&EACUTE;RIEUR du cahier

sns.plt.show()> affiche les tracés EN DEHORS du cahier 

%matplotlib inline va REMPLACERsns.plt.show() dans le sens où les tracés seront affichés DANS le bloc-notes même lorsque sns.plt.show() est appelé. 

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

Exécuter automatiquement% matplotlib inline dans IPython Notebook

Cependant, il semble préférable de conserver les importations dans le code actuel. 

11
mikkokotila

Mon conseil est juste de donner un 

plt.figure() et donnez un graphique sns. Par exemple 

sns.distplot(data)

Bien que cela ressemble, cela ne montre aucune parcelle. Lorsque vous maximisez la figure, vous pourrez voir la parcelle.

3
user 3317704

Cela a fonctionné pour moi

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

Si vous tracez dans Console IPython (où vous ne pouvez pas utiliser %matplotlib inline) à la place du bloc-notes Jupyter et que vous ne voulez pas exécuter plt.show() à plusieurs reprises, 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
0
Chad

Pour distinguer le style de votre extrait de code, je suppose que vous utilisiez IPython plutôt que Jupyter Notebook.

Dans ce numéro sur GitHub, un membre d’IPython en 2016 a expliqué que l’affichage des graphiques ne fonctionnerait que si "ne fonctionnait que s’il s’agissait d’un noyau Jupyter". Ainsi, le %matplotlib inline ne fonctionnerait pas.

Je viens d'avoir le même problème et suggère que vous utilisez Jupyter Notebook pour la visualisation.

0
Weisi Zhan