Como tornar sua apresentação de um trabalho muito mais interessante?

Talvez fazendo algum gráfico interativo!


Existem muitos pacotes do R como gráficos interativos, alguns deles são:

  • ggiraph
  • rgl
  • gganimate
  • leaflet

Vamos apresentar alguns poucos exemplos de uso de cada um deles. O objetivo é ter uma visão geral das ferramentas disponíveis e mais detalhes sobre cada um dos pacotes devem ser pesquisados em tutoriais na internet e no help do R!

Pacote ggiraph

Pacote ggiraph

O pacote ggiraph pode ser utilizado em conjunto como o pacote ggplot2 para tornar os gráficos interativos.

library(ggplot2)

data.diamonds=ggplot2::diamonds 
## os :: acessa algo dentro do pacote sem ter que carregar


library(ggiraph)
gg = ggplot(data.diamonds[sample.int(nrow(data.diamonds),size=2000),], 
            aes(x=carat, y=price,color=color)) + geom_point_interactive(aes(tooltip=cut))
ggiraph(code = print(gg))

Note que a camada geom_point_interactive(aes(tooltip=cut)) define qual a informação será interativa e o argumento tooltip define qual informação aparecerá ao apontarmos o mouse.

De outra forma:

p3 <- ggplot(mpg, aes(x=displ, y=hwy, color=class, tooltip=model)) + 
  geom_point_interactive(size=I(2)) + 
  labs(title="Smaller car = better MPG",
       subtitle="Fuel economy data from 1999 and 2008 for 38 popular models of car",
       caption = "adapted from http://fueleconomy.gov",
       x="engine displacement (l)",
       y="highway (miles per gallon)")

ggiraph(code = print(p3))

Pacote Leaflet

Pacote Leaflet

O pacote Leaflet permite fazer gráficos interativos, adicionando marcadores e colorindo regiões segundo alguma variável de interesse, entre outras coisas.

library(leaflet)

h <- c(-43.964250, -43.941421, -43.936359)
v <- c(-19.868458, -19.919851, -19.923613)
no <- c("Departamento de Estatística - UFMG",
        "CONRE 6 - Conselho Regional de Estatística de Minas Gerais",
        "Prefeitura de Belo Horionte")

m <- leaflet() %>%
  addTiles() %>%  # Add default OpenStreetMap map tiles
  addMarkers(lng=h, lat=v, popup=no) %>%
  addPolylines(lng = h, lat = v, group = no, color="red")
m
## Neste exemplo utilizamos o operador pipe do pacote magrittr
# exemplificando, como ele podemos escrever: dados %>% mean()
# ele pode ser muito útil quando necessitamos de utilizar muitas funções dentro de outras

Outro exemplo:

Neste caso, vemos como colorir uma região segundo uma variável de interesse.

library("rnaturalearthdata")
library(leaflet)
library(RColorBrewer)
## Banco de dados com poligonos 
# countries50

# Construindo a escala
pal <-  colorBin("Blues", domain = log2(countries50$pop_est + 1), bins = 5)

leaflet(data = countries50) %>%
  setView(lng = 0, lat = 0, zoom = 02) %>%
    addPolygons(fillColor = ~ pal( log2(pop_est+1) ),
                fillOpacity = 1,
                color = "#BDBDC3",
                layerId = ~ name,
                weight = 1,
                popup = paste( countries50$name,  "<br>",
                               "População: ", countries50$pop_est)) %>% 
  
  addLegend("bottomright", pal = pal, values = ~log2(countries50$pop_est+1), 
            title = "Escala ", opacity = 1,
                    labFormat=labelFormat(transform = function(x)2^(x)-1, digits = 1)) %>%
  addControl("Clique no mapa para ver detalhes", position = "topright")

Veja mais em:

Pacote gganimate

Pacote gganimate

Com o pacote gganimate podemos fazer animações com gráficos feitos no ggplot2. Existem outros pacotes que fazem a mesma coisa sem utilizar o ggplot2, por exemplo, o pacote animation.


Veja exemplos retirados de:

library(gganimate)
library(gapminder)
library(ggplot2)

p <- ggplot(
  gapminder, 
  aes(x = gdpPercap, y=lifeExp, size = pop, colour = country)
) +
  geom_point(show.legend = FALSE, alpha = 0.7) +
  scale_color_viridis_d() +
  scale_size(range = c(2, 12)) +
  scale_x_log10() +
  labs(x = "GDP per capita", y = "Life expectancy")

anim = p + transition_time(year) +
  labs(title = "Year: {frame_time}")


## use este comando para salvar como um gif.
## Para incluir um gráfico em um apresentação html feita no R
## é necessário salvar primeiro e importar.
animate(anim, 
        nframes = 312, 
        renderer = gifski_renderer("gif1.gif"), 
        duration = 14)

Alterando um pouco o exemplo:

anim = p + facet_wrap(~continent) +
  transition_time(year) +
  labs(title = "Year: {frame_time}")

anim = p + transition_time(year) +
  labs(title = "Year: {frame_time}") +
  view_follow(fixed_y = TRUE)

Um exemplo com um gráfico de linhas:

p <- ggplot(airquality, aes(Day, Temp, group = Month, color = factor(Month))) +
  geom_line() +
  scale_color_viridis_d() +
  labs(x = "Day of Month", y = "Temperature") +
  theme(legend.position = "top")


anim = p + geom_point() +  transition_reveal(Day)

Acrescentando os pontos:

anim = p + geom_point(aes(group = seq_along(Day))) +
  transition_reveal(Day)

Pacote rgl

Pacote rgl

O pacote rgl permite fazermos gráficos 3d interativos. Isto pode ser muito útil se desejamos encontrar pontos de mínimo ou de máximo de uma função!

Iniciamos apresentando um gráficos com o banco de dados iris.

library(rgl)
with(iris, plot3d(Sepal.Length, Sepal.Width, Petal.Length, 
                  type="s", col=as.numeric(Species)))

You must enable Javascript to view this page properly.

Com a função plot3d também podemos fazer um gráfico de linhas.

a <- seq(-5, 5, 0.1)
b <- seq(-5, 5, 0.1)
c <- (a**3) + 4*(b**2)
valor <- data.frame(a, b, c)
with(valor, plot3d(a, b, c, type = "l", col = "red"))

You must enable Javascript to view this page properly.

A função persp3d pode ser utilizada para fazer um gráfico da superficie descrita pela função. Neste exemplo, é apresentada a função de densidade de um distribuição normal multivariada

library(mvtnorm)
sigma <- matrix(c(1,0.5,0.5,1), ncol=2)
x1 = x2 = seq(-2.5, 2.5, by=0.1)
a = expand.grid(x=x1, y=x2)
y = matrix(dmvnorm(x=a, mean=c(0,0), sigma=sigma), nrow=length(x1))
persp3d(x1, x2, y, expand = 0.25, zlab="", main=" ",
        xlab=expression(nu[1]), ylab=expression(nu[2]), col="green")

You must enable Javascript to view this page properly.

No exemplo abaixo é utilizada a função plot3d para fazer o gráfico de superfície.

f = function(x, y){
    z = ((x^2)+(3*y^2))*exp(-(x^2)-(y^2))
}
plot3d(f, col = colorRampPalette(c("blue", "white")), 
       xlab = "X", ylab = "Y", zlab = "Z", 
       xlim = c(-3, 3), ylim = c(-3, 3),
       aspect = c(1, 1, 0.5))

You must enable Javascript to view this page properly.