Alura > Cursos de Data Science > Cursos de Data Science > Conteúdos de Data Science > Primeiras aulas do curso Praticando gráficos: criando gráficos customizados

Praticando gráficos: criando gráficos customizados

Gráficos customizados - Criando gráficos customizados

Boas-vindas! Meu nome é Valquíria Alencar, sou a instrutora na escola de Dados da Alura, e irei te acompanhar ao longo dessa jornada de aprendizagem.

Audiodescrição: Valquíria se descreve como uma mulher branca, de olhos castanho-escuros, cabelos loiros e ondulados abaixo dos ombros, e sobrancelhas castanho-escuras. Ela usa um piercing prateado no septo, tem tatuagens em ambos os braços, veste uma camisa rosa-clara com estampa em tons de rosa e azul, e está sentada no estúdio da Alura, com uma parede clara ao fundo iluminada em gradiente azul e ciano, uma planta à direita da instrutora, e uma estante preta à esquerda com enfeites, plantas, livros e pontos de iluminação amarela.

Criando gráficos customizados

Neste curso, vamos praticar como customizar gráficos em Python, para deixá-los mais atrativos, informativos e adaptados de acordo com nossas necessidades.

Para isso, utilizaremos um notebook preparado no Google Colab, que será explorado ao longo da aula. Você pode fazer download dele na atividade seguinte para consultas futuras.

Entendendo o contexto

Começaremos entendendo o contexto. Primeiro, importaremos a biblioteca pandas e carregaremos um arquivo CSV, armazenando em uma variável chamada df. Em seguida, visualizaremos as cinco primeiras linhas do arquivo com df.head().

import pandas as pd
df = pd.read_csv('https://raw.githubusercontent.com/alura-cursos/python_dados/refs/heads/main/Dados/dados_jogos.csv')
df.head()

Retorno da célula:

classificacaonomeplataformaanogenerodesenvolvedorvendas_america_nortevendas_europavendas_japaooutras_vendasvendas_globais
1Wii SportsWii2006.0EsportesNintendo41.4929.023.778.4682.74
2Super Mario Bros.NES1985.0PlataformaNintendo29.083.586.810.7740.24
3Mario Kart WiiWii2008.0CorridaNintendo15.8512.883.793.3135.82
4Wii Sports ResortWii2009.0EsportesNintendo15.7511.013.282.9633.00
5Pokemon Red/Pokemon BlueGB1996.0RPGNintendo11.278.8910.221.0031.37

Esses dados foram disponibilizados na plataforma Kaggle e são de 2008, portanto, não são dados atuais, mas se referem à indústria de jogos. Temos o nome de alguns jogos, a plataforma, o ano, o gênero, a pessoa desenvolvedora, o valor de vendas em milhões, tanto na América do Norte, quanto na Europa, no Japão, entre outros lugares, e também as vendas globais.

Agrupando os dados e calculando o faturamento total

Nesta aula, criaremos um gráfico que será aprimorado com o tempo. A ideia é pensar no público-alvo e no que queremos que a pessoa entenda ao visualizar o gráfico.

Nosso público-alvo são pessoas desenvolvedoras de jogos, enquanto nosso objetivo é informar qual gênero de jogo tem maior aceitação e receita no mercado japonês, orientando o desenvolvimento de novos jogos. O foco do gráfico será evidenciar as categorias que geram mais receita, oferecendo insights para a tomada de decisão e criação de novos jogos.

Para isso, usaremos o DataFrame df agrupado pelo genero com o método groupby(); somaremos as vendas no Japão com sum(); e ordenaremos do maior para o menor valor para facilitar a visualização. Ao final, usaremos reset_index() para acessar mais facilmente os dados gerados.

vendas_genero_japao = df.groupby('genero')['vendas_japao'].sum().sort_values(ascending=False).reset_index()
vendas_genero_japao

Retorno da célula:

#generovendas_japao
0RPG352.31
1Ação159.95
2Esportes135.37
3Plataforma130.77
4Diversos107.76
5Luta87.35
6Simulação63.70
7Quebra-cabeça57.31
8Corrida56.69
9Aventura52.07
10Estratégia49.46
11Tiro38.28

Executando o código, teremos o índice à esquerda, a coluna com o gênero do jogo e a coluna com o valor de vendas em milhões de dólares para cada gênero no Japão.

Escolhendo uma apresentação visual adequada

Agora, precisamos pensar na visualização adequada. Nesse caso, não queremos mostrar uma tabela, mas sim um gráfico. Sendo assim, vamos importar a biblioteca matplotlib, especificamente o módulo pyplot, e também a biblioteca seaborn.

import matplotlib.pyplot as plt
import seaborn as sns

Qual é a melhor maneira de mostrar os dados que desejamos comunicar? Para comparar categorias, podemos criar um gráfico de colunas com a função barplot() da seaborn, passando x como genero, y como vendas_japao, e data como vendas_genero_japao, dados criados anteriormente.

sns.barplot(x='genero', y='vendas_japao', data=vendas_genero_japao)

No entanto, com muitas categorias, as colunas ficam sobrepostas e confusas:

Retorno da célula:

Gráfico de barras verticais azuis sobre um fundo branco, mostrando as vendas de jogos no Japão por gênero. Na parte inferior, há o eixo horizontal com os gêneros: 'RPG', 'Ação', 'Esporte', 'Plataforma', 'Diversos', 'Luta', 'Simulação', 'Corrida', 'Aventura', 'Estratégia' e 'Tiro'. O eixo vertical à esquerda indica as vendas no Japão, de 0 a 350 em intervalos de 50. O gênero 'RPG' à esquerda tem a barra mais alta, seguida por 'Ação'. As barras diminuem de altura até 'Tiro' à direita, que tem a menor.

Mudando a orientação do gráfico

Uma dica para quando há muitas categorias é optar por um gráfico de barras em vez de um gráfico de colunas. Isso facilita a visualização das informações.

Para criá-lo, basta usar a função barplot() definindo o y como genero e o x como vendas_japao. Ao executar, teremos um gráfico mais compreensível.

sns.barplot(y='genero', x='vendas_japao', data=vendas_genero_japao)

Retorno da célula:

Gráfico de barras horizontais azuis sobre um fundo branco, mostrando as vendas no Japão por gênero de jogos. No eixo y, da parte superior para inferior, os gêneros listados são RPG, Ação, Esportes, Plataforma, Diversos, Luta, Simulação, Quebra-cabeça, Corrida, Aventura, Estratégia e Tiro. No eixo x, as vendas variam de 0 a 350 em intervalos de 50. O gênero RPG tem o maior número de vendas, enquanto Tiro tem o menor.

Dessa forma, os nomes das categorias ficam dispostos verticalmente à esquerda, facilitando a leitura, que geralmente começa da esquerda para a direita.

Tornando a visualização mais informativa

O gráfico ainda não tem título, o que pode dificultar a compreensão para quem não conhece os dados. Dito isso, vamos tornar a visualização mais informativa adicionando título e rótulos:

# Criando a figura e os eixos do gráfico com tamanho 8x5
fig, ax = plt.subplots(figsize=(8,5))

# Ajustando o layout da figura para deixar mais espaço à direita
fig.subplots_adjust(right=0.7)

# Gerando o gráfico
ax = sns.barplot(y='genero', x='vendas_japao', data=vendas_genero_japao)

# Personalizando o gráfico
ax.set_title('Faturamento em jogos no Japão por gênero\nem milhões de dólares', pad=20, fontsize=16, loc='left')
ax.set_xlabel('')
ax.set_ylabel('')
ax.yaxis.set_tick_params(labelsize=12)

plt.show()

Para customizar o gráfico, criaremos dois objetos com a matplotlib: fig, que é a área do gráfico; e ax, que é o gráfico em si. Com subplots(), definimos o tamanho da figura, e com subplots_adjust(), ajustamos o layout para que o gráfico não ocupe a figura inteira.

Feito isso, armazenaremos o gráfico no eixo ax e usaremos métodos da biblioteca matplotlib para personalizar: ax.set_title() para definir o título; ax.set_xlabel() e ax.set_ylabel() para os rótulos dos eixos. Ao final, podemos aumentar o tamanho dos textos do eixo Y com ax.yaxis.set_tick_params(), definindo o labelsize como 12.

Observação: o parâmetro pad, utilizado na definição do título do gráfico, define o espaçamento entre o título e o gráfico, enquanto fontsize define o tamanho da fonte. Já o loc é a localização do título, geralmente, à esquerda.

Ao executar o código, temos um gráfico mais limpo:

Gráfico de barras horizontais azuis sobre um fundo branco, mostrando o faturamento em jogos no Japão por gênero, em milhões de dólares. As categorias e valores são: RPG aproximadamente 350, Ação cerca de 150, Esportes próximo de 150, Plataforma também próximo a 150, Diversos entre 100 e 150, Luta aproximadamente 100, Simulação cerca de 75, Quebra-cabeça por volta de 70, assim como Corrida, Aventura aproximadamente 50, Estratégia um pouco menos que 50, Tiro por volta de 30. Os valores no eixo x vão de 0 a 350 em intervalos de 50, e o título do gráfico no topo é 'Faturamento em jogos no Japão por gênero em milhões de dólares.

Eliminando a saturação

Ainda podemos eliminar a saturação.

A saturação representa tudo que é desnecessário para trazer informação. No exemplo de gráfico anterior, podemos remover a caixa em volta do gráfico e os ticks nos nomes das categorias.

O ideal é remover essas saturações, deixando o gráfico cada vez mais limpo. Gráficos com muita informação trazem sobrecarga cognitiva, ou seja, o cérebro precisa trabalhar mais para conseguir interpretar os dados.

Inicialmente, iremos remover o contorno do gráfico. Para isso, podemos usar o método ax.set_frame_on() recebendo o valor False entre parênteses.

Em seguida, usaremos ax.get_xaxis().set_visible(False) para remover o eixo X. Por fim, para remover os ticks, usaremos ax.tick_params(length=0).

# Criando a figura e os eixos do gráfico com tamanho 8x5
fig, ax = plt.subplots(figsize=(8,5))

# Ajustando o layout da figura para deixar mais espaço à direita
fig.subplots_adjust(right=0.7)

# Gerando o gráfico
ax = sns.barplot(y='genero', x='vendas_japao', data=vendas_genero_japao)

# Personalizando o gráfico
ax.set_title('Faturamento em jogos no Japão por gênero\nem milhões de dólares', pad=20, fontsize=16, loc='left')
ax.set_xlabel('')
ax.set_ylabel('')
ax.yaxis.set_tick_params(labelsize=12)

# Retirando o Frame (retângulo que encobre os gráficos)
ax.set_frame_on(False)

# Retirando o eixo X
ax.get_xaxis().set_visible(False)

# Removendo os ticks
ax.tick_params(length=0)

plt.show()

Retorno da célula:

Gráfico de barras horizontais mostrando o faturamento em jogos no Japão por gênero, em milhões de dólares. No topo, há o título 'Faturamento em jogos no Japão por gênero em milhões de dólares'. Os gêneros listados na coluna da esquerda incluem, do mais para o menos lucrativo: 'RPG', 'Ação', 'Esportes', 'Plataforma', 'Diversos', 'Luta', 'Simulação', 'Quebra-cabeça', 'Corrida', 'Aventura', 'Estratégia' e 'Tiro'. O gráfico é composto por barras azuis de diferentes comprimentos dispostas sobre um fundo branco, representando o faturamento de cada gênero.

Focando a atenção onde desejamos

Quando criamos um gráfico, é interessante focar a atenção onde desejamos. Nesse caso, queremos destacar que RPG é o gênero que mais fatura no Japão.

Customizando as cores

Para destacar essa informação, podemos customizar as cores com paletas pré-definidas, ou criando nossas próprias paletas com códigos hexadecimais/RGB.

Abaixo, temos duas paletas de cores com os códigos hexadecimais:

Azul

AZUL1AZUL2AZUL3AZUL4AZUL5
#03045e#0077b6#00b4d8#90e0ef#CDDBF3
Quadrado preenchido em azul-marinho.Quadrado preenchido em azul-escuro.Quadrado preenchido em azul.Quadrado preenchido em azul-claro.Quadrado preenchido em azul-bebê.

Cinza

CINZA1CINZA2CINZA3CINZA4CINZA5
#212529#495057#adb5bd#dee2e6#f8f9fa
Quadrado preenchido em cinza-escuro.Quadrado preenchido em cinza-médio.Quadrado preenchido em cinza.Quadrado preenchido em cinza-claro.Quadrado preenchido em branco.

Para definir essas paletas, podemos executar o seguinte código:

# Definindo a paleta de cores
AZUL1, AZUL2, AZUL3, AZUL4, AZUL5 = '#03045e', '#0077b6', "#00b4d8", '#90e0ef', '#CDDBF3'
CINZA1, CINZA2, CINZA3, CINZA4, CINZA5 = '#212529', '#495057', '#adb5bd', '#dee2e6', '#f8f9fa'

Feito isso, vamos gerar o gráfico com a variável cores, que armazena uma list comprehension para deixar a barra com o valor máximo em azul e as demais em cinza. Ao gerar, precisamos adicionar o parâmetro hue='genero' e definir o palette igual a cores, variável criada anteriormente.

Para personalizar o gráfico, vamos alterar a cor do título com color=CINZA2, bem como a cor do rótulo do eixo Y, utilizando labelcolor=CINZA2.

# Criando a figura e os eixos do gráfico com tamanho 8x5
fig, ax = plt.subplots(figsize=(8,5))

# Ajustando o layout da figura para deixar mais espaço à direita
fig.subplots_adjust(right=0.7)

# Definindo as cores do gráfico
cores = [AZUL2 if vendas == vendas_genero_japao['vendas_japao'].max()
         else CINZA3 for vendas in vendas_genero_japao['vendas_japao']]

# Gerando o gráfico
ax = sns.barplot(y='genero', x='vendas_japao', data=vendas_genero_japao, hue='genero', palette=cores)

# Personalizando o gráfico
ax.set_title('Faturamento em jogos no Japão por gênero\nem milhões de dólares', pad=20, fontsize=16, color=CINZA2, loc='left')
ax.set_xlabel('')
ax.set_ylabel('')
ax.yaxis.set_tick_params(labelsize=12, labelcolor=CINZA2)

# Retirando o Frame (retângulo que encobre os gráficos)
ax.set_frame_on(False)

# Retirando o eixo X
ax.get_xaxis().set_visible(False)

# Removendo os ticks
ax.tick_params(length=0)

plt.show()

Retorno da célula:

Gráfico de barras horizontal ilustrando o 'Faturamento em jogos no Japão por gênero em milhões de dólares'. As categorias listadas no eixo vertical, da maior para a menor, são: RPG, Ação, Esportes, Plataforma, Diversos, Luta, Simulação, Quebra-cabeça, Corrida, Aventura, Estratégia e Tiro. A barra mais longa corresponde ao gênero RPG, destacada em azul, enquanto as outras barras são representadas em cinza.

Após executar o código, temos um gráfico com cores mais calmas, destacando o RPG.

Adicionando os valores das barras

Podemos adicionar o valor da barra, formatando com cifrão e número inteiro, e ajustando o deslocamento para evitar sobreposição. Usaremos ax.text() para adicionar os valores, definindo posição, cor, tamanho e centralização. Observe abaixo o resultado desse ajuste:

# Criando a figura e os eixos do gráfico com tamanho 8x5
fig, ax = plt.subplots(figsize=(8,5))

# Ajustando o layout da figura para deixar mais espaço à direita
fig.subplots_adjust(right=0.7)

# Definindo as cores do gráfico
cores = [AZUL2 if vendas == vendas_genero_japao['vendas_japao'].max()
         else CINZA3 for vendas in vendas_genero_japao['vendas_japao']]

# Gerando o gráfico
ax = sns.barplot(y='genero', x='vendas_japao', data=vendas_genero_japao, hue='genero', palette=cores)

# Personalizando o gráfico
ax.set_title('Faturamento em jogos no Japão por gênero\nem milhões de dólares', pad=20, fontsize=16, color=CINZA2, loc='left')
ax.set_xlabel('')
ax.set_ylabel('')
ax.yaxis.set_tick_params(labelsize=12, labelcolor=CINZA2)

# Retirando o Frame (retângulo que encobre os gráficos)
ax.set_frame_on(False)

# Retirando o eixo X
ax.get_xaxis().set_visible(False)

# Removendo os ticks
ax.tick_params(length=0)

# Escrevendo os valores de cada barra no gráfico
for i, valor in enumerate(vendas_genero_japao['vendas_japao']):
  qtd = f'${valor:.0f}' # Formatação para mostrar o valor inteiro com o símbolo de dólar
  offset = 5 # Deslocamento para evitar que o texto se sobreponha à barra
  ax.text(valor - offset, i, qtd, color= CINZA5, fontsize=10, fontweight='bold', ha='right', va='center')

plt.show()

Retorno da célula:

Gráfico de barras horizontais mostrando o faturamento em jogos no Japão por gênero, em milhões de dólares. No topo, o título 'Faturamento em jogos no Japão por gênero em milhões de dólares'. As categorias são: RPG com $352 em uma barra azul, Ação com $160, Esportes com $135, Plataforma com $131, Diversos com $108, Luta com $87, Simulação com $64, Quebra-cabeça com $57, Corrida com $57, Aventura com $52, Estratégia com $49 e Tiro com $38. As barras, exceto RPG, são cinzas.'

Nesse caso, fizemos um for para pegar cada valor e depois formatamos com f'${valor:.0f}. Além disso, realizamos um deslocamento (offset) para evitar que o texto sobreponha a barra. Podemos deslocar para a direita ou para a esquerda.

Adicionando textos

Para finalizar, podemos adicionar um texto conclusivo ao gráfico, definindo a posição e destacando palavras em negrito. Executando o comando, temos o seguinte resultado:

# Criando a figura e os eixos do gráfico com tamanho 8x5
fig, ax = plt.subplots(figsize=(8,5), dpi=200)

# Ajustando o layout da figura para deixar mais espaço à direita
fig.subplots_adjust(right=0.7)

# Definindo as cores do gráfico
cores = [AZUL2 if vendas == vendas_genero_japao['vendas_japao'].max()
         else CINZA3 for vendas in vendas_genero_japao['vendas_japao']]

# Gerando o gráfico
ax = sns.barplot(y='genero', x='vendas_japao', data=vendas_genero_japao, hue='genero', palette=cores)

# Personalizando o gráfico
ax.set_title('Faturamento em jogos no Japão por gênero\nem milhões de dólares', pad=20, fontsize=16, color=CINZA2, loc='left')
ax.set_xlabel('')
ax.set_ylabel('')
ax.yaxis.set_tick_params(labelsize=12, labelcolor=CINZA2)

# Retirando o Frame (retângulo que encobre os gráficos)
ax.set_frame_on(False)

# Retirando o eixo X
ax.get_xaxis().set_visible(False)

# Removendo os ticks
ax.tick_params(length=0)

# Escrevendo os valores de cada barra no gráfico
for i, valor in enumerate(vendas_genero_japao['vendas_japao']):
  qtd = f'${valor:.0f}' # Formatação para mostrar o valor inteiro com o símbolo de dólar
  offset = 5 # Deslocamento para evitar que o texto se sobreponha à barra
  ax.text(valor - offset, i, qtd, color= CINZA5, fontsize=10, fontweight='bold', ha='right', va='center')

# Anotando uma conclusão no gráfico
ax.text(370, 4.5,
         'O gênero $\\bf{RPG}$ lidera o faturamento\n'
         'no $\\bf{Japão}$, alcançando impressionantes\n'
         '$\\bf{352}$ $\\bf{milhões}$ $\\bf{de}$ $\\bf{dólares}$, destacando\n'
         'a forte preferência dos consumidores\n'
         'por jogos de role-playing.\n',
         fontsize=12,
         linespacing=1.5,
         color=AZUL2)

plt.show()

Retorno da célula:

Gráfico de barras horizontais mostrando diferentes gêneros de jogos e seus faturamentos. RPG lidera com $352 milhões (barra azul). Seguem Ação $160 milhões, Esportes $135 milhões, e outros, até Tiro com $38 milhões. Ao lado, texto explica que RPG lidera no Japão com faturamento de 352 milhões de dólares, destacando a preferência dos consumidores.

Agora, temos um gráfico informativo, com representações visuais e o texto "O gênero RPG lidera o faturamento no Japão, alcançando impressionantes 352 milhões de dólares, destacando a forte preferência dos consumidores para os jogos de role-playing."

Conclusão

Comparado ao início, o gráfico está bem mais informativo. Agora, é hora de treinar e aprimorar suas habilidades de customização de gráficos nas atividades seguintes. Até a próxima!

Sobre o curso Praticando gráficos: criando gráficos customizados

O curso Praticando gráficos: criando gráficos customizados possui 16 minutos de vídeos, em um total de 13 atividades. Gostou? Conheça nossos outros cursos de Data Science em Data Science, ou leia nossos artigos de Data Science.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda Data Science acessando integralmente esse e outros cursos, comece hoje!

Conheça os Planos para Empresas