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

[Dúvida] problema com sns histplot de multiplos agrupamentos de dados

Olá pessoas

estou tendo um problema com o seaborn para gerar um histograma. Minha tabela tem um campo "mês", um campo "lucro", e um campo "tipo de item". Quero fazer o histograma mostrando o lucro de cada tipo de item em três barras (uma para cada mês) dar um espaço e mostrar o próximo tipo de item e assim por diante. Achei um tipo de grafico na biblioteca Seaborn que é exatamente o que estou querendo, mas ao tentar aplicar ele o grafico me retorna com os valores do primeiro mês em todas as barras de cada tipo de item. Então as barras são diferentes entre si, mas dentro de cada tipo de item as 3 barras de cada mês são iguais (e não deviam ser, eu verifiquei os valores na tabela).

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

Por favor me ajudem a não ter que fazer esses gráficos na mão.

O código que eu estou usando nos meus dados é:

ax = sns.histplot(data=df, x="classe", hue="mes", multiple="dodge", shrink=.8)

ax.figure.set_size_inches(10,5)
ax.set_title('Lucro total por classe e mês', fontsize=20, y=1.05)

ax

E o tipo de grafico da biblioteca Seaborn que eu citei é esse exemplo aqui sns.displot(penguins, x="flipper_length_mm", col="sex") na pagina: https://seaborn.pydata.org/tutorial/distributions.html

5 respostas
solução!

qual o conteúdo de df? acho que ele está contando quantas linhas tem e não somando o lucro, por isso fica igual para todos

talvez usando barplot no lugar de histplot e especificando o 'lucro' no eixo y dê o resultado desejado:


ax = sns.barplot(data=df, x="classe", y="lucro", hue="mes")

Muito obrigado João, Eu não sei como nem o porque, mas funcionou. Queria entender pq o hist não rolou (na documentação o efeito é muito parecido, só não mostra as barras de varação no meio.) Pra desvendar o mistério vou deixar aqui o resumo do que há em "df" e abaixo o resultado que foi gerado para que quem tenha o mesmo problema e venha aqui ja saiba como ficou com o barplot e qual a diferença esperada.

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

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

Há um problema ainda, que não percebi na hora e estou tentando resolver. Os valores dos barplots não são somas dos valores na tabela e eu queria fazer esse grafico exatamente para ter a informação sobre a contribuição absoluta de cada categoria para o lucro do mês.

Então pelo que entendi o histplot faz uma contagem (você pode fazer um groupby com count no seu df para validar isso) e o barplot faz as médias (essas barras pretas ilustram a variação).

Logo, se você quer a soma do lucro, acho que tem duas possibilidades.

1) Ver se existe um estimator "sum":


ax = sns.barplot(data=df, x="classe", y="lucro", hue="mes", estimator="sum")

ou

2) Somar direto no pandas e plotar o resultado pronto:


df_agg = df.groupby(["classe", "mes"], as_index=False)["lucro"].sum()
ax = sns.barplot(data=df_agg, x="classe", y="lucro", hue="mes")

A solução 2 funcionou a 1 parece que quer que os meses e categorias sejam numéricos, daí não consegue fazer o gráfico com eles. Um pouco mais complicado (pq ainda não peguei o jeito de usar o groupby), mas com o tempo vou entender melhor o código e a logica dele. Duplamente obrigado João.