Universidade Federal da Bahia - UFBA
Escola Politécnica
O ggplot 2 é um pacote da empresa Rstudio de visualização de dados aprimorado para o R, ele fornece um poderoso modelo de gráficos que facilita a produção de gráficos multi-camadas.
Para saber mais sobre ggplot:
O banco de dados utilizado nesta aula pode ser acessado no link: Arquivos para aula. Apesar da tratativa se restringir a esse banco de dados, todos os códigos apresentados durante a aula podem ser utilizados em qualquer outro banco de dados que contenha as mesmas características deste. Neste mesmo link também é possível baixar um arquivo que contém a paleta de cores do R e seus respectivos nomes.
O banco de dados apresenta o Índice de Desenvolvimento Humano (HDI) e o Índice de Percepção de Corrupção (CPI) para vários países. São dados do Transparency International.
O primeiro passo é instalar e chamar todos o pacotes que serão utilizados durante o desenvolvimento do código.
# Chamando biblioteca, se ainda nao estiver instalada use, ex: install.packages("ggplot2")
if(!require("ggplot2")) install.packages("ggplot2") ; library(ggplot2)
if(!require("ggrepel")) install.packages("ggrepel") ; library(ggrepel)
if(!require("ggExtra")) install.packages("ggExtra") ; library(ggExtra)
if(!require("gridExtra")) install.packages("gridExtra") ; library(gridExtra)
if(!require("plotly")) install.packages("plotly") ; library(plotly)
Os pacotes que foram instalados tem como função complementar o ggplot, aumentado as possibilidades de manipulação gráfica. Ao longo do desenvolvimento do código as funções serão referênciadas aos seus respectivos pacotes.
Após a instalação dos pacotes, deve-se importar o banco de dados de interesse. O tipo de arquivo utilizado é CSV, que significa Comma-separated values (valores separados por vírgula). É um arquivo de apenas uma planilha que contém dados separados por um sinal de pontuação, como vírgula, ponto e vírgula ou ponto. A função read.csv() é utilizada para importação deste tipo de arquivo.
# Importando dados do tipo .csv
EconomistData <- read.csv("C:/Users/lukas/Desktop/R/Codigos R/Aulas - ENGD02/Aula 3 - engd02 (ggplot2)/EconomistData.csv")
Motivação!! Existem outros pacotes gráficos disponíveis para o R, inclusive um residente que disponibiliza ao úsuario uma boa variedade de representações. Então porque usar o ggplot? Dentre outras vantagens veremos nesta aula que o pacote residente exige uma programação muito mais trabalhosa, com inúmeras linhas de códigos para uma representação gráfica que pode ser feita com igual ou melhor detalhamento usando poucas linhas de ggplot.
Então inicialmente a nível de comparação um gráfico de dispersão é plotado usando a função residente plot() do R.
# Grafico de dispersao usando a funcao residente 'plot()'
plot(x = EconomistData$CPI, y = EconomistData$HDI,
xlab = "CPI", ylab = "HDI")
Se o objetivo é representar de maneira simples e rápida a dispersão dos dados, o pacote residente é suficiente, mas para uma investigação mais profunda do banco de dados o uso do ggplot é vantajoso, permitindo que uma grande quantidade de informações sejam representadas com poucas linhas de código.
# Gráfico de Dispersão usando ggplot
gdisp1 <- ggplot(EconomistData, mapping = aes(x = CPI, y = HDI)) + # Mapeando as variaveis
geom_point(aes(color = Region, size = HDI.Rank),alpha = 0.8) + # Graficos de dispersao
scale_color_manual(values =
c("peru","gold","green","darkblue","hotpink3","red4") # Definindo as cores de color
xlab("Índice de Percepção da Corrupção") + # Nomeando a Ox
ylab("Índice de Desenvolvimento Humano") #+ # Nomeando Oy
#geom_text_repel(aes(label = Country)) # Adicionando os nomes
Adicionamos quase todas as informações do banco de daos em um única representação, a informação que está faltando é Country. Está variável pode ser adicionada usando a função geom_text_repel(aes(label = Country)) que está comentada no script, está função é do library(ggrepel) e ela referencia cada ponto com o texto do label escolhido. Aqui não será apresentado o resultado do uso desta função, pois poluirá a representação, mas testes são bem vindos para entender um pouco melhor o resultado da sua utilização, ela pode ser muito útil quando se tem siglas ao invés de nomes.
Existem variadas formas de representar as mesmas informações utilizando ggplot, então para explorar um pouco mais o potencial do pacote serão apresentados mais dois gráficos exibindo as mesmas variáveis, mas utilizando outras funções e novas estéticas.
gdisp2 <- ggplot(EconomistData, mapping = aes(x = CPI, y = HDI)) +
geom_point(aes(color = HDI.Rank, shape = Region), size = 3) + # Adicionando simbolos
xlab("Índice de Percepção da Corrupção") +
ylab("Índice de Desenvolvimento Humano")
A principal mudança foi a troca da estética da variável Region, agora as regiões são representadas por símbolos (shape). Também é interessante observar o comportamento da estética color, antes quando está estética representava uma variável categórica as cores eram bem definidas e de fácil destinção, agora que color é a estética de uma variável númerica contínua, ela passa a se comportar como um gradiente.
gdisp3 <- ggplot(EconomistData, mapping = aes(x = CPI, y = HDI)) +
geom_point(aes(color = HDI.Rank), size = 3) +
facet_wrap(~Region, ncol = 3) + # Dividindo por região
xlab("Índice de Percepção da Corrupção") +
ylab("Índice de Desenvolvimento Humano")
Adicionando a função facet_wrap(~Region, ncol = 3) é possível observar o comportamento dos pontos exclusivamente para cada região, essa função também permite escolher a quantidade de colunas/linhas que será exibida.
O ggplot permite que o usuário armazene o gráfico criado em objetos, possibilitando a utilização deste objeto em qualquer momento do código após a sua criação, extinguindo a necessidade da construção do gráfico novamente, outra facilidade é que o pacote trás uma função exclusiva para salvar as representações criadas, permitindo alterar diversas características da imagem, inclusive a quantidade de dpi.
Ainda é possível unir em uma única imagem as três representações produzidas. Para isso é necessário utilizar a função grid.arrange() do pacote library(gridExtra).
gdisp <- grid.arrange(gdisp1, gdisp2, gdisp3, nrow = 3) # Colocando todos juntos
ggsave(filename = "gdisp.jpeg", gdisp, # Salvando grafico
width = 13, height = 21, dpi = 1000)
O pacote trás uma família de funções do tipo geom_, por enquanto apenas a função geom_point() foi utilizada. É possível combinar gráficos adicionando mais uma camada que contém o gráfico de interesse, para o exemplo as funções geom_smooth() e geom_rug() serão adicionadas.
gcurve <- ggplot(EconomistData, mapping = aes(x = CPI, y = HDI)) +
geom_point(aes(color = HDI.Rank), size = 1) +
geom_rug(col="steelblue",alpha=0.5, size=1.5) + # Adicionando rug
xlab("Índice de Percepção da Corrupção") +
ylab("Índice de Desenvolvimento Humano") +
facet_wrap(~Region, ncol = 3) +
geom_smooth(method = "lm", se = TRUE) # Adicionando curva de ajuste
É possível também adicionar gráficos marginais a um gráfico do tipo ggplot utilizando a função ggMarginal() do pacote library(ggExtra). Para exemplificar essa combinação será utilizado o primeiro gráfico (gdisp1).
gcurve2 <- ggplot(EconomistData, mapping = aes(x = CPI, y = HDI)) +
geom_point(aes(color = Region, size = HDI.Rank),alpha = 0.8) +
xlab("Índice de Percepção da Corrupção") +
ylab("Índice de Desenvolvimento Humano") +
geom_smooth(method = "lm", se = TRUE) +
geom_rug(col="steelblue",alpha=0.1, size=1.5) +
theme(legend.position="none") + # Tirando as legendas
coord_flip() # Trocando eixos
gcmb <- ggMarginal(gcurve2, type="boxplot", color="black", size=4) # Adicionando boxplot
De forma bem objetiva histogramas e gráficos de densidade podem ser criados utilizando respectivamente as funções geom_histogram e geom_density.
gHDI <- ggplot(EconomistData, mapping = aes(x = HDI)) +
geom_histogram(color = "black", fill = "paleturquoise", bins = 30) + # Criando histograma
geom_density(kernel = "gaussian", size = 1, aes(y = 0.05 * ..count..)) + # Adicionando grafico de densidade
xlab("Índice de Desenvolvimento Humano") +
ylab("Frequência")
gCPI <- ggplot(EconomistData, mapping = aes(x = CPI)) +
geom_histogram(color = "black", fill = "palegreen", bins = 30) +
geom_density(kernel = "gaussian", size = 1, aes(y = 0.5 * ..count..)) +
xlab("Índice de Percepção da Corrupção") +
ylab("Frequência")
graph <- grid.arrange(gcmb, arrangeGrob(gCPI, gHDI, ncol=2), nrow = 2) # Colocando todos juntos
ggsave(filename = "graph.jpeg", graph, # Salvando grafico
width = 13, height = 14, dpi = 750)
Apesar do enorme potencial o ggplot tem limitações, principalmente quando se trata de interações, mas algumas dessas limitações podem ser superadas com a utilização de outros pacotes. Para aumentar a interatividade do gráfico pode-se utilizar a função ggplotly() do pacote library(plotly).
ggplotly(gcurve2) # adicionando interação ao gráfico
Afim de instigar o lado desenvolvedor dos alunos dentro da ferramenta R, um exemplo de geolocalização interativa é apresentado a seguir.
if(!require("devtools"))install.packages("devtools") ; library(devtools)
if(!require("dplyr")) install.packages("dplyr") ; library(dplyr)
if(!require("leaflet")) install.packages("leaflet") ; library(leaflet)
if(!require("inmetr")) install_github("lhmet/inmetr") ; library(inmetr)
dados <- bdmep_meta %>% filter(uf == "BA")
leaflet(data = dados) %>%
addTiles() %>% addCircleMarkers(lng = ~lon,lat =~lat,
clusterOptions = markerClusterOptions())
O Stack Overflow é uma comunidade que vai facilitar muito o desenvolvimento de um iniciante na ferramenta R.
Fundada em 2008, o Stack Overflow é a maior e mais confiável comunidade online voltada para programação. A proposta desta comunidade é criar um ambiente para que os desenvolvedores aprendam, compartilhem seus conhecimentos e desenvolvam suas carreiras. Mais de 50 milhões de programadores profissionais e amadores visitam Stack Overflow todo mês para ajudar a resolver problemas de programação e desenvolver novas habilidades.
##############################################################################################################
########################################## ENGD02 #############################################################
##############################################################################################################
########################################## Library ###########################################################
# Chamando biblioteca, se ainda nao estiver instalada use, ex: install.packages("ggplot2")
if(!require("ggplot2")) install.packages("ggplot2") ; library(ggplot2)
if(!require("ggrepel")) install.packages("ggrepel") ; library(ggrepel)
if(!require("ggExtra")) install.packages("ggExtra") ; library(ggExtra)
if(!require("gridExtra")) install.packages("gridExtra") ; library(gridExtra)
if(!require("plotly")) install.packages("plotly") ; library(plotly)
########################################### Data #############################################################
# Importando dados do tipo .csv
EconomistData <-
read.csv("C:/Users/lukas/Desktop/R/Codigos R/Aulas - ENGD02/Aula 3 - engd02 (ggplot2)/EconomistData.csv")
########################################## Pacote Básico #####################################################
# Grafico de dispersao usando a funcao residente 'plot()'
plot(x = EconomistData$CPI, y = EconomistData$HDI,
xlab = "CPI", ylab = "HDI")
########################################## Usando ggplot #####################################################
# Gráfico de Dispersão usando ggplot
gdisp1 <- ggplot(EconomistData, mapping = aes(x = CPI, y = HDI)) + # Mapeando as variaveis
geom_point(aes(color = Region, size = HDI.Rank),alpha = 0.8) + # Graficos de dispersao
scale_color_manual(values =
c("peru","gold","green","darkblue","hotpink3","red4") # Definindo as cores de color
xlab("Índice de Percepção da Corrupção") + # Nomeando a Ox
ylab("Índice de Desenvolvimento Humano") #+ # Nomeando Oy
#geom_text_repel(aes(label = Country)) # Adicionando os nomes
gdisp2 <- ggplot(EconomistData, mapping = aes(x = CPI, y = HDI)) +
geom_point(aes(color = HDI.Rank, shape = Region), size = 3) + # Adicionando simbolos
xlab("Índice de Percepção da Corrupção") +
ylab("Índice de Desenvolvimento Humano")
gdisp3 <- ggplot(EconomistData, mapping = aes(x = CPI, y = HDI)) +
geom_point(aes(color = HDI.Rank), size = 3) +
facet_wrap(~Region, ncol = 3) + # Dividindo por região
xlab("Índice de Percepção da Corrupção") +
ylab("Índice de Desenvolvimento Humano")
gdisp <- grid.arrange(gdisp1, gdisp2, gdisp3, nrow = 3) # Colocando todos juntos
ggsave(filename = "gdisp.jpeg", gdisp, # Salvando grafico
width = 13, height = 21, dpi = 1000)
# Graficos combinados
gcurve <- ggplot(EconomistData, mapping = aes(x = CPI, y = HDI)) +
geom_point(aes(color = HDI.Rank), size = 1) +
geom_rug(col="steelblue",alpha=0.5, size=1.5) + # Adicionando rug
xlab("Índice de Percepção da Corrupção") +
ylab("Índice de Desenvolvimento Humano") +
facet_wrap(~Region, ncol = 3) +
geom_smooth(method = "lm", se = TRUE) # Adicionando curva de ajuste
gcurve2 <- ggplot(EconomistData, mapping = aes(x = CPI, y = HDI)) +
geom_point(aes(color = Region, size = HDI.Rank),alpha = 0.8) +
xlab("Índice de Percepção da Corrupção") +
ylab("Índice de Desenvolvimento Humano") +
geom_smooth(method = "lm", se = TRUE) +
geom_rug(col="steelblue",alpha=0.1, size=1.5) +
theme(legend.position="none") + # Tirando as legendas
coord_flip() # Trocando eixos
gcmb <- ggMarginal(gcurve2, type="boxplot", color="black", size=4) # Adicionando boxplot
gHDI <- ggplot(EconomistData, mapping = aes(x = HDI)) +
geom_histogram(color = "black", fill = "paleturquoise", bins = 30) + # Criando histograma
geom_density(kernel = "gaussian",
size = 1,
aes(y = 0.05 * ..count..)) + # Adicionando grafico de densidade
xlab("Índice de Desenvolvimento Humano") +
ylab("Frequência")
gCPI <- ggplot(EconomistData, mapping = aes(x = CPI)) +
geom_histogram(color = "black", fill = "palegreen", bins = 30) +
geom_density(kernel = "gaussian", size = 1, aes(y = 0.5 * ..count..)) +
xlab("Índice de Percepção da Corrupção") +
ylab("Frequência")
graph <- grid.arrange(gcmb, arrangeGrob(gCPI, gHDI, ncol=2), nrow = 2) # Colocando todos juntos
ggsave(filename = "graph.jpeg", graph, # Salvando grafico
width = 13, height = 14, dpi = 750)
ggplotly(gcurve2) # adicionando interação ao gráfico
########################################## leaflet e inmetr ##################################################
if(!require("devtools"))install.packages("devtools") ; library(devtools)
if(!require("dplyr")) install.packages("dplyr") ; library(dplyr)
if(!require("leaflet")) install.packages("leaflet") ; library(leaflet)
if(!require("inmetr")) install_github("lhmet/inmetr") ; library(inmetr)
dados <- bdmep_meta %>% filter(uf == "BA")
leaflet(data = dados) %>%
addTiles() %>% addCircleMarkers(lng = ~lon,lat =~lat,
clusterOptions = markerClusterOptions())
FILGUEIRA, Leonardo. Leitura de dados csv no R, 16 Nov. 2015. Disponível em: http://www.estatisticacomr.uff.br/?p=176. Acesso em: 13 Nov. 2017.
R graphics with ggplot2 workshop notes, 31 Mar. 2017. Disponível em: http://tutorials.iq.harvard.edu/R/Rgraphics/Rgraphics.html. Acesso em: 14 Nov. 2017.