Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

[Dúvida] Dificuldade em construir histograma de médias

Eu fiz uma média de valores para cada UF:

# A renda está concentrada em quais estados?
# Fazendo uma series;
media_renda_por_uf = dados.groupby('UF')['Renda'].mean().sort_values()
media_renda_por_uf

dados é o DataFrame diretamente do csv da atividade. Devolveu:

UF
MA    1019.432009
PI    1074.550784
SE    1109.111111
AL    1144.552602
CE    1255.403692
PB    1293.370487
RN    1344.721480
PA    1399.076871
BA    1429.645094
AM    1445.130100
AC    1506.091782
PE    1527.079319
TO    1771.094946
RR    1783.588889
RO    1789.761223
AP    1861.353516
GO    1994.580794
ES    2026.383852
MG    2070.515707
MS    2262.604167
RS    2315.158336
SC    2470.854945
PR    2493.870753
RJ    2496.403168
SP    2638.104986
DF    4241.954722
Name: Renda, dtype: float64

Porém, estou com muita dificuldade em usar essa Series para fazer o histograma com seus valores. Como posso fazer? Resultou errado quando:

renda_por_uf = sns.displot(data = media_renda_por_uf,
                           x = media_renda_por_uf.keys(),
                           y = media_renda_por_uf,
                           kind='hist').figure.set_size_inches(10,8)
renda_por_uf

Insira aqui a descrição dessa imagem para ajudar na acessibilidadeO gráfico ficou todo errado. Quero uma coluna única para cada UF, mas há cinco colunas aglomeradas por algum motivo estranho.

Por enquanto, consegui criar esse gráfico, mas ainda não é o que eu desejo, pois não exibe uma média:

renda_por_uf = sns.displot(data = dados,
                           x = dados.UF.sort_values(),
                           y = dados.Renda,
                           color = 'r',
                           kind='hist').figure.set_size_inches(10,8)
renda_por_uf

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

3 respostas

Oi Akhenaton,

Os seus gráficos não estão errados. Eles estão mostrando uma contagem de quantas vezes uma determinada renda aparece por estado e pela media ao mesmo tempo. Como você adicionou duas variáveis é como se estivesse vendo um mapa dessas duas variáveis com as barras vistas de cima. O segundo gráfico é só uma versão um pouco mais detalhada.

Entendi o que você quer e nesse caso você tem duas opções. A primeira é utilizar uma única variável.

 renda_por_uf = sns.displot(data = df,
                           x = ' Media',
                           kind='hist').figure.set_size_inches(10,8)
renda_por_uf

histograma

E para a opção utilizando duas variáveis você precisa construir um gráfico de barras e não um histograma.

 renda_por_uf = sns.barplot(data = df,
                           x = 'UF',
                           y = ' Media',
                           ).figure.set_size_inches(10,8)
renda_por_uf

barplot

Boa noite, professor Allan Spadini,

Não declarei meu objetivo real no fórum, que foi criar um gráfico de barras da renda média por UF, como o senhor fez no final de sua resposta. Eu terminei de fazer com o Matplotlib.pyplot e com o Seaborn para comparação; eu creio que posso escolher uma das duas bibliotecas.

Transformei media_renda_por_uf em um DataFrame:

media_renda_por_uf = media_renda_por_uf.to_frame().reset_index()
media_renda_por_uf
UFRenda
0MA1019.432009
1PI1074.550784
2SE1109.111111
3AL1144.552602
4CE1255.403692
Outras linhas.........

Então, fiz o gráfico com Matplotlib.pyplot:

import matplotlib.pyplot as plt
plt.figure(figsize = (9, 10))
grafico_media_renda_por_uf = plt.bar(media_renda_por_uf.UF,
                                     media_renda_por_uf.Renda)

grafico_media_renda_por_uf

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Então, usei o Seaborn:

sns.set_style('whitegrid')
sns.barplot(data = dados,
            x = 'UF',
            y = 'Renda'
            ).figure.set_size_inches(15,10)

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Também usei media_renda_por_uf para o barplot, o resultado ficou um pouco diferente:

sns.barplot(data = media_renda_por_uf,
            x = 'UF',
            y = 'Renda',
            color = 'lightblue'
            ).figure.set_size_inches(15,10)

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Então, gostaria de entender o significado das linhas verticais escuras em cada coluna do segundo gráfico e como poderia ordená-lo do valor mínimo ao máximo, da esquerda à direita. Gostaria de deixar as cores dos dois últimos gráficos em alternância entre lightblue e lightgreen, Como poderia fazer isso, professor?

solução!

Oi Akhenaton,

O significado das linhas verticais escuras: Essas linhas são barras de erro controladas pelo parâmetro errorbar. A barra mostra aumenta ou diminui se a variação da renda aumenta ou diminui. Só que no seu caso você está passando um único valor por estado, então não existe motivo para ter uma barra de erro. Se você estiver no colab pode removê-las adicionando o parâmetro ci=None.

Ordenar do menor para o maior: Nesse caso é mais fácil fazer um processo no dataframe antes do construir o gráfico. Exemplo:

# Suponha que você tenha um DataFrame chamado "df" com as colunas "categoria" e "valor"
df = pd.DataFrame({'categoria': ['A', 'B', 'C', 'D'], 'valor': [2, 4, 1, 3]})

# Classifique o DataFrame pelo valor em ordem crescente
df_ordenado = df.sort_values('valor')

Aí você passa o dataframe ordenado para o barplot.

Para trabalhar com as cores do gráfico você precisa usar o parâmetro palette. Se ficar alternando entre duas cores pode passar uma lista de duas cores para o palette. Exemplo.

sns.barplot(x='categoria', y='valor', data=df_ordenado, palette=["lightblue", "lightgreen"])

Mas se quiser ir de uma cor uma cor mais escura para uma mais clara existem paletas de nomes específicos. Tente por exemplo:

sns.barplot(x='categoria', y='valor', data=df_ordenado,palette='mako')

Aqui está em inglês mas tem vários exemplo de paletas que pode experimentar: https://seaborn.pydata.org/tutorial/color_palettes.html

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software