Parcelas marítimas não aparecendo

205

Tenho certeza de que estou esquecendo algo muito simples, mas não consigo obter certos planos para trabalhar com a Seaborn.

Se eu fizer:

import seaborn as sns

Em seguida, todos os gráficos que eu criar como de costume com o matplotlib obterão o estilo Seaborn (com a grade cinza em segundo plano).

No entanto, se eu tentar fazer um dos exemplos, 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>

A função pairplot retorna um objeto PairGrid, mas o gráfico não aparece.

Estou um pouco confuso porque o matplotlib parece estar funcionando corretamente, e os estilos Seaborn são aplicados a outros gráficos do matplotlib, mas as funções Seaborn parecem não fazer nada. Alguém tem alguma idéia do que pode ser o problema?

robc89
fonte
12
Apenas um palpite rápido ... se você estiver usando o ipython, precisará ligar %matplotlib inlinepara especificar o back-end em linha. Caso contrário, você pode ligar sns.plt.show()para renderizar o gráfico em uma janela separada.
Jakob

Respostas:

360

Os gráficos criados usando o transporte marítimo precisam ser exibidos como gráficos comuns do matplotlib. Isso pode ser feito usando o

plt.show()

função do matplotlib.

Originalmente, publiquei a solução para usar o objeto matplotlib já importado de seaborn ( sns.plt.show()), no entanto, isso é considerado uma prática ruim. Portanto, basta importar diretamente o módulo matplotlib.pyplot e mostrar seus gráficos com

import matplotlib.pyplot as plt
plt.show()

Se o bloco de notas IPython for usado, o back-end em linha poderá ser chamado para remover a necessidade de chamar show após cada plot. A respectiva magia é

%matplotlib inline
Jakob
fonte
4
Ainda não recebo um gráfico de sns mostrado interativamente. sns.plt.show () não funciona. Mas quando eu mudo para inline, recebo o enredo (mas não de forma interativa). Alguma idéia do porquê?
user 3317704
você poderia tentar especificar um backend usando algo como %matplotlib qt, %matplotlib gtk, %matplotlib tketc. ver %matplotlib?para mais informações
Jakob
17
É realmente irritante que, nos exemplos na página seaborn, não haja um comando sns.plt.show (). Como eles podem esquecer algo tão elementar?
18715 Michael Hecht
@MichaelHecht A falta de plt.show () foi abordada de alguma forma nesta edição , você pode resolver suas queixas lá. Talvez eles o adicionem aos documentos.
21815 Jakob
@Jakob existe uma maneira no Jupyter (via Anaconda) de adicionar essa mágica %matplotlib inlinea algum tipo de arquivo de configuração para que seja sempre aplicado? Ou sempre preciso adicioná-lo a cada nova pasta de trabalho?
whytheq
41

Chego a essa pergunta regularmente e sempre levo um tempo para encontrar o que procuro:

import seaborn as sns
import matplotlib.pyplot as plt

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

Observe: No Python 2, você também pode usar sns.plt.show(), mas não no Python 3.

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

insira a descrição da imagem aqui

Martin Thoma
fonte
1
AttributeError: module 'seaborn' has no attribute 'plt'
Weberc2
@ weberc2 Corrigido. O problema era apenas em Python 3, que não temsns.plt
Martin Thoma
19

Para evitar confusão (como parece haver alguns nos comentários). Supondo que você esteja no Jupyter:

%matplotlib inline> exibe os gráficos DENTRO do notebook

sns.plt.show()> exibe os gráficos FORA do notebook

%matplotlib inlinevai IGNORAR sns.plt.show() no sentido de que parcelas serão mostrados IN o notebook, mesmo quando sns.plt.show()é chamado.

E sim, é fácil incluir a linha na sua configuração:

Execute automaticamente% matplotlib inline no IPython Notebook

Mas parece uma convenção melhor mantê-lo junto com as importações no código real.

mikkokotila
fonte
Para notebooks spark?
technazi
8

Isso funcionou para mim

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

Meu conselho é apenas dar uma

plt.figure()e dê um gráfico de sns. Por exemplo

sns.distplot(data).

Embora pareça, ele não mostra nenhum gráfico, quando você maximizar a figura, poderá ver o gráfico.

usuário 3317704
fonte
Esqueci de criar uma figura ( plt.figure()) antes de fazer meu gráfico de linha e não entendi por que o gráfico não apareceu. Excelente, obrigado!
Sander Vanden Hautte
2

Se você plotar no console IPython (onde não pode usar %matplotlib inline) em vez do notebook Jupyter, e não quiser executar plt.show()repetidamente, poderá iniciar o console IPython com 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
Chade
fonte
1

Para diferenciar o estilo do seu trecho de código, suponho que você estivesse usando o IPython em vez do Jupyter Notebook.

Nesta edição do GitHub, ficou claro por um membro do IPython em 2016 que a exibição de gráficos funcionaria apenas quando "apenas funcionasse quando fosse um kernel do Jupyter". Assim, o %matplotlib inlinenão funcionaria.

Eu estava tendo o mesmo problema e sugiro que você use o Jupyter Notebook para a visualização.

Weisi Zhan
fonte