<jupyter_start><jupyter_text>"Conhecendo a Estrutura do Plotly (Parte 1)"> "Uma visão geral sobre a estrutura de um dos pacotes analíticos mais poderosos no ecossistema Python!"- toc: true- branch: master- badges: false- comments: true- author: <NAME>- categories: [Plotly, Gráficos, Python]<jupyter_code># hide_input
# This cell is required for the export to HTML to work.
import plotly.io as pio
#pio.renderers.default = 'plotly_mimetype+notebook'
pio.renderers.default = 'colab'
# Default is plotly_mimetype+notebook, but jekyll fails to parse plotly_mimetype.
#pio.renderers.default = 'notebook_connected'
# Uncomment below to avoid using a CDN for plotly.js
# pio.renderers.default = 'notebook'

# Inject the missing require.js dependency.
from IPython.display import display, HTML
#js = '<script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" integrity="sha512-c3Nl8+7g4LMSTdrm621y7kf9v3SDPnhxLNhcjFJbKECVnmZHTdo+IRO05sNLTH/D3vA6u1X32ehoLC7WFVdheg==" crossorigin="anonymous"></script>'
#display(HTML(js))<jupyter_output><empty_output><jupyter_text>Proficiência no Uso das FerramentasNos fluxos de trabalho com dados a partir do ecossistema Python, trabalhamos com uma grande quantidade de pacotes para dados matriciais/tabulares (Numpy, Pandas, Vaex etc.), plotagem de gráficos (Matplotlib, Seaborn, Bokeh, Plotly, HoloViews, etc.), processamento e visualização de dados geográficos (GeoPandas, Leaflet, Folium, Kepler, GeoViews, etc.), modelagem/machine learning (SciKit-Learn, TensorFlow, PyTorch, Keras, FastAi, etc.), deployment (Streamlit, Dash, Panel, etc.), além de uma infinidade de outros que são voltados para as mais diversas utilidades.Em meio a tantas alternativas, é impossível que qualquer profissional seja capaz de conhecer a fundo todos os pacotes disponíveis. Assim, sobre alguns deles temos noções básicas, com outros temos um pouco mais de familiaridade, enquanto ignoramos completamente a maioria. Diante dessa nossa incapacidade de dominar todo esse arsenal, uma estratégia bastante oportuna é escolhermos alguns poucos pacotes que serão aqueles com os quais mais trabalharemos no nosso quotidiano e nos quais desenvolveremos mais profunda proficiência. No que tange a plotagem de produtos analíticos - gráficos, mapas e diagramas -, depois de usar diversos pacotes, eu decidi que Plotly será a arma com a qual eu tentarei ser o gatilho mais rápido do Oeste. As razões para isso ficam claras em [post](https://augustogeog.github.io/augustogeog/plotly/gr%C3%A1ficos/python/2021/05/31/introdu%C3%A7%C3%A3o-plotly.html) anterior aqui do blog.Nesse processo de aprofundamento do conhecimento sobre a biblioteca eu procuro:* conhecer a estrutura do pacote, com o papel de cada um de seus subpacotes* ter uma boa compreensão de como está organizada a documentação* identificar as dependências do pacote e como isso afeta a sua lógica de funcionamento* saber quais são os principais objetos, seus construtores e funções relacionadas* ter uma leve noção de objetos menos utilizados, mas que eventualmente podem ser úteis* compreender caminhos para otimização do fluxo de trabalho, com vistas a ganhos de performance Sendo assim, nesta postagem em duas partes, o objetivo é apresentar a estrutura do Plotly, que se divide em sete subpacotes. Nesta primeira parte vamos ter uma breve noção sobre os **Plotly Data**, **Plotly Express** e **plotly.colors**. Na próximma, vamos tratar de **Graph Objects**, **Subplots**, **I/O** e **Figure Factories**.![E Lá Vamos Nós](https://raw.githubusercontent.com/augustogeog/augustogeog/master/images/e-la-vamos-nos1.jpg)  Plotly Data[Plotly Data](https://plotly.com/python-api-reference/generated/plotly.data.htmlmodule-plotly.data) é uma biblioteca em que podemos encontrar _**datasets**_ para exercícios e práticas de elaboração de gráficos. Esses datasets conformam uma ótima maneira de se adquirir rápida prática na produção dos gráficos. Cada dataset tem uma função que o carrega em formato Pandas DataFrame, conforme podemos ver adiante, com o carregamento de dados sobre os três países com mais medalhas olímpicas em patinação de velocidade.<jupyter_code>from plotly.data import election, medals_long, stocks # importando a função de carregamento de alguns datasets
df_medals = medals_long() # declarando o dataset como Pandas Data Frame e atribuindo à variável df_medals
df_medals.head(5) # verificando as cinco primeiras linhas do Data Frame de medalhas<jupyter_output><empty_output><jupyter_text>Plotly Express**Plotly Express** é uma API de alto nível de abstração, ou seja é uma interface bastante simplificada a partir da qual se é possível fazer um quantidade riquíssima de produtos analíticos - gráficos, mapas e diagramas - com apenas uma linha de código. Isso é possível pois o pacote conta com dezenas de funções com uma grande quantidade de argumentos - key-word arguments. Como esses argumentos se encontram explicitamente apresentados em cada função, a consulta de seu papel e funcionamento nas **_docstrings_** torna o trabalho muito mais fácil. Da mesma forma, os ambientes de programação - IDES, editores de texto ou Editores de Jupyter Notebooks - conseguem facilmente sugerir auto-completação dos valores, o que acelera o trabalho., a auto-completação , que tornam o trabalho de produção bastante intuitivo, sobretudo pois a orientação para a inserção de argumetos se encontra bem documentada e acessível no docstring e na documentação{% include info.html text="Lembrando que **_docstring_** são os textos instrutivos que aparecem relacionados a funções e outros objetos em Python e que são acessíveis por meio da função help, ou, no caso de em Jupyter Notebooks, pela anteposição de interrogação." %}Para entendermos como funciona o subpacote, vejamos na prática como utilizá-lo para fazer um gráfico com os dados de medalhas olímpicas. Primeiramente fazemos a importação do Plotly Express como px. Em seguida, utilizando a sua função bar, indicamos df_olimpics como o data_frame a ser considerado pela função e mapeamos as colunas nation, count e medal ao eixo x, eixo y e cor, respectivamente. Por fim, inserimos o título do gráfico.<jupyter_code>import plotly.express as px # importando plotly express como px

fig_medals = px.bar( # chamando a função bard e atribuindo o gráfico à variável fig_medals
    data_frame=df_medals # indicação do Data Frame Olimpics como a fonte de dados para o gráfico
    , x='nation' # mapeamento da coluna nação ao eixo x
    , y='count' # mapeamento da coluna contagem ao eixo y
    , color='medal' # mapeamento da coluna medalha às cores
    , title='Short Track Speed Skating Olympic Medals - Top Three Countries'
)

fig_medals.show() # chamada da renderização da figura<jupyter_output><empty_output><jupyter_text>Podemos ver que, com poucas especificações, já conseguimos um resultado bastante elegante, com bela paleta de cores e com interatividade. Basta passar o cursor sobre os elementos do gráfico para se ter responsividade adequada para inserção do produto em um webapp.   Plotly ColorsPlotly colors é um subpacote que conta com escalas de cores e funções utilitárias. As paletas de cores são identificáveis em seus respectivos subpacotes:* cyclical -  cores para representação de fenômenos com características cíclicas (períodos do dia, por exemplo) * diverging - cores para representação de fenômenos divergentes (PH, por exemplo)* qualitative - cores para representação de elementos dissociativos, como diferentes classes nominais (sexo masculino ou feminino, por exemplo)* sequential - cores para representação de fenômenos com gradação quantitativa ou ordenação (tamanho populacional, por exemplo)Em cada um desses _name spaces_, existe uma função bastante interessante chamada swatches - do Inglês, amostras - que renderiza as diversas paletas de cores que podem ser utilizadas como argumento na construção de gráficos, ou como fonte de consulta a códigos de cores que nos interessem.{% include info.html text="Em Python, _name spaces_ se referem a domínios semânticos, ou seja o contexto em que determinado termo tem um significado, como uma variável declarada dentro de uma função que tem seu valor local, mas não global, em todo o _script_, ou uma função que é acessível quando importado o módulo em que está declarada, sem se confundir com outra função de mesmo nome e integrante de outro módulo." %}<jupyter_code>import plotly.colors as colors
colors.qualitative.swatches()<jupyter_output><empty_output><jupyter_text>No caso do nosso gráfico para medalhas olímpicas, podemos notar que as cores sugeridas pelo Plotly Express são muito bonitas e correspondem às primeiras três cores do padrão Plotly Qualitative acima. Isso deve ao fato de que essa sequência de cores é aquela que é utilizada por padrão pelo pacote para dados qualitativos.Poderíamos, no entanto, ter instanciarmos o gráfico, customizando a se quência de cores, fazendo uso do argumento **color_discrete_sequence** e de qualquer outra paleta de cores disponível no subpacote colors, conforme o exemplo abaixo:<jupyter_code>fig_medals = px.bar( # chamando a função bard e atribuindo o gráfico à variável fig_medals
    data_frame=df_medals # indicação do Data Frame Olimpics como a fonte de dados para o gráfico
    , x='nation' # mapeamento da coluna nação ao eixo x
    , y='count' # mapeamento da coluna contagem ao eixo y
    , color='medal' # mapeamento da coluna medalha às cores
    , title='Short Track Speed Skating Olympic Medals - Top Three Countries'
    , color_discrete_sequence=colors.qualitative.D3
)
fig_medals<jupyter_output><empty_output><jupyter_text>Essas cores, embora sejam esteticamente interessantes, acarretam alguns problemas de intuitividade. Estamos representando ouro como azul, prata como laranja e bronze como verde. Em vez disso, talvez possamos consultar os _swatches_ acima para encontrar cores que sejam mais apropriadas para o gráfico. Para tanto, basta passar o cursor sobre as cores que nos interessarem e identificaremos quais os seus códigos. Esses códigos podem, então, ser passados como parâmetros de cores de marcadores.<jupyter_code>fig_medals.data[0].marker.color = 'rgb(238,232,170)'
fig_medals.data[1].marker.color = 'rgb(211,211,211)'
fig_medals.data[2].marker.color = 'rgb(205,133,63)'
fig_medals.show()<jupyter_output><empty_output><jupyter_text>A notação fig_medals.data[0].marker.color = 'rgb(238,232,170)' pode parecer um pouco hieroglifica a princípio. Isso porque esse tipo de notação nos dá uma primeira impressão do trabalho de mais baixo nível de abstração com os objetos **Figure**, que armazenam as especificações dos gráficos a serem renderizados, e até mesmo do subpacote Graph Objects que veremos na parte dois sobre a estrutura do Plotly.{% include info.html text="O objeto armazenado como fig_medals é justamente um Plotly Figure, um tipo que armazena instruções de dados e layout para rendereização de um gráfico. Em postagem futura vamos tratar mais a fundo do tema." %}O importante agora é não nos preocuparmos com isso. Tudo ficará claro com o tempo. Por ora, basta entendermos que uma determinada característica do gráfico elaborado com Plotly Express foi alterada conforme gosto do freguês e com a ajuda da biblioteca colors e de alguns atributos específicos do objeto Figure.Para controle de ansiedade, vejamos que essas mesmas especificações poderiam ter sido passadas diretamente na construção do gráfico a partir da função bar, com ajuda do _key-word argument_ chamado color_discrete_map.<jupyter_code>fig_medals2 = px.bar( # chamando a função bard e atribuindo o gráfico à variável fig_medals
    data_frame=df_medals # indicação do Data Frame Olimpics como a fonte de dados para o gráfico
    , x='nation' # mapeamento da coluna nação ao eixo x
    , y='count' # mapeamento da coluna contagem ao eixo y
    , color='medal' # mapeamento da coluna medalha às cores
    , title='Short Track Speed Skating Olympic Medals - Top Three Countries'
    , color_discrete_map={'gold':'rgb(238,232,170)', 'bronze':'rgb(205,133,63)', 'silver':'rgb(211,211,211)'} #especificação de cores
)

fig_medals2.show() # chamada da renderização da figura<jupyter_output><empty_output>
StarcoderdataJupyterStructuredCleanDedup