4
respostas

[Dúvida] dificuldade para criar line_polar no plotly

Estou tentando implementar um gráfico de radar no meu dash mas não estou conseguindo. Ele precisa mostrar os valores de três variáveis, de cada aluno e deixar o filtro com a lista de alunos na lateral. Contudo, ou consigo listar os alunos ou plotar as 3 variáveis.

df_dados_quest_nivel = dados_nivel_anamnese[['aluno', 'pontuacaoTempoTreinoAtual', 
                                             'pontuacao_experiencia_previa_de_treinamento', 
                                             'pontuacao_tempo_de_destreinamento_atual']]
df_dados_quest_nivel = df_dados_quest_nivel.set_index('aluno')
#df_dados_quest_nivel = df_dados_quest_nivel.T

import plotly.express as px

theta = [df_dados_quest_nivel['pontuacaoTempoTreinoAtual'],
         df_dados_quest_nivel['pontuacao_experiencia_previa_de_treinamento'],
         df_dados_quest_nivel['pontuacao_tempo_de_destreinamento_atual']]

fig = px.line_polar(df_dados_quest_nivel,
                    #color= df_dados_quest_nivel.index,
                    theta= ['pontuacaoTempoTreinoAtual', 
                                             'pontuacao_experiencia_previa_de_treinamento', 
                                             'pontuacao_tempo_de_destreinamento_atual'],
                    #r=df_dados_quest_nivel['pontuacaoTempoTreinoAtual'],
                    line_close=True,
                    #color_discrete_sequence="aluno",
                    template="plotly_dark",)
fig.show()

assim, é a forma que plota o mais próximo do que preciso, mas só se eu comentar a linha que me daria o filtro de alunos. Alguém tem ideia de como posso resolver isso?

4 respostas

Olá Murilo, tudo bem? Espero que sim!

Não tenho acesso aos dados, mas vou tentar explicar a partir de um exemplo. Para você criar um gráfico de radar com plotly, precisa que no seu DataFrame tenha uma coluna contendo as informações numéricas, e a outra coluna contenha a informação da categoria. Assim, você irá passar a informação numérica para o parâmetro r da função, e as informações das categorias para o parâmetro theta. Para mostrar o nome de cada aluno, pode usar o parâmetro hover_name para identificar os alunos em cada ponto do gráfico.

O seu DataFrame possui 3 colunas com as categorias, mas precisa fazer uma transformação para que fique em apenas uma coluna, que vai conter o nome das categorias. Portanto o seu DataFrame que está nesse formato:

AlunopontuacaoTempoTreinoAtualpontuacao_experiencia_previa_de_treinamentopontuacao_tempo_de_destreinamento_atual
Aluno 1xyz
Aluno 2xyz

Precisa ficar nesse formato:

Alunopontuacaocategoria
Aluno 1xtempotreinoatual
Aluno 1yexperiencia_previa_treinamento
Aluno 1ztempo_treinamento_atual
Aluno 2xtempotreinoatual
Aluno 2yexperiencia_previa_treinamento
Aluno 2ztempo_treinamento_atual

Assim, você consegue utilizar o código abaixo para a tabela nesse formato:

px.line_polar(dados, r = 'pontuacao', theta = 'categoria', hover_name = 'Aluno')

Para construir o seu filtro de alunos, basta utilizar a coluna 'Aluno', usando o método .unique() para coletar o nome dos alunos únicos do DataFrame. Assim, você pode utilizar o filtro usando o Pandas para filtrar a partir da base de dados.

px.line_polar(dados[dados['Aluno'].isin(filtro)], r = 'pontuacao', theta = 'categoria', hover_name = 'Aluno')

Onde o filtro é uma lista de valores com o nome dos alunos que pode ser obtida a partir de um seletor do streamlit.

Bons estudos!

Olá João, obrigado pela ajuda.

Usando a documentação do streamlit vi que os dados precisam estar no formato que mostrou, mas essa é justamente minha dificuldade, não encontrei uma forma de fazer essa transformação, como seria?

Olá Murilo, tudo bom?

Tente utilizar a função wide_to_long da biblioteca pandas.

Leia a documentação para entender bem como vai utilizar de acordo com a forma que estão os seus dados.

Outros métodos que servem para transformar o formato das tabelas de forma rápida são o melt, pivot e pivot_table.

Tem um curso na plataforma que trata justamente de agrupamentos e transformações de tabelas usando o pandas:

Obrigado!