Detonado de Visualização de Dados — 20 gráficos em Seaborn.

guia de consulta rápida

Seaborn é uma biblioteca de visualização de dados em Python que é construída sobre a Matplotlib. O que há de tão especial sobre o seaborn? Por que usar o seaborn enquanto temos a Maplotlib para servir a nosso propósito?

Seaborn é especial porque carrega muitos estilos consigo, comparada a um gráfico comum em Matplotlib, um plot comum de seaborn parece muito mais visual e agradável. Além disso, a biblioteca seaborn possui funções avançadas de visualização que são mais expressivas e são capazes de expressar mais informações de forma mais eficaz.

conjuntos de dados

importar pacotes necessários e

import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
iris = sns.load_dataset('iris')
iris
iris

Começando com os gráficos de dispersão muito básicos em Matplotlib e, em seguida, Seaborn para mostrar a diferença entre as bibliotecas.

scatter plot em Matplotlib

plt.scatter(iris.sepal_length, iris.sepal_width)
plt.scatter()

1. scatterplot

sns.set()
plt.scatter(iris.sepal_length, iris.sepal_width)

Foi adicionado estilo sem sequer escrever muito código extra!

definir estilo

sns.set_style('whitegrid')
plt.scatter(iris.sepal_length, iris.sepal_width)
plt.show()

A função set_style() tem algumas outras opções de estilo: arkgrid, whitegrid, dark, white, e ticks.

O próximo gráfico também será comprimento x largura. Mas o parâmetro de comprimento de pétalas também será adicionado a ele. O tamanho dos pontos será alterado de acordo com o comprimento das pétalas.

sns.set_style('darkgrid')
sns.set_context('talk', font_scale=1.1)
plt.figure(figsize=(8, 6))

sns.scatterplot(iris.sepal_length, iris.sepal_width, data=iris)
plt.xlabel("Sepal Length")
plt.ylabel("Sepal Width")
plt.title("Sepal Length vs Sepal Width")
plt.show()
maior o ponto, maior o comprimento.

controlar tamanho das linhas, rótulos e outro parâmetros

Nesta opção de “talk” foi utilizada essa opção de “conversa”. Há opções de “paper”, “notebook” e “poster” que também estão disponíveis na função set_context().

Mais uma variável pode ser adicionada aqui. Adicionar espécies da flor neste plot através do parâmetro hue. A cor dos pontos será diferente para diferentes espécies.

sns.set_context('talk', font_scale=1.1)
plt.figure(figsize = (8, 6))
sns.scatterplot(iris.sepal_length, iris.sepal_width,
size = "petal_length",
data = iris,
sizes =(20, 500),
hue = "species",
alpha = 0.6,
palette = deep")
plt.xlabel("Sepal Length")
plt.ylabel("Sepal Width")
plt.title("Sepal Length vs Sepal Width")
plt.legend(bbox_to_anchor = (1.01, 1), borderaxespad=0)
plt.show()

2. relplot

Se não quiser usar as bandas confiança, adicionar “ci = none” na função relplot.

Não vou fazer isso. Porque eu queria a banda de confiança.

sns.relplot(iris.sepal_length, iris.sepal_width, 
data=iris,
kind='line',
hue='species')
plt.xlabel("Sepal Length")
plt.ylabel("Sepal Width")
plt.title("Sepal Length vs Sepal Width")
plt.show()

3. distplot

plt.figure(figsize = (8, 6))
sns.distplot(iris.sepal_length)
plt.show()

Se você não quiser essa curva de densidade, adicione kde = False na função distplot. O próximo gráfico é um histograma sem a curva de densidade.

plt.figure(figsize = (8, 6))sns.distplot(iris.sepal_length, 
vertical = True,
kde = False,
color = 'red')
plt.show()

Histogramas podem ser ainda mais informativos. Podemos fazer os histogramas de uma variável contínua segregada por uma variável categórica

carregar conjunto de gorjetas

tips = sns.load_dataset("tips")
tips.head()

distplot

g = sns.distplot(tips, 
x = "total_bill",
col = "day",
row = "sex",
binwidth = 3,
height = 3,
facet_kws = dict(margin_titles=True))
g.fig.set_size_inches(18, 10)
g.set_axis_labels("Total Bill", "Frequency")

Então, temos a distribuição do total de contas por dia da semana e gênero.

4. replot()

sns.set_context('paper', font_scale=1.8)sns.relplot(x ='total_bill',
y = 'tip',
data = tips,
hue = 'time',
col = 'day',
col_wrap = 2)

5. barplot

A conta total será segregada na hora do almoço e do jantar.

plt.figure(figsize = (8, 6))sns.barplot(x ='size', 
y = 'total_bill',
hue ='time',
palette = 'GnBu',
data=tips, ci='sd',
capsize=0.05,
saturation=5,
errcolor='lightblue',
errwidth=2)
plt.xlabel("Size")
plt.ylabel("Total Bill")
plt.("Total Bill Per Day of Week")
plt.show()

Note, a paleta usada aqui foi ‘GnBu’. Há várias paletas diferentes disponíveis na biblioteca seaborn. Há diferentes opções de paleta nesta página.

Se você gosta de estatísticas, você vai adorar ter essa opção ‘ci’. Caso contrário, apenas evite usando ‘ci=Nenhum’.

6. countplot

plt.figure(figsize = (8, 6))sns.countplot(x = 'day', 
data = tips)
plt.xlabel("Day")
plt.title("Total Bill Per Day of Week")
plt.show()

Este gráfico mostra a contagem de dados totais disponíveis para cada dia da semana. O parâmetro ‘matiz’ também pode ser usado aqui para segregar por outra variável categóric — “time”.

plt.figure(figsize = (8, 6))sns.countplot(x = 'day', 
hue='time',
palette = 'GnBu',
data=tips)
plt.xlabel("Day")
plt.title("Tip Per Day of Week")
plt.show()

7. swarmplot

plt.figure(figsize=(8, 6))
sns.set_style('whitegrid')
sns.swarmplot(x='size',
y='total_bill',
data=tips)
plt.xlabel("Size")
plt.ylabel("Total Bill")
plt.title("Total bill per size of the table")
plt.show()
ideal para conjuntos de dados menores

Quando o tamanho é 1, são três pontos na mesma linha, naturalmente não se sobrepondo. Mas quando o tamanho é dois, há um monte de dados no mesmo ponto, então por padrão swarmplot ajustou a posição dos pontos para que eles não se sobreponham um ao outro.

Esse gráfico dá uma ideia melhor de quantos dados existem em cada ponto em que o conjunto de dados não é muito grande. Se o conjunto de dados for muito grande, o swarmplot não escala bem.

No próximo gráfico, adicionaremos um parâmetro “matiz” que mostrará cores diferentes para diferentes gêneros

plt.figure(figsize=(10, 6))
sns.set_style('whitegrid')
sns.set(font_scale=1.5)
sns.swarmplot(x='size',
y='total_bill',
data=tips,
hue="sex")
plt.xlabel("Day")
plt.ylabel("Total Bill")
plt.legend(title="Time", fontsize=14)
plt.show()

A segregação de gênero também pode ser feita,

plt.figure(figsize=(10, 6))sns.set_style('whitegrid')
sns.set(font_scale=1.5)
sns.swarmplot(x = 'size',
y = 'total_bill',
data = tips,
hue = "sex",
split=True)
plt.xlabel("Size")
plt.ylabel("Total Bill")
plt.legend(title="Time", fontsize=14)
plt.show()
enxame de sexo a cada “size”

8. factorplot

g = sns.factorplot(x = 'size',
y = "tip",
data = tips,
hue = "time",
col = "day",
kind = "swarm",
col_wrap = 2,
size = 4)
g.fig.set_size_inches(10, 10)
g.set_axis_labels("Size", "Tip")
plt.show()

Este gráfico mostra a quantidade de gorjeta por tamanho para cada dia da semana e cores diferentes representam diferentes horários da refeição.

Muita informação por um gráfico só.

9. pointplot

plt.figure(figsize = (8, 6))sns.pointplot(
x = "day",
y = "tip",
data = tips)
plt.xlabel("Day")
plt.ylabel("Tip")
plt.title("Tip Per Day of Week")
plt.show()
pointplot()

Os pontos aqui mostram a média e as linhas verticais representam o intervalo de confiança. Menos é mais. Um gráfico simples e ainda assimi nformativo.

Um parâmetro ‘matiz’ pode ser adicionado aqui para mostrar a gorjeta por dia da semana por outra variável categórica. Sexo foi usado aqui

plt.figure(figsize=(8, 6))sns.pointplot(x = "day", 
y = "tip",
hue = "sex",
data = tips,
palette = "Accent")
plt.xlabel("Day")
plt.ylabel("Tip")
plt.title("Tip Per Day of Week by Gender")
plt.show()
Diferença de gorjeta por gênero

10. regplot

plt.figure(figsize=(8, 6))sns.set_style('whitegrid')
sns.regplot(
x = 'total_bill',
y = 'tip',
data = tips)
plt.xlabel("Total Bill")
plt.ylabel("Tip")
plt.show()

11. jointplot

sns.set_style('dark')g = sns.jointplot(x = 'total_bill', 
y = 'tip',
hue = 'time',
data = tips)
g.fig.set_size_inches(8, 8)
g.set_axis_labels("Total Bill", "Tip")
plt.show()

Este gráfico de dispersão do valor total da conta em relação à gorjeta e discriminado pelo ‘tempo’. Cores diferentes mostram os diferentes momentos da refeição. Os gráficos laterais mostram as distribuições da conta total e o valor da gorjeta tanto para a hora do almoço quanto para o jantar.

Se não gostar das opções padrão, existem várias outras opções de jointplot()

sns.set_style('darkgrid')g = sns.jointplot(x = 'total_bill',
y = 'tip',
data = tips,
kind = 'reg')
g.fig.set_size_inches(8, 8)
g.set_axis_labels("Total Bill", "Tip")
plt.show()

Em vez de uma dispersão, podemo usar o parâmetro de tipo kde:

sns.set_style('darkgrid')g = sns.jointplot(x = 'total_bill', 
y = 'tip',
data = tips,
kind = 'kde')
g.fig.set_size_inches(8, 8)
g.set_axis_labels("Total Bill", "Tip")
plt.show()

Aplicando o parâmetro “matiz” neste gráfico kde,

sns.set_style('darkgrid')g = sns.jointplot(x = 'total_bill',
y = 'tip',
hue = 'time',
data = tips,
kind = 'kde')
g.fig.set_size_inches(8, 8)
g.set_axis_labels("Total Bill", "Tip")
plt.show()
sns.jointplot( )

12. kdeplot()


plt.figure(figsize = (8, 6))
sns.set_style('whitegrid')
g = sns.kdeplot(x = 'total_bill',
y = 'tip',
shade = True,
data = tips)
plt.xlabel("Total Bill")
plt.ylabel("Tip")
plt.show()

O gráfico sombreado mostra a densidade dos dados. Acho um pouco mais expressivo.

13. hexplot

sns.set_style('dark')g = sns.jointplot(x = 'total_bill', 
y ='tip',
data = tips,
kind = 'hex')
g.fig.set_size_inches(8, 8)
g.set_axis_labels("Total Bill", "Tip")
plt.show()
Hexplot é especialmente útil quando o conjunto de dados é muito grande.

14. jitterplot

Aqui a quantidade está especificada em 0.2. Também por padrão, ele adiciona uma linha de regressão linear e uma faixa de confiança que é bom!

plt.figure(figsize = (8, 6))
sns.set_style('whitegrid')
sns.regplot(x = 'size',
y
= 'total_bill',
data = tips,
x_jitter = 0.2)
plt.xlabel("Size")
plt.ylabel("Total Bill")
plt.show()
Observe, aqui o eixo x contém uma variável categórica.

15. lmplot

sns.set(font_scale=1.5)sns.lmplot(x ='total_bill', 
y ='tip',
data = tips,
hue ='time')
plt.gcf().set_size_inches(12, 8)
plt.ylabel("Total Bill")
plt.xlabel("Tip")
plt.show()
linhas de regressão para os horários do almoço e jantar.

Pode ser ainda mais informativo. O lmplot a seguir mostra a conta total vs gorjeta vs dia.

g = sns.lmplot(x='total_bill', 
y='tip',
col="day",
hue= "day",
data=tips,
col_wrap=2,
height=4)
g.fig.set_size_inches(11, 11)
g.set_axis_labels("Total Bill", "Tip")
plt.show()

16. boxplot

sns.set(font_scale = 1.5)sns.boxplot(x = 'size',
y = 'total_bill',
datav= tips)
plt.gcf().set_size_inches(12, 8)
plt.xlabel("Size")
plt.ylabel("Total Bill")
conta total vs tamanho

Se você precisar de um lembrete sobre como extrair todas as informações que mencionei antes de um boxplot, por favor, passe por este artigo:

17. violinplot

ax = sns.violinplot(x=tips["total_bill"])

17_B. violinplot

plt.figure(figsize=(10, 7))sns.violinplot(x ='day',
y ='total_bill',
hue = "smoker",
data = tips,
palette ="muted")
plt.xlabel("Day")
plt.ylabel("Total Bill")
plt.title("Total Bill per Day of the Week")
plt.show()

17_C. violinplot

plt.figure(figsize = (10, 7))sns.violinplot(x ='day', 
y ='total_bill',
hue = "smoker",
data = tips,
palette = "muted",
split = True)
plt.xlabel("Day")
plt.ylabel("Total Bill")
plt.title("Total Bill per Day of the Week")
plt.show()

Aqui a cor azul está mostrando a distribuição da conta total para fumantes e o lado laranja é para não fumantes.

17_D. violinplot

plt.figure(figsize=(10, 6))sns.violinplot(x = 'day', 
y
= 'total_bill',
inner = None,
data = tips,
palette = "muted")
sns.swarmplot(x = 'day',
y = 'total_bill',
data = tips,
color = "k",
alpha = 0.9)
plt.ylabel("Total Bill")
plt.xlabel("Day")
plt.title("Total Bill per Day")
plt.show()

18. heatmap

Este é um mapa de calor básico que mostra a correlação entre a conta total e o valor da gorjeta.

sns.heatmap(tips[["total_bill", "tip"]].corr(), 
annot = True,
linewidths = 0.9,
linecolor = "gray")
plt.show()

Vamos voltar ao conjunto de dados da Íris. Será interessante ver as correlações entre o comprimento e largura da Sepala.

plt.figure(figsize=(8, 6))
sns.heatmap(iris.corr(),
annot = True,
linewidths = 0.5,
cmap = 'crest')
plt.show()
quanto mais escuras as cores, mais fortes as correlações.

19. facetgrid

g = sns.FacetGrid(tips, col="time")g.map(sns.scatterplot, "total_bill", "tip")g.fig.set_size_inches(12, 8)g.set_axis_labels("Total Bill", "Tip")plt.show()

Pode ainda ser apartado por gênero

g = sns.FacetGrid(tips, col="time", row="sex")g.map(sns.scatterplot, "total_bill", "tip")g.fig.set_size_inches(12, 12)g.set_axis_labels("Total Bill", "Tip")plt.show()

20.pairplot

df = sns.load_dataset('iris')
sns.set_style('ticks')
sns.pairplot(df,
hue="species",
diag_kind='kde',
kind='scatter',
palette='husl')
plt.show()

Este plot mostra as relações entre cada par de variáveis simultaneamente. Ao mesmo tempo, visualizamos a distribuição de cada variável contínua. Definimos ‘hue=species’ para mostrar as diferentes cores para diferentes espécies.

21. heatmap

df = pd.read_csv(
"stock_data.csv",
parse_dates = True,
index_col = "Date")
df.head()

Nosso objetivo é plotar um mapa de calor de dados “abertos” por meses e anos. Para isso, precisamos indicar os meses e anos da e apartar anos, de meses.

df['month'] = df.index.month
df['year'] = df.index.year

Se você verificar novamente o conjunto de dados, você encontrará uma coluna ‘mês’ e ‘ano’ nisso. Usando a função de tabela pivô pandas, faça o conjunto de dados de meses e anos onde meses serão o índice e anos serão as colunas e os dados ‘Aberto’ são os valores.

import calendar
all_month_year_df = pd.pivot_table(df, values="Open",
index=["month"],
columns=["year"],
fill_value=0,
margins=True)
named_index = [[calendar.month_abbr[i] if isinstance(i, int) else i for i in list(all_month_year_df.index)]] # nome mesesall_month_year_df = all_month_year_df.set_index(named_index)
all_month_year_df

Dataset pronto para o heatmap

plt.figure(figsize=(10,10))
ax = sns.heatmap(all_month_year_df,
cmap='GnBu',
robust=True,
fmt='.2f',
annot=True,
linewidths=.5,
annot_kws={'size':11},
cbar_kws={'shrink':.8, 'label':'Open'})

ax.set_yticklabels(ax.get_yticklabels(), rotation=0, fontsize=10)
ax.set_xticklabels(ax.get_xticklabels(), rotation=0, fontsize=10)
plt.title('Average Opening', fontdict={'fontsize':18}, pad=14)

22. clustermap

sns.clustermap(all_month_year_df, linewidths=.5, cmap = "coolwarm"

Veja os rótulos x-tick e y-tick nesta trama. Eles estão seguindo a hierarquia dos aglomerados. 2017 é o mais alto e 2016 é o mais baixo. Se você quiser ter os anos em ordem, defina ‘col_cluster’ igual a Falso.

sns.clustermap(all_month_year_df, 
linewidths=.5,
cmap = "coolwarm",
col_cluster=False)

Agora, os anos estão em ordem. Você pode obter os meses em ordem definindo ‘row_cluster’ igual a Falso também. Por favor, tente isso para você.

Obrigado.

Composing a repository of books (i bought), authors (i follow) & blogs (direct ones) for my own understanding.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store