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

Erro no código para plotar o boxplot da variável Renda segundo o Sexo e Cor

Estou obtendo erro para plotar o gráfico boxplot para a variável Renda seguindo dois grupos, pelo o Sexo e pela cor. Fiz o seguinte código:

ax = sns.boxplot(x='Renda',y='Cor',data=dados.query('Renda < 10000'),orient='h',hue='Sexo')
ax.figure.set_size_inches(12,6)
ax.set_title('Boxplot para renda mensal',fontsize=14)
ax.set_xlabel('Renda mensal em R$',fontsize=14)
ax.set_yticklabels(['Indígena','Branca','Preta','Amarela','Parda','Sem Declaração'],fontsize=12)
handles = ax.get_legend_handles_labels()
ax.legend(handles,['Masculino','Feminino'],fontsize=12)

Que é semelhante ao apresentando no vídeo de correção. Entretanto, obtenho o segunite aviso: UserWarning: Legend does not support [<matplotlib.patches.Rectangle object at 0x000002283727A580>, <matplotlib.patches.Rectangle object at 0x000002283727A910>] instances. A proxy artist may be used instead. See: https://matplotlib.org/users/legend_guide.html#creating-artists-specifically-for-adding-to-the-legend-aka-proxy-artists

Mas a documentação não oferece muita ajuda e tampouco mostra o porquê que a figura não está sendo plotada com as legendas corretas. Envio em anexo a figura que está sendo gerada. Notem que ela não contém as legendas. Insira aqui a descrição dessa imagem para ajudar na acessibilidade

3 respostas

Só passando para avisar que consegui arrumar o problema inserindo uma nova variável label como segundo argumento da função legend e reescrevendo ela com a lista que gostaria que imprimisse (parece redundante mas não sei o porquê que desse jeito está funcionando).

Vou estar inserindo o código atualizado abaixo:

ax = sns.boxplot(x='Renda',y='Cor',data=dados.query('Renda < 10000'),orient='h',hue='Sexo')
ax.figure.set_size_inches(12,6)
ax.set_title('Boxplot para renda mensal',fontsize=14)
ax.set_xlabel('Renda mensal em R$',fontsize=14)
ax.set_yticklabels(['Indígena','Branca','Preta','Amarela','Parda'],fontsize=12)
handles,labels = ax.get_legend_handles_labels()
label = ['Masculino','Feminino']
ax.legend(handles,label,fontsize=12,bbox_to_anchor=(1,1))

Também inserir o parâmetro bbox_to_anchor para determinar a posição da legenda na figura. Agora a figura gerada é a seguinte: Figura Boxplot gerada com o código acima

Espero que esta alteração possa ajudar os demais que estiveram com o mesmo problema.

solução!

Olá Adriano, tudo beleza?

O método get_legend_handles_labels() por padrão retorna uma tupla. Para usar o método legend do seaborn, precisamos apenas do primeiro valor da dupla que o get_legend_handles_labels() retorna. Sendo assim, você pode pegar apenas o primeiro valor, e ignorar o segundo valor das tupas conform código abaixo:

handles, _ = ax.get_legend_handles_labels()

Para ignorar o segundo valor da tupla, podemos usar o underscore. Para capturar o primieiro valor da tupla usamos a variável handles. Note que os dois estão separados por uma virgula. Agora que já temos o valor que precisamos, podemos ajustar a legenda do nosso gráfico repassando a informação obtida na variável handles no método legend do pandas

ax.legend(handles,label,fontsize=12,bbox_to_anchor=(1,1))

Até mais e bons estudos!

Olá Osvaldo, muito obrigado pela dica. Realmente tinha achado o meu código bastante redundante. Agora com as alterações ele está funcionando bem e está mais organizado.

Abração