Imprimindo gráficos em 3D no R

Hadley Wickham, um dos mantenedores do RStudio e criador do pacote tidyverse (que engloba outros, como dplyr, ggplot, forcats, purrr, etc), escreveu um excelente livro com Garret Grolemund chamado “R for Data Science”, que pode ser encontrado gratuitamente aqui. Recomendo fortemente, pois a didática é excelente, os exemplos são claros e os exercícios são desafiadores. Um fato curioso sobr o livro é que o mesmo ensina a fazer gráficos (com o ggplot) antes de ensinar todas as outras coisas, como funções, objetos, tratamento de bancos, análise exploratória e modelos.

O motivo para isso é simples: gráficos são importantíssimos pois é através deles que transmitimos informações aos que nos lêem e nos assistem. No livro, o capítulo de gráficos começa com a seguinte frase:

“O gráfico simples trouxe mais informação para a mente do analista de dados do que qualquer outro dispositivo”
— John Tukey

Quanto mais claro o gráfico, mais fácil é de sermos entendidos, e isso é um princípio da ciência: se construímos algo de difícil compreensão, ninguém entende; se ninguém entende, ninguém dialoga; se ninguém dialoga, não há ciência.

Entretanto, gráficos são apelos visuais. Gráficos são dados exibidos em um plano, com diversas informações numéricas representadas, que possibilitam comparações dentro daquele plano. Cada eixo de um gráfico é uma dimensão, ou seja, guardam uma escala ou informação. Outras dimensões podem existir em um mesmo gráfico. Em um gráfico de dispersão, por exemplo, o tamanho de cada ponto pode significar um terceiro dado, assim como a cor, podendo representar grupos ou casos similares.

Um claro exemplo é o abaixo: um gráfico de hexágonos, feito a partir dos dados das 96.871 seções eleitorais da Rússia, nas eleições para o legislativo em 2016. No eixo X, temos o comparecimento, em porcentagem; no eixo Y, a porcentagem de votos no partido Rússia Unida, que possui maioria absoluta na Duma (o parlamento russo), e a cor representa o número de seções naquele caso, indo de de um roxo escuro, que indica poucas seções, a um amarelo claro, indicando muitas.

pacman::p_load(tidyverse, rayshader, hrbrthemes, viridis, hexbin)

duma2016 %>%
  mutate(pct_edinayarossiya = p_edinayarossiya/(ncedval + ncedinval),
         compa = (ncedval+ncedinval)/nelelist) %>%
  ggplot(aes(x = compa, y = pct_edinayarossiya))+
  geom_hex(bins = 40, color = "black", size = 0.5)+
  scale_y_percent()+
  scale_x_percent()+
  labs(x = "Comparecimento", y = "% de votos no RU")+
  scale_fill_viridis_c()+
  theme_ipsum_tw()+
  labs(title  = "Comparecimento x voto no Rússia Unida",
       fill = "Nº de seções")

No gráfico acima, temos duas regiões esverdeadas-amareladas: entre 25% e 50% dos ambos os eixos, e próximo de 100% nos dois eixos. O que isso significa? Significa que existiram muitas seções cujo comparecimento (ou seja, a proporção de pessoas que foram votar) ficou entre 25%-50% e que os votos para o partido Rússia Unida ficaram também entre 25%-50%, e também muitas seções cujo comparecimento foi próximo à 100% e o voto no partido também, ou seja, alta mobilização para que seções inteiras votassem no RU. Percebemos também a oposição, já que temos algumas seções com 100% de comparecimento mas pouco voto no Rússia Unida. Todavia, essas seções são poucas e continuam na cor mais escura da escala.

Definitivamente, esse não é o mais fácil dos gráficos, e mesmo explicando, é preciso dedicar alguns segundos ou minutos observando-o para compreendê-lo por completo. Mas e se a pessoa para quem queremos transmitir essa informação não for capaz de enxergar, como pessoas com deficiência visual? É justo que elas fiquem excluídas do processo de construção da ciência, ou mesmo de uma exposição simples e descomprometida de dados, como um relatório de uma empresa ou um gráfico de um jornal?

Pensei sobre isso ao perceber que, cada vez mais, museus oferecem experiências táteis para que pessoas com deficiência visual possam se entreter e aproveitar as exposições. Em uma recente exposição que fui, chamada “Antigo Egito: do cotidiano à eternidade”, exibida no Centro Cultural do Banco do Brasil no Rio de Janeiro, diversas peças exibidas possuíam uma variante que permitia o toque: a mesma peça, em um tamanho reduzido, presa na parede, o que possibilitava a inclusão e tornava a exposição mais democrática.

Olhando para aquilo, pensei: e se construíssemos gráficos em três dimensões, imprimindo em uma impressora 3D, para que eles pudessem ser tocados e compreendidos por aqueles que não podem enxergá-lo?

Depois de uma extensa pesquisa, descobri um pacote para o R chamado rayshader, que foi criado inicialmente com o intuito de criar mapas topográficos em 3D, com luz e sombra, além da possibilidade de rotação. O mesmo gráfico acima é exibido da seguinte forma, usando af função plot_gg() e os ajustes de câmera com a função render_camera():

grafico <- duma2016 %>%
  mutate(pct_edinayarossiya = p_edinayarossiya/(ncedval + ncedinval),
         compa = (ncedval+ncedinval)/nelelist) %>%
  ggplot(aes(x = compa, 
             y = pct_edinayarossiya))+
  geom_hex(bins = 40, 
           color = "black", 
           size = 0.5)+
  scale_y_percent()+
  scale_x_percent()+
  labs(x = "Comparecimento", 
       y = "% de votos no RU")+
  scale_fill_viridis_c()+
  labs(fill = "Seções")

plot_gg(grafico)
render_camera(fov = 70, zoom = 0.5, theta = 30, phi = 32)
render_snapshot(clear = TRUE)

O passo que falta, agora, para torná-lo definitivamente mais acessível, é transformá-lo em um modelo 3D. O rayshader possui a função save_3dprint(), que permite exportar o modelo para um arquivo .stl , de stereolithography, que também pode ser processado por uma fatiadora e direcionado para uma impressora 3D, sendo esse o objetivo: imprimir os gráficos em 3D. Para isso, utilizamos o comando abaixo para gerar o .stl:

save_3dprint(filename = "graf_russia.stl", remove_extras = T, clear = T)

E após isso, processamos o arquivo em uma fatiadora. No caso, eu utilizo o software Flashprint, que dialoga com as impressoras Flashforge. O arquivo gerado, ao ser processado pela fatiadora, fica da seguinte forma:

Depois de impresso (levou em torno de 47 minutos, como podem ver na imagem acima, e gastou cerca de 2,63m de filamento PLA – ácido polilático, um polímero), temos o seguinte resultado:

É possível perceber que no modelo redimensionado, alguns detalhes se perderam, mas ainda assim, facilita para as pessoas que possuem alguma deficiência visual de entenderem o tipo de informação que queremos passar.

Impressoras 3D estão cada vez mais baratas, assim como o material usado para a impressão. De qualquer forma, para quem precisar fazer um uso pontual, é possível imprimir modelos em .stl em diversas lojas e fornecedores, de maneira rápida e fácil.

Certamente, não haverá uma rápida popularização do método, porém, provar que é possível (e pelo R) já é um grande avanço em direção à acessibilidade e à inclusão, tão necessários não só na ciência, como em todos os campos da sociedade. É importante também colocar tais modelos impressos para consulta de deficientes visuais para que sejam testados por eles, adequando-os às necessidades percebidas, seja em tamanho, precisão ou organização da impressão.

Bom, por hoje é só. Agradeço principalmente ao criador do pacote rayshader, Tyler Morgan-Wall, PhD em Física na Universidade John Hopkins. Qualquer dúvida, correção ou sugestão pode ser enviada para o meu email

Mateus Cavalcanti Pestana
Mateus Cavalcanti Pestana
Doutorando e Mestre em Ciência Política

Interessado em ciência de dados, ciência política, política russa, impressão 3D, redes neurais e aprendizado de máquina.

Relacionados