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.
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.
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:
classificacao | nome | plataforma | ano | genero | desenvolvedor | vendas_america_norte | vendas_europa | vendas_japao | outras_vendas | vendas_globais |
---|---|---|---|---|---|---|---|---|---|---|
1 | Wii Sports | Wii | 2006.0 | Esportes | Nintendo | 41.49 | 29.02 | 3.77 | 8.46 | 82.74 |
2 | Super Mario Bros. | NES | 1985.0 | Plataforma | Nintendo | 29.08 | 3.58 | 6.81 | 0.77 | 40.24 |
3 | Mario Kart Wii | Wii | 2008.0 | Corrida | Nintendo | 15.85 | 12.88 | 3.79 | 3.31 | 35.82 |
4 | Wii Sports Resort | Wii | 2009.0 | Esportes | Nintendo | 15.75 | 11.01 | 3.28 | 2.96 | 33.00 |
5 | Pokemon Red/Pokemon Blue | GB | 1996.0 | RPG | Nintendo | 11.27 | 8.89 | 10.22 | 1.00 | 31.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.
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:
# | genero | vendas_japao |
---|---|---|
0 | RPG | 352.31 |
1 | Ação | 159.95 |
2 | Esportes | 135.37 |
3 | Plataforma | 130.77 |
4 | Diversos | 107.76 |
5 | Luta | 87.35 |
6 | Simulação | 63.70 |
7 | Quebra-cabeça | 57.31 |
8 | Corrida | 56.69 |
9 | Aventura | 52.07 |
10 | Estratégia | 49.46 |
11 | Tiro | 38.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.
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:
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:
Dessa forma, os nomes das categorias ficam dispostos verticalmente à esquerda, facilitando a leitura, que geralmente começa da esquerda para a direita.
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, enquantofontsize
define o tamanho da fonte. Já oloc
é a localização do título, geralmente, à esquerda.
Ao executar o código, temos um gráfico mais limpo:
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:
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.
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
AZUL1 | AZUL2 | AZUL3 | AZUL4 | AZUL5 |
---|---|---|---|---|
#03045e | #0077b6 | #00b4d8 | #90e0ef | #CDDBF3 |
![]() | ![]() | ![]() | ![]() | ![]() |
Cinza
CINZA1 | CINZA2 | CINZA3 | CINZA4 | CINZA5 |
---|---|---|---|---|
#212529 | #495057 | #adb5bd | #dee2e6 | #f8f9fa |
![]() | ![]() | ![]() | ![]() | ![]() |
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:
Após executar o código, temos um gráfico com cores mais calmas, destacando o RPG.
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:
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.
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:
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."
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!
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:
Impulsione a sua carreira com os melhores cursos e faça parte da maior comunidade tech.
1 ano de Alura
Assine o PLUS e garanta:
Formações com mais de 1500 cursos atualizados e novos lançamentos semanais, em Programação, Inteligência Artificial, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.
A cada curso ou formação concluído, um novo certificado para turbinar seu currículo e LinkedIn.
No Discord, você tem acesso a eventos exclusivos, grupos de estudos e mentorias com especialistas de diferentes áreas.
Faça parte da maior comunidade Dev do país e crie conexões com mais de 120 mil pessoas no Discord.
Acesso ilimitado ao catálogo de Imersões da Alura para praticar conhecimentos em diferentes áreas.
Explore um universo de possibilidades na palma da sua mão. Baixe as aulas para assistir offline, onde e quando quiser.
Acelere o seu aprendizado com a IA da Alura e prepare-se para o mercado internacional.
1 ano de Alura
Todos os benefícios do PLUS e mais vantagens exclusivas:
Luri é nossa inteligência artificial que tira dúvidas, dá exemplos práticos, corrige exercícios e ajuda a mergulhar ainda mais durante as aulas. Você pode conversar com a Luri até 100 mensagens por semana.
Aprenda um novo idioma e expanda seus horizontes profissionais. Cursos de Inglês, Espanhol e Inglês para Devs, 100% focado em tecnologia.
Transforme a sua jornada com benefícios exclusivos e evolua ainda mais na sua carreira.
1 ano de Alura
Todos os benefícios do PRO e mais vantagens exclusivas:
Mensagens ilimitadas para estudar com a Luri, a IA da Alura, disponível 24hs para tirar suas dúvidas, dar exemplos práticos, corrigir exercícios e impulsionar seus estudos.
Envie imagens para a Luri e ela te ajuda a solucionar problemas, identificar erros, esclarecer gráficos, analisar design e muito mais.
Escolha os ebooks da Casa do Código, a editora da Alura, que apoiarão a sua jornada de aprendizado para sempre.