Não se deve menosprezar a nossa capacidade para detectar padrões em dados.
x y
1 -0.978 0.211
2 1.000 -0.013
3 -0.928 -0.373
4 -0.541 -0.841
5 0.628 -0.779
6 -0.191 0.982
7 -0.236 0.972
8 0.926 0.377
9 -0.961 -0.276
10 -0.883 0.469
11 0.902 0.433
12 -0.485 0.875
13 0.748 -0.663
14 0.640 -0.768
15 -0.523 0.853
16 -0.345 -0.939
17 0.473 0.881
18 0.644 0.765
19 -0.449 -0.894
20 0.610 -0.792
21 0.958 -0.286
22 -0.827 0.562
23 0.790 -0.613
24 -0.952 -0.306
25 0.675 -0.738
Apresentados neste formato é difícil discernir padrões, mas…
x y
1 -0.978 0.211
2 1.000 -0.013
3 -0.928 -0.373
4 -0.541 -0.841
5 0.628 -0.779
6 -0.191 0.982
7 -0.236 0.972
8 0.926 0.377
9 -0.961 -0.276
10 -0.883 0.469
11 0.902 0.433
12 -0.485 0.875
13 0.748 -0.663
14 0.640 -0.768
15 -0.523 0.853
16 -0.345 -0.939
17 0.473 0.881
18 0.644 0.765
19 -0.449 -0.894
20 0.610 -0.792
21 0.958 -0.286
22 -0.827 0.562
23 0.790 -0.613
24 -0.952 -0.306
25 0.675 -0.738
As funções base do R possuem múltiplas funções para visualização: plot
, hist
, …
Aqui iremos usar o pacote ggplot2
que fornece uma gramática para a construção de gráficos.
# install.packages("ggplot2")
library(ggplot2)
O gráfico anterior foi construído pelo seguinte código:
ggplot(data=points) +
geom_point(mapping=aes(x=x, y=y)) +
theme_bw()
onde o operador + tem um funcionamento similar ao operador %>%.
Estes são os conceitos importantes da gramática de gráficos implementada pelo pacote ggplot2
:
Estéticas (aes) – descrevem qual o aspecto dos dados: a sua cor, forma, posição vertical ou horizontal
Objectos geométricos (geoms) – objectos que se vêm no gráfico, como linhas ou pontos
Estatísticas (stats) – são sumários dos dados
Escalas (scales) – são funções que mapeiam os dados nas estéticas (eg, definir eixos lineares ou logarítmicos), para cada estética tem de haver uma escala
Sistemas de coordenadas (coord)
Facetas (facets) – que permitem separar os dados em subcategorias, cada uma com um gráfico associado
Este dataset está incluído no pacote ggplot2
e contém 54000 diamantes com vários atributos e respectivo preço:
set.seed(101)
d <- diamonds[sample(nrow(diamonds), 100), ] # usar apenas alguns exemplos do dataset
head(d, 12)
carat cut color clarity depth table price x y z
20077 1.00 Very Good F VVS2 60.0 62 8553 6.43 6.46 3.87
2364 0.90 Premium J VS1 62.3 56 3175 6.23 6.19 3.87
38279 0.21 Premium D VS2 59.1 62 386 3.89 3.86 2.29
35474 0.39 Ideal G VVS2 61.9 56 902 4.68 4.70 2.90
13477 1.15 Ideal I VS2 61.7 57 5534 6.72 6.74 4.15
16184 1.10 Premium D SI1 60.7 55 6468 6.74 6.71 4.08
31545 0.30 Ideal E VVS2 61.6 58 766 4.28 4.33 2.65
17985 1.07 Ideal G VS2 61.9 55 7275 6.55 6.57 4.06
33547 0.35 Ideal D VS2 62.4 55 829 4.48 4.52 2.81
29438 0.38 Premium I VS1 59.9 60 700 4.66 4.72 2.81
47448 0.53 Ideal D VS2 61.2 56 1857 5.20 5.23 3.19
38122 0.30 Premium G VVS1 60.7 59 1013 4.37 4.33 2.64
A função ggplot
cria um gráfico mas ainda sem visualização:
ggplot(d, aes(carat, price, colour=cut))
Já foi fornecida uma estética: a cor de cada diamante é determinada pela variável categórica cut
.
Mas ainda não estabelecemos qual o objecto gráfico, qual o geom, que queremos.
Podemos definir o geom como sendo pontos:
ggplot(d, aes(carat,price,colour=cut)) +
geom_point()
Ou podemos definir o geom como sendo linhas:
ggplot(d, aes(carat,price,colour=cut)) +
geom_line()
Ou podemos aplicar os dois geoms anteriores ao mesmo tempo:
ggplot(d, aes(carat, price, colour=cut)) +
geom_point(aes(size=price)) +
geom_line()
Outro exemplo:
ggplot(d, aes(x*y*z, price)) + # x*y*z é uma aproximação do volume do diamante
geom_point(aes(shape=cut)) +
geom_smooth(level=0.95)
O geom geom_smooth
cria automaticamente um intervalo de confiança com o nível desejado.
O mesmo exemplo mas salientando a qualidade do diamante:
ggplot(d, aes(x*y*z, price)) +
geom_point(aes(colour=cut), size=1.5) +
geom_smooth(level=0.95)
Podemos separar os dados em grupos distintos (no exemplo seguinte dividimos por qualidade do corte) e podemos visualizar cada grupo de forma distinta (por exemplo, com cores ou padrões diferentes):
ggplot(d, aes(carat, price, colour=cut, group=cut)) +
geom_point() +
geom_smooth(method="lm", level=0.5)
Outro exemplo. Neste caso o geom geom_boxplot
faz o agrupamento automaticamente:
ggplot(d, aes(cut, price)) +
geom_boxplot()
É também possível restringir os dados num geom. Aqui apenas fazemos a regressão linear para os diamantes com corte ideal:
ggplot(d, aes(carat, price)) +
geom_point(aes(colour=cut)) +
geom_smooth(data=subset(d, cut=="Ideal"), method="lm")
Este geom produz um gráfico de barras:
ggplot(diamonds) +
geom_bar(aes(x=cut, fill=cut))
Se dermos ao argumento fill
outro campo, o ggplot2 faz um gráfico de barras empilhado:
ggplot(diamonds) +
geom_bar(aes(x=cut, fill=clarity))
Se, no entanto, quisermos as barras ao lado umas das outras é preciso explorar outras opções:
ggplot(diamonds) +
geom_bar(aes(x=cut, fill=clarity), position="dodge")
Nota: existem muitas opções e é preciso explorar os ficheiros de ajuda, livros ou tutoriais na internet para encontrar o que queremos.
ggplot(diamonds, aes(x=carat)) +
geom_histogram(binwidth=0.1, fill="steelblue")
ggplot(d, aes(x=carat)) +
geom_density()
Cada geom calcula uma estatística, um stats, para apresentar o respectivo gráfico.
Alguns usam os dados directamente (como o geom_point
) outros calculam estatísticas dos dados para mostrar essa contagem (como o geom_bar
que soma os valores, ou o geom_boxplot
que calcula quartis).
É possivel mudar essa estatística dizendo ao ggplot o que calcular.
ggplot(diamonds, aes(carat)) +
xlim(0, 3) +
geom_area(stat="density")
O mesmo gráfico com outra estatística (bin
conta os vários elementos que se encontram em intervalos sucessivos):
ggplot(diamonds, aes(carat)) +
xlim(0, 3) +
geom_area(stat="bin", binwidth=0.1)
Algumas estatísticas são calculadas a partir das funções stat_XX
do ggplot2:
p <- ggplot(d, aes(carat, price))
p + geom_point()
p + geom_density2d(stat="density2d")
p + stat_binhex(bins=10)
ggplot(data = diamonds) +
geom_bar(aes(x=cut, fill=cut), width=1) +
coord_polar()
ggplot(data = diamonds) +
geom_bar(aes(x=factor(1), fill=cut), width=1) + # fica só com uma coluna
coord_polar(theta="y")
Um exemplo mais complexo com mapas:
library(maps)
m <- map_data("italy")
p <- ggplot(m, aes(x=long, y=lat, group=group)) +
geom_polygon(fill="white", colour="black")
p # coordenadas cartesianas
p + coord_map() # projecao de marcator
As facetas permitem multiplicar os gráficos por cada categoria:
ggplot(d, aes(carat, price, colour=cut, group=cut)) +
geom_point() +
geom_smooth(method="lm", level=0.5) +
facet_wrap(~ cut)
Esta técnica salienta os dados de cada categoria:
df <- dplyr::select(iris, -Species)
ggplot(iris, aes(Sepal.Length, Petal.Length)) + theme_bw() +
geom_point(data=df, colour="grey70") +
geom_point(aes(colour=Species)) +
facet_wrap(~ Species)
O gráfico típico em ggplot segue este padrão:
ggplot(data = <DATA>) +
<GEOM_FUNCTION>( mapping = aes(<MAPPINGS>),
stat = <STAT>,
position = <POSITION> ) +
<COORDINATE_FUNCTION> +
<FACET_FUNCTION>
Links úteis: