Fundamentos do Plotly: Uma introdução a estrutura da figura
Na maioria das vezes, contar uma história com dados é feito através de uma boa visualização de dados. Para se criar boas visualizações, apenas gráficos estáticos já dão conta do recado.
Eles são excelentes, satisfazem nossas necessidades e grande parte das pessoas que trabalham com Python ou R utilizam, mas… nós queremos aprimorar nossas habilidades, certo?
Criar gráficos dinâmicos pode ser um próximo passo para você que quer melhorar suas habilidades de visualização de dados e o Plotly, é uma excelente biblioteca para esse objetivo. Utilizando um módulo dele, o Plotly Express, com algumas linhas de código já conseguimos visualizar os dados de forma rápida.
O módulo possui mais de 30 funções prontas para você chamar e utilizar em seus projetos, dos diferentes tipos de gráficos: barras, boxplot, violino, mapa, pizza, histograma, dispersão…
Mas se você quiser customizar ainda mais os gráficos ou se aperfeiçoar na biblioteca, você precisará entender melhor como funcionam as coisas por debaixo desse módulo.
Entender os fundamentos dela é um bom caminho para se seguir.
Bom, no texto de hoje trago uma introdução a estrutura da figura gerada no Plotly.
Bora lá?
Sumário
Plotly por debaixo dos panos
Estou utilizando o Plotly com o Python, porque poderia utilizar R, Julia, Javascript, F#, MATLAB…
Mas quando chamo uma função do Plotly com Python ele renderiza a imagem utilizando o Plotly.js.
Sim! Na realidade ele trabalha com o Javascript por detrás.
O Plotly.js foi escrito em cima da D3.js e da stack.gl.
Se você, assim como eu, já estudou algum conteúdo sobre visualizações de dados, possivelmente já deve ter ouvido falar da D3, agora da Stack eu nunca tinha lido a respeito. Entrando no site da ferramenta dá para se ter uma noção do poder de criação de imagens 3D que ela tem.
Voltando ao Python.py, as figuras de plotadas são representadas como dicionários Python ou um objeto plotly.graph_objects transformadas em um JSON e depois enviadas para o Javascript trabalhar.
Se você tiver curiosidade, digite fig.show(‘json’) e verá o JSON:
fig = px.bar(emprestimos,x=’Faculdade’,y=’Emprestimos’,title=”Quantidade de empréstimos realizados <br><br><sup> Dados de setembro de 2022</sup>”,width=800, height=500)fig.update_yaxes(title=None)
fig.update_xaxes(title=None)fig.show(‘json’)
Cada figura plotada tem uma estrutura base de três itens:
- Data
- Layout
- Frames (caso seja uma figura animada)
Estrutura: Data
O item Data é onde estão os aspectos de conteúdo do gráfico.
Ele na realidade é uma lista com vários dicionários, no qual cada elemento formará um aspecto dele: array dos dados no eixo x e y, tipo de gráfico, se tem legenda ativa ou não, etc….
Estrutura: Layout
Como seu próprio nome já fala o Layout é onde tem todas as informações do visual dele.
É um dicionário com vários elementos como: o título, tamanho, posição dos eixos, posição da legenda etc.
Estrutura: Frames
Se o gráfico for animado, como esse:
Ele terá o item Frames preenchido.
Caso não seja animado, automaticamente ele não será preenchido.
Esse item é outra lista de dicionários com vários elementos que criarão cada quadro para se movimentar depois, assim como um vídeo.
Agora, para controlar as configurações de usabilidade do frames, como os botões de “play” e “stop” é através do Layout.
Configurações do gráfico
Além de todas essas informações da estrutura do gráfico, ainda temos como parametrizar as configurações de como esse gráfico se comportará.
Como por exemplo desabilitar o zoom do do gráfico, parametrizar o formato da imagem no botão de download, transformar ele em um gráfico estático…
Mas fazer gráficos estáticos com o Plotly não é exatamente o que queremos nesse momento, certo?! :)
Tudo isso pode ser apenas estruturado passando os elementos necessários em um dicionário e o atribuindo no config quando chamar o .show().
Bloqueando o zoom:
fig = px.bar(x=[“Faculdade de Ciências Aplicadas”,”Centro de Engenharia Biomédica”,”Faculdade de Tecnologia”],
y=[5259,4895,6230],title=”Quantidade de empréstimos realizados <br><br><sup> Setembro de 2022</sup>”,width=800, height=600)fig.update_yaxes(title=None,range=[0,10000])
fig.update_xaxes(title=None)config = dict({‘scrollZoom’: False})fig.show(config=config)
Configurando o botão de download:
fig = px.bar(x=[“Faculdade de Ciências Aplicadas”,”Centro de Engenharia Biomédica”,”Faculdade de Tecnologia”],y=[5259,4895,6230],title=”Quantidade de empréstimos realizados <br><br><sup> Setembro de 2022</sup>”,width=800, height=600)fig.update_yaxes(title=None,range=[0,10000])
fig.update_xaxes(title=None)config = {‘toImageButtonOptions’: {
‘format’: ‘png’,
‘filename’: ‘custom_image’,
‘height’: 500,
‘width’: 700
}}fig.show(config=config)
Estrutura das coordenadas
Quando posicionamos algum elemento dentro do gráfico, como uma legenda, configuramos as posições x e y dela.
Mas essa medida é relativa ao tamanho configurado lá no Layout (na maioria das vezes automaticamente), como você pode ver com as posições dessa legenda:
fig = px.bar(emprestimos,x=’Faculdade’,y=’Emprestimos’,title=”Quantidade de empréstimos realizados <br><br><sup> Dados de setembro de 2022</sup>”,width=800, height=500)fig.update_yaxes(title=None,range=[0,10000])
fig.update_xaxes(title=None)
fig.add_annotation(x=1,y=5000,text=’Ponto de atenção’,arrowhead=2,
font=dict(family=”Arial”,size=12,color=”white”),
arrowcolor=”black”,borderpad=4,bgcolor=”darkorange”)fig.show()
Mas você também pode configurar as coordenadas escolhendo a estrutura “paper”, que é a medida relativa dos valores dos eixos em um sistema de coordenadas entre 0 e 1.
Se você passar valores acima de 1 ou abaixo de 0 estará fora da área do gráfico.
fig = px.bar(emprestimos,x=’Faculdade’,y=’Emprestimos’,title=”Quantidade de empréstimos realizados <br><br><sup> Dados de setembro de 2022</sup>”,width=800, height=500)fig.update_yaxes(title=None,range=[0,10000])
fig.update_xaxes(title=None)
fig.add_annotation(x=0.5,y=0.5,xref=’paper’,yref=’paper’,text=’Ponto de atenção’,arrowhead=2,
font=dict(family=”Arial”,size=12,color=”white”),
arrowcolor=”black”,
borderpad=4,
bgcolor=”darkorange”)fig.show()
Se precisar configurar apenas um dos eixos, só configure em apenas um:
fig = px.bar(emprestimos,x=’Faculdade’,y=’Emprestimos’,title=”Quantidade de empréstimos realizados <br><br><sup> Dados de setembro de 2022</sup>”,width=800, height=500)fig.update_yaxes(title=None,range=[0,10000])
fig.update_xaxes(title=None)
fig.add_annotation(x=0.5,y=5000,xref=’paper’,text=’Ponto de atenção’,arrowhead=2,
font=dict(family=”Arial”,size=12,color=”white”),
arrowcolor=”black”,
borderpad=4,
bgcolor=”darkorange”)fig.show()
Considerações finais
É bastante interessante lermos a documentação e entendermos os fundamentos de uma biblioteca para podermos utilizá-la da melhor forma.
Esse conteúdo foi realizado a partir da leitura da documentação do Ploty.py e você também pode consultá-la aqui.
É diferente de ler e “decorar” cada API… você não precisa decorar, mas sim entender como ela funciona.
Ler, você pode ler toda vez que consultá-la e ver outras API’s…
Decorar, vem com o tempo, com o uso… com a prática.
Agora me diga, como você estuda a documentação de uma biblioteca?
E sobre a estrutura da figura do Plotly, você já sabia que ela era dessa forma?
Deixe nos comentários e vamos trocar conhecimento.
Se você chegou até aqui e curtiu, dê palmas, compartilhe e se inscreva para me acompanhar.
Ainda há muito a se explorar.