# -- Manipulação de dados:
import pandas as pd
# -- Visualização:
import seaborn as sns
import plotly.express as px
# Layout customizado
from custom_layout import *
Visualização de dados com Plotly
Objetivo
A biblioteca plotly
é uma biblioteca de visualização de dados disponível para Python. Se trata de uma biblioteca fantástica, pois permite interatividade do usuário com o gráfico. No entanto, para trabalhar com um design mais amigável , podemos dar um toque de customização sobre o layout padrão - isso é feito por meio de um arquivo .py
.
Nesse documento, exploramos alguns gráficos que são baseados nessa customizção do layout do plotly
e que podem, portanto, serem utilizados para produzir visualizações de alto impacto.
Utilizando um custom layout
O plotly
vem com uma série de opções padrões e templates no que tange ao aspecto layout - para mais informações, ver documentação oficial. Pensando em implementar um deisgn próprio, podemos carregar o arquivo custom_layout.py
disponível no link abaixo. Basicamente, este arquivo contém configurações quanto a fontes, eixos, paleta de cores, marcadores, etc.
!wget -q 'https://raw.githubusercontent.com/OviedoVR/DatavizWithPlotly/main/custom_layout.py' -O 'custom_layout.py'
Você pode alterar esse estilo como desejar, além de definir a paleta de cores com base nas opções de cores disponíveis no plotly, ou buscando qualquer código HTML para utilizar com seus gráficos (dica: buscar por HTML Color Codes).
Antes de plotar qualquer gráfico, vamos carregas as bibliotecas necessárias.
Se você estiver rodando na sua máquina ou em ferramentas online como o Google Colab, não é necessário executar o próximo bloco de código.
# -- Renderização em Quarto:
import plotly.io as pio
= "notebook" pio.renderers.default
Gráficos
Neste material, iremos abordar alguns tipos de gráficos, a saber:
- Gráfico de linhas
- Gráfico de barras
- Gráfico de dispersão (scatter)
- Histograma
- Boxplot
- Stripplot
- Mapa de calor (heatmap)
Para isso, vamos carregar o dataset tips
(gorjetas) da biblioteca Seaborn:
= sns.load_dataset('tips')
tips tips.head()
total_bill | tip | sex | smoker | day | time | size | |
---|---|---|---|---|---|---|---|
0 | 16.99 | 1.01 | Female | No | Sun | Dinner | 2 |
1 | 10.34 | 1.66 | Male | No | Sun | Dinner | 3 |
2 | 21.01 | 3.50 | Male | No | Sun | Dinner | 3 |
3 | 23.68 | 3.31 | Male | No | Sun | Dinner | 2 |
4 | 24.59 | 3.61 | Female | No | Sun | Dinner | 4 |
1. Gráfico de linhas
Adicionando datas sequenciais para plotar um série temporal:
# Defina a data de início
= '2024-01-01'
start_date
# Gere uma série de datas sequenciais
'date'] = pd.date_range(start=start_date, periods=244)
tips[= tips.tail(30) tips_time_series
Visualização:
# Criando o gráfico:
= px.line(
fig
tips_time_series,='date',
x='tip',
y='sex',
color= ['silver', '#673147']
color_discrete_sequence
)
# Configurando layout e título:
fig.update_layout(
custom_layout,='<b>Tips by date and gender<b>',
title=0.1
title_x
)
# Resultado:
fig.show()
Suavizando as linhas do gráfico:
# Criando o gráfico:
= px.line(
fig
tips_time_series,='date',
x='tip',
y='sex',
color= ['silver', '#673147']
color_discrete_sequence
)
# Suavizando as linhas:
for trace in fig.data:
='lines+markers', line_shape='spline')
trace.update(mode
# Configurando layout e título:
fig.update_layout(
custom_layout,='<b>Tips by date and gender<b>',
title=0.1
title_x
)
# Resulado:
fig.show()
2. Gráfico de barras
# Craindo o gráfico:
= px.bar(
fig
tips,='tip',
x='sex',
y= ['#673147']
color_discrete_sequence
)
# Layout e tamanho:
= 0) # sem sub-linhas
fig.update_traces(marker_line_width =500, height=220)
fig.update_layout(custom_layout, width
# Resultado:
fig.show()
Modo da barra:
group
(agrupado)
# Craindo o gráfico:
= px.bar(
fig
tips,='tip',
x='sex',
y='time',
color='group',
barmode= ['silver', '#673147']
color_discrete_sequence
)
# Layout e tamanho:
= 0) # sem sub-linhas
fig.update_traces(marker_line_width =500, height=220)
fig.update_layout(custom_layout, width
# Resultado:
fig.show()
Modo da barra:
stack
(empilhado)
# Craindo o gráfico:
= px.bar(
fig
tips,='tip',
x='sex',
y='time',
color='stack',
barmode= ['silver', '#673147']
color_discrete_sequence
)
# Layout e tamanho:
= 0) # sem sub-linhas
fig.update_traces(marker_line_width =500, height=220)
fig.update_layout(custom_layout, width
# Resultado:
fig.show()
3. Gráfico de dispersão
# Criando o gráfico:
= px.scatter(
fig
tips,='total_bill',
x='tip',
y= ['#673147']
color_discrete_sequence
)
# Layout:
fig.update_layout(
custom_layout,='<b>Total bill versus tip<b>',
title=0.1
title_x
)# Layout dos marcadores:
=custom_marker_style)
fig.update_traces(marker
# Resultado:
fig.show()
Com mais de uma categoria:
# Criando o gráfico:
= px.scatter(
fig
tips,='total_bill',
x='tip',
y='total_bill',
size= 'time',
color = ['silver', '#673147']
color_discrete_sequence
)
# Layout:
fig.update_layout(
custom_layout,='<b>Total bill versus tip, hued by time<b>',
title=0.1
title_x
)# Layout dos marcadores:
=custom_marker_style)
fig.update_traces(marker
# Resultado:
fig.show()
4. Histograma
# Criando o gráfico
= px.histogram(
fig
tips,='tip',
x='sex',
color= ['silver', '#673147'],
color_discrete_sequence
)
# Layout e título:
fig.update_layout(
custom_layout,='<b>Tips by gender<b>',
title=0.1
title_x
)
# Resultado:
fig.show()
5. Boxplot
# Criando o gráfico
= px.box(
fig
tips,='tip',
y='sex',
color= ['silver', '#673147'],
color_discrete_sequence
)
# Layout e título:
fig.update_layout(
custom_layout,='<b>Tips by gender<b>',
title=0.1,
title_x=0.75
boxgap
)
# Resultado:
fig.show()
Mais categorias:
# Criando o gráfico:
= px.box(
fig
tips,='total_bill',
y='day',
color= color_discrete_sequence
color_discrete_sequence
)
# Layout e título:
fig.update_layout(
custom_layout,='<b>Total bill by day<b>',
title=0.1,
title_x=0.7
boxgap
)# Marcador
=custom_marker_style)
fig.update_traces(marker
# Resultado:
fig.show()
6. Stripplot
# Criando o gráfico:
= px.strip(
fig
tips,='tip',
y='day',
color= color_discrete_sequence
color_discrete_sequence
)
# Layout e título:
fig.update_layout(
custom_layout,='<b>Tips by day<b>',
title=0.1
title_x
)# Marcador
=custom_marker_style)
fig.update_traces(marker
# Resultado:
fig.show()
Você pode usar a opção facet_col
na criação dos gráficos e adicionar mais uma coluna (e.g., smoker
), aumentando assim o nível de detalhe.
Nesse caso, o outro eixo do facet
ficará com a linha do eixo e os ticks em preto. Logo, você pode usar:
# Função para customizar os facets:
def update_facet_axes(fig):
# Atualizar todos os eixos de facetas
=False, showline=True, linecolor='lightgray', tickcolor='lightgray')
fig.update_xaxes(showgrid=False, showline=True, linecolor='lightgray', tickcolor='lightgray')
fig.update_yaxes(showgridreturn fig
Como exemplo de uso, teríamos:
# Exemplo de uso:
= update_facet_axes(fig)
fig fig.show()
7. Mapa de calor (heatmap)
# Calculando correlações para colunas numéricas
= tips.select_dtypes(include='number').corr(method='spearman')
corr
# Criando o gráfico:
= px.imshow(corr, text_auto=True, color_continuous_scale='RdBu_r')
fig
# Layout e título:
='Heamap (matriz de correlação)', title_x=0.5)
fig.update_layout(custom_layout, title
# Resuldado:
fig.show()
Informações sobre o autor
Vinícius Oviedo | Data Analyst & LaTeX editor