Visualização de dados com Plotly

Autor

Vinícius Oviedo

Data de Publicação

26 de julho de 2024

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'
Dica

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.

# -- 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 *
Nota

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
pio.renderers.default = "notebook"

Gráficos

Neste material, iremos abordar alguns tipos de gráficos, a saber:

  1. Gráfico de linhas
  2. Gráfico de barras
  3. Gráfico de dispersão (scatter)
  4. Histograma
  5. Boxplot
  6. Stripplot
  7. Mapa de calor (heatmap)

Para isso, vamos carregar o dataset tips (gorjetas) da biblioteca Seaborn:

tips = sns.load_dataset('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
start_date = '2024-01-01'

# Gere uma série de datas sequenciais
tips['date'] = pd.date_range(start=start_date, periods=244) 
tips_time_series = tips.tail(30)

Visualização:

# Criando o gráfico:
fig = px.line(
    tips_time_series,
    x='date',
    y='tip',
    color='sex',
    color_discrete_sequence = ['silver', '#673147']
)

# Configurando layout e título:
fig.update_layout(
    custom_layout,
    title='<b>Tips by date and gender<b>',
    title_x=0.1
)

# Resultado:
fig.show()

Suavizando as linhas do gráfico:

# Criando o gráfico:
fig = px.line(
    tips_time_series,
    x='date',
    y='tip',
    color='sex',
    color_discrete_sequence = ['silver', '#673147']
)

# Suavizando as linhas:
for trace in fig.data:
  trace.update(mode='lines+markers', line_shape='spline')

# Configurando layout e título:
fig.update_layout(
    custom_layout,
    title='<b>Tips by date and gender<b>',
    title_x=0.1
)

# Resulado:
fig.show()

2. Gráfico de barras

# Craindo o gráfico:
fig = px.bar(
    tips,
    x='tip',
    y='sex',
    color_discrete_sequence = ['#673147']
)
 
# Layout e tamanho: 
fig.update_traces(marker_line_width = 0) # sem sub-linhas
fig.update_layout(custom_layout, width=500, height=220)

# Resultado:
fig.show()

Modo da barra: group (agrupado)

# Craindo o gráfico:
fig = px.bar(
    tips,
    x='tip',
    y='sex',
    color='time',
    barmode='group',
    color_discrete_sequence = ['silver', '#673147']
)
 
# Layout e tamanho:
fig.update_traces(marker_line_width = 0) # sem sub-linhas
fig.update_layout(custom_layout, width=500, height=220)

# Resultado:
fig.show()

Modo da barra: stack (empilhado)

# Craindo o gráfico:
fig = px.bar(
    tips,
    x='tip',
    y='sex',
    color='time',
    barmode='stack',
    color_discrete_sequence = ['silver', '#673147']
)
 
# Layout e tamanho:
fig.update_traces(marker_line_width = 0) # sem sub-linhas
fig.update_layout(custom_layout, width=500, height=220)

# Resultado:
fig.show()

3. Gráfico de dispersão

# Criando o gráfico:
fig = px.scatter(
  tips,
  x='total_bill',
  y='tip',
  color_discrete_sequence = ['#673147']
)

# Layout:
fig.update_layout(
  custom_layout,
  title='<b>Total bill versus tip<b>',
  title_x=0.1
)
# Layout dos marcadores:
fig.update_traces(marker=custom_marker_style)

# Resultado:
fig.show() 

Com mais de uma categoria:

# Criando o gráfico:
fig = px.scatter(
  tips,
  x='total_bill',
  y='tip',
  size='total_bill',
  color = 'time',
  color_discrete_sequence = ['silver', '#673147']
)

# Layout:
fig.update_layout(
  custom_layout,
  title='<b>Total bill versus tip, hued by time<b>',
  title_x=0.1
)
# Layout dos marcadores:
fig.update_traces(marker=custom_marker_style)

# Resultado:
fig.show() 

4. Histograma

# Criando o gráfico
fig = px.histogram(
    tips,
    x='tip',
    color='sex',
    color_discrete_sequence = ['silver', '#673147'],
)

# Layout e título:
fig.update_layout(
    custom_layout,
    title='<b>Tips by gender<b>', 
    title_x=0.1
)

# Resultado:
fig.show()

5. Boxplot

# Criando o gráfico
fig = px.box(
    tips,
    y='tip',
    color='sex',
    color_discrete_sequence = ['silver', '#673147'],
)

# Layout e título:
fig.update_layout(
    custom_layout,
    title='<b>Tips by gender<b>', 
    title_x=0.1,
    boxgap=0.75
)

# Resultado:
fig.show()

Mais categorias:

# Criando o gráfico:
fig = px.box(
    tips,
    y='total_bill',
    color='day',
    color_discrete_sequence = color_discrete_sequence
)

# Layout e título:
fig.update_layout(
    custom_layout,
    title='<b>Total bill by day<b>', 
    title_x=0.1,
    boxgap=0.7
)
# Marcador
fig.update_traces(marker=custom_marker_style)

# Resultado:
fig.show()

6. Stripplot

# Criando o gráfico:
fig = px.strip(
    tips,
    y='tip',
    color='day',
    color_discrete_sequence = color_discrete_sequence
)

# Layout e título:
fig.update_layout(
    custom_layout,
    title='<b>Tips by day<b>', 
    title_x=0.1
)
# Marcador
fig.update_traces(marker=custom_marker_style)

# Resultado:
fig.show()
Dica

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
    fig.update_xaxes(showgrid=False, showline=True, linecolor='lightgray', tickcolor='lightgray')
    fig.update_yaxes(showgrid=False, showline=True, linecolor='lightgray', tickcolor='lightgray')
    return fig

Como exemplo de uso, teríamos:

# Exemplo de uso:
fig = update_facet_axes(fig)
fig.show()

7. Mapa de calor (heatmap)

# Calculando correlações para colunas numéricas
corr = tips.select_dtypes(include='number').corr(method='spearman')

# Criando o gráfico:
fig = px.imshow(corr, text_auto=True, color_continuous_scale='RdBu_r')

# Layout e título:
fig.update_layout(custom_layout, title='Heamap (matriz de correlação)', title_x=0.5)

# Resuldado:
fig.show()


Informações sobre o autor


Vinícius Oviedo | Data Analyst & LaTeX editor

GitHub Badge Linkedin Badge Medium Badge Youtube Badge Fiverr Badge Upwork Badge