Las parcelas nacidas no aparecen

205

Estoy seguro de que estoy olvidando algo muy simple, pero no puedo lograr que ciertas parcelas funcionen con Seaborn.

Si lo hago:

import seaborn as sns

Luego, todas las parcelas que creo como de costumbre con matplotlib obtienen el estilo Seaborn (con la cuadrícula gris en el fondo).

Sin embargo, si trato de hacer uno de los ejemplos, como:

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 función pairplot devuelve un objeto PairGrid, pero el gráfico no aparece.

Estoy un poco confundido porque matplotlib parece estar funcionando correctamente, y los estilos Seaborn se aplican a otros gráficos de matplotlib, pero las funciones Seaborn no parecen hacer nada. ¿Alguien tiene alguna idea de cuál podría ser el problema?

robc89
fuente
12
Solo una suposición rápida ... si está utilizando ipython, debe llamar %matplotlib inlinepara especificar el backend en línea. De lo contrario, podría llamar sns.plt.show()para representar la trama en una ventana separada.
Jakob

Respuestas:

361

Las parcelas creadas con seaborn deben mostrarse como parcelas matplotlib ordinarias. Esto se puede hacer usando el

plt.show()

función de matplotlib.

Originalmente publiqué la solución para usar el objeto matplotlib ya importado de seaborn ( sns.plt.show()), sin embargo, esto se considera una mala práctica. Por lo tanto, simplemente importe directamente el módulo matplotlib.pyplot y muestre sus parcelas con

import matplotlib.pyplot as plt
plt.show()

Si se usa el cuaderno IPython, se puede invocar el backend en línea para eliminar la necesidad de llamar a show después de cada diagrama. La magia respectiva es

%matplotlib inline
Jakob
fuente
44
Todavía no obtengo una trama sns que se muestre interactivamente. sns.plt.show () no funciona. Pero cuando lo cambio a en línea, obtengo la trama (pero no de forma interactiva). ¿Alguna idea de por qué?
usuario 3317704
usted podría tratar de especificar un servidor utilizando algo como %matplotlib qt, %matplotlib gtk, %matplotlib tketc. véase %matplotlib?para más información
Jakob
17
Es realmente molesto que en los ejemplos en la página seaborn no haya un comando sns.plt.show (). ¿Cómo pueden olvidar algo tan elemental?
Michael Hecht
@MichaelHecht La falta de plt.show () se abordó de alguna manera en este tema , puede abordar sus quejas allí. Tal vez lo agregarán a los documentos.
Jakob
@Jakob, ¿hay alguna forma dentro de Jupyter (a través de Anaconda) para agregar esta magia %matplotlib inlinea una variedad de archivos de configuración para que siempre se aplique? ¿O siempre necesito agregarlo a cada libro nuevo?
whytheq
41

Llego a esta pregunta con bastante frecuencia y siempre me lleva un tiempo encontrar lo que busco:

import seaborn as sns
import matplotlib.pyplot as plt

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

Tenga en cuenta: en Python 2, también puede usar sns.plt.show(), pero no en Python 3.

Ejemplo 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()

Da

ingrese la descripción de la imagen aquí

Martin Thoma
fuente
1
AttributeError: module 'seaborn' has no attribute 'plt'
weberc2
@ weberc2 Fijo. El problema fue solo en Python 3, que no tienesns.plt
Martin Thoma
19

Para evitar confusiones (como parece haber algo en los comentarios). Asumiendo que estás en Jupyter:

%matplotlib inline> muestra las parcelas DENTRO del cuaderno

sns.plt.show()> muestra las parcelas FUERA del cuaderno

%matplotlib inlinese ANULAR sns.plt.show() en el sentido de que las parcelas serán mostrados EN el bloc de notas, incluso cuando sns.plt.show()se llama.

Y sí, es fácil incluir la línea en su configuración:

Ejecute automáticamente% matplotlib en línea en IPython Notebook

Pero parece una mejor convención para mantenerlo junto con las importaciones en el código real.

mikkokotila
fuente
¿Para cuadernos de chispas?
technazi
8

Esto funciono para mi

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

Mi consejo es solo dar un

plt.figure()y dar alguna trama sns. Por ejemplo

sns.distplot(data).

Aunque parecerá que no muestra ninguna trama, cuando maximice la figura, podrá ver la trama.

usuario 3317704
fuente
Olvidé crear una figura ( plt.figure()) antes de hacer mi diagrama de línea y no entendí por qué la trama no apareció. ¡Excelente, gracias!
Sander Vanden Hautte
2

Si traza en la consola IPython (donde no puede usar %matplotlib inline) en lugar del cuaderno Jupyter, y no desea ejecutarlo plt.show()repetidamente, puede iniciar la consola 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
Chad
fuente
1

Para saber por el estilo de su fragmento de código, supongo que estaba usando IPython en lugar de Jupyter Notebook.

En este número en GitHub, un miembro de IPython dejó claro en 2016 que la visualización de gráficos solo funcionaría cuando "solo funciona cuando es un núcleo de Jupyter". Por lo tanto, la %matplotlib inline no funcionaría.

Estaba teniendo el mismo problema y le sugiero que use Jupyter Notebook para la visualización.

Weisi Zhan
fuente