11.5 Parâmetros gráficos
Podemos personalizar muitas características de um gráfico (cores, eixos, títulos) através de opções chamadas parâmetros gráficos.
As opções são especificadas através da função par()
. Os parâmetros assim definidos terão efeito até o fim da sessão ou até que eles sejam mudados.
Digitando par()
sem parâmetros produz uma lista das configurações gráficas atuais. A diversidade de parâmetros pode ser vista pela estrutura da par()
.
str(par())
#> List of 72
#> $ xlog : logi FALSE
#> $ ylog : logi FALSE
#> $ adj : num 0.5
#> $ ann : logi TRUE
#> $ ask : logi FALSE
#> $ bg : chr "white"
#> $ bty : chr "o"
#> $ cex : num 1
#> $ cex.axis : num 1
#> $ cex.lab : num 1
#> $ cex.main : num 1.2
#> $ cex.sub : num 1
#> $ cin : num [1:2] 0.15 0.2
#> $ col : chr "black"
#> $ col.axis : chr "black"
#> $ col.lab : chr "black"
#> $ col.main : chr "black"
#> $ col.sub : chr "black"
#> $ cra : num [1:2] 28.8 38.4
#> $ crt : num 0
#> $ csi : num 0.2
#> $ cxy : num [1:2] 0.026 0.0633
#> $ din : num [1:2] 7 5
#> $ err : int 0
#> $ family : chr ""
#> $ fg : chr "black"
#> $ fig : num [1:4] 0 1 0 1
#> $ fin : num [1:2] 7 5
#> $ font : int 1
#> $ font.axis: int 1
#> $ font.lab : int 1
#> $ font.main: int 2
#> $ font.sub : int 1
#> $ lab : int [1:3] 5 5 7
#> $ las : int 0
#> $ lend : chr "round"
#> $ lheight : num 1
#> $ ljoin : chr "round"
#> $ lmitre : num 10
#> $ lty : chr "solid"
#> $ lwd : num 1
#> $ mai : num [1:4] 1.02 0.82 0.82 0.42
#> $ mar : num [1:4] 5.1 4.1 4.1 2.1
#> $ mex : num 1
#> $ mfcol : int [1:2] 1 1
#> $ mfg : int [1:4] 1 1 1 1
#> $ mfrow : int [1:2] 1 1
#> $ mgp : num [1:3] 3 1 0
#> $ mkh : num 0.001
#> $ new : logi FALSE
#> $ oma : num [1:4] 0 0 0 0
#> $ omd : num [1:4] 0 1 0 1
#> $ omi : num [1:4] 0 0 0 0
#> $ page : logi TRUE
#> $ pch : int 1
#> $ pin : num [1:2] 5.76 3.16
#> $ plt : num [1:4] 0.117 0.94 0.204 0.836
#> $ ps : int 12
#> $ pty : chr "m"
#> $ smo : num 1
#> $ srt : num 0
#> $ tck : num NA
#> $ tcl : num -0.5
#> $ usr : num [1:4] 0 1 0 1
#> $ xaxp : num [1:3] 0 1 5
#> $ xaxs : chr "r"
#> $ xaxt : chr "s"
#> $ xpd : logi FALSE
#> $ yaxp : num [1:3] 0 1 5
#> $ yaxs : chr "r"
#> $ yaxt : chr "s"
#> $ ylbias : num 0.2
O parâmetro no.readonly = TRUE
produz uma lista das configurações atuais que podem ser modificadas posteriormente.
# cópia das configurações atuais
old_par <- par(no.readonly = TRUE)
# tipo de linha pontilhada, largura da linha, símbolo para plot (triângulo sólido)
par(lty = 3, pch = 17)
with(
aq,
plot(
x = date,
y = Wind,
type = "b"
)
) # linha e ponto desconectados
# restabelecendo parâmetros originais
par(old_par)
Podemos definir par()
quantas vezes forem necessárias.
A segunda forma de especificar parâmetros é parametro = valor
diretamente na função gráfica de alto nível.
Mas nesse caso, as opções terão efeito (local) apenas para aquele gráfico específico , portanto diferindo da primeira forma em que a definição pode ser para toda sessão (global).
Poderíamos gerar o mesmo gráfico anterior da seguinte forma:
with(
aq,
plot(
x = date,
y = Wind,
type = "b",
lty = 3,
pch = 17
)
)
Nem todas funções de alto nível permitem especificar todos parâmetros gráficos. Veja o help(plot)
para determinar quais parâmetros gráficos podem configurados dessa forma.
?plot
A seguir veremos alguns importantes parâmetros gráficos que podemos configurar.
11.5.1 Símbolos e linhas
Vimos que podemos especificar símbolos e linhas nos gráficos. Os parâmetros relevantes para essas opções são mostradas na tabela a seguir.
Parâmetro | Descrição |
---|---|
pch | define o símbolo a ser usado para pontos |
cex | tamanho do símbolo, cex é um nº indicando a quantidade pela qual símbolos devem ser relativos, Default = 1, 1.5 é 50 % maior, 0.5 é 50 % menor. |
lty | tipo de linha |
lwd | largura da linha, expresso em relação ao default (=1), então lwd = 2 gera uma linha com o dobro de largura da linha default. |
Os símbolos são especificados conforme numeração indicada no gráfico abaixo.
As opções de tipo de linha são mostradas abaixo.
# linhas
op <- par(lwd = 3,
cex = 1.5,
cex.axis = 1,
cex.lab = 1,
font = 2,
font.axis = 2,
font.lab = 2)
plot(
x = c(0, 10),
y = c(1, 6),
type = "n",
xlab = "",
ylab = "",
main = "Amostra de tipo de linhas",
axes = FALSE,
frame.plot = FALSE
)
axis(
side = 2,
lwd = 3,
at = seq(1, 6, by = 1),
cex = 1.25,
font = 2,
col = "white"
)
mtext(
"Nº do tipo de linha (lty = )",
side = 2,
line = 2,
cex = 1.5,
font = 2
)
abline(h = 1:6, lty = 1:6)
par(op)
Exemplo com as opções.
with(
aq,
plot(
x = date,
y = Temp,
type = "b",
lty = 3,
pch = 15,
cex = 2
)
)
11.5.2 Cores
Há diversos parâmetros relacionados a cores no . A tabela abaixo mostra os mais comuns.
Parâmetro | Descrição |
---|---|
col |
cor default do gráfico. Algumas funções como lines() e pie() aceitam um vetor de cores que são recicladas |
col.axis |
cor do texto (título) nos eixos |
col.lab |
cor dos rótulos dos eixos |
col.main |
cor do texto do título do gráfico |
col.sub |
cor do sub-título |
fg |
cor do primeiro plano |
bg |
cor do plano de fundo |
Podemos especificar as cores no por índice, nome, hexadecimal, RGB ou HSV. Por exemplo col = 0
, col = "white"
, col =FFFFF
, col = rgb(1,1,1)
e col = hsv(1,1,1)
são formas equivalentes de especificar a cor branca.
A função colors()
retorna o nome de todas as cores disponíveis.
colors()[1:20]
#> [1] "white" "aliceblue" "antiquewhite" "antiquewhite1"
#> [5] "antiquewhite2" "antiquewhite3" "antiquewhite4" "aquamarine"
#> [9] "aquamarine1" "aquamarine2" "aquamarine3" "aquamarine4"
#> [13] "azure" "azure1" "azure2" "azure3"
#> [17] "azure4" "beige" "bisque" "bisque1"
n <- length(colors())
op <- par(bg = "gray60")
plot(
x = onda$x1[1:n],
y = onda$y1[1:n],
type = "n",
xlab = "x",
ylab = "y",
main = "Várias cores",
sub = "Onda colorida",
col.axis = "green",
col.lab = "green",
col.axis = "yellow",
col.sub = "red"
)
usr <- par("usr")
rect(usr[1], usr[3], usr[2], usr[4], col = "snow", border = "black", lwd = 2)
points(
x = onda$x1[1:n],
y = onda$y1[1:n],
col = colors()[1:n],
pch = 20,
cex = (1:n) / 60 * 4
)
par(op)
Para visualizar as cores e os nomes associados a cada uma veja http://www.stat.columbia.edu/~tzheng/files/Rcolor.pdf.
O também possui diversas funções para criar vetores de cores contínuas (paletas):
# lista com vetor de diferentes paletas de cores
paletas <- list(
rainbow(n),
heat.colors(n),
terrain.colors(n),
topo.colors(n),
cm.colors(n)
)
for (ipal in seq_along(paletas)) {
plot(
x = onda$x1[1:n],
y = onda$y1[1:n],
type = "p",
xlab = "x",
ylab = "y",
main = "Várias cores",
sub = "Onda colorida",
col = paletas[[ipal]], # função para paleta arco-íris
pch = 20,
cex = (1:n) / 60 * 4
)
}
11.5.3 Características de texto
Parâmetros especificando tamanho do texto.
Parâmetro | Descrição |
---|---|
cex | nº indicando a quantidade pela qual o texto plotado deve ser escalonado em relação ao default (=1). |
cex.axis | magnificação do texto dos eixos (títulos). |
cex.lab | magnificação dos rótulos em relação ao cex. |
cex.main | magnificação dos títulos em relação ao cex. |
cex.sub | cor do sub-título |
Parâmetros especificando família, tamanho e estilo da fonte.
Parâmetro | Descrição |
---|---|
font | inteiro especificando a fonte a ser usada. 1 = normal, 2 = negrito, 3 = itálico, 4 = negrito e itálico, 5 = símbolo (adobe) |
font.axis | fonte para o texto do eixo |
font.lab | fonte para o rótulo do eixo |
font.main | fonte para o título |
font.sub | fonte para o sub-título |
ps | tamanho do ponto da fonte (ps = 1/72 *cex) |
family |
op <- par(font.lab = 3, cex.lab = 2, font.main = 4, cex.main = 2)
plot(x = onda$x1[1:n],
y = onda$y1[1:n],
type = "p",
xlab = "x",
ylab = "y",
main = "Várias cores",
sub = "Onda colorida",
col = gray.colors(n),
pch = 20,
cex = (1:n)/60 * 4)
par(op)
11.5.3.1 Tipos de Gráficos
Até aqui já vimos como criar gráficos de dispersão com a função plot()
. Mas existe uma ampla variedade de gráficos, além daqueles: gráficos de barra, boxplots, histogramas, gráficos de pizza, gráficos de imagens, gráficos 3D. Alguns exemplos são mostrados a seguir.
A seguir podemos ver como construir um gráfico da amplitude térmica diária (ATD) de cada EMA. As EMAs serão apresentadas em ordem crescente de ATD.
# ordenando amplitudes térmicas
atd_ord <- sort(sulbr_md$dtr_med)
# vetor do nome das EMAS ordenados
nms_ema <- sulbr_md$site[order(sulbr_md$dtr_med)]
#filter(sulbr_md, site %in% c("A866", "A874"))
# gráfico de barras
barplot(
height = atd_ord,
names.arg = nms_ema,
col = 1, # cor das barras
border = "red", # cor das bordas das barras
las = 2, # orientação dos labels dos eixos
cex.names = 0.75, # tamnho relativo labels eixo x
cex.axis = 0.75, # tamnho relativo labels eixo y
xlab = "EMA", # label do eixo x
ylab = "Amplitude térmica (°C)" # labels do eixo y
)
box()
Para ilustrar um histograma usaremos os dados de temperatura horária de Santa Maria.
# dados de temp de SM
th_sm <- filter(sulbr_dh, site == "A803") %>%
pull(tair)
hist(x = th_sm)
O número de classes para discretização dos dados pode ser especificado no parâmetro breaks
.
hist(x = th_sm, breaks = 10)
Usando a interface de fórmula podemos fazer facilmente um boxplot da temperatura do ar horária de Santa Maria-RS, para cada mês.
boxplot(tair ~ month(date),
data = filter(sulbr_dh, site == "A803")
)
Funções matemáticas podem ser visualizadas com a função curve()
.
# Curvas
curve(x ^ 3 - 5 * x, from = -4, to = 4)
# plot de uma função criada
fun_curvilinea <- function(xvar) {
1 / (1 + exp(-xvar + 10))
}
curve(fun_curvilinea(x), from = 0, to = 20)
# Add a line:
curve(1 - fun_curvilinea(x), add = TRUE, col = "red")
Para mostrar como fazer um gráfico do tipo imagem, vamos criar uma matriz com temperatura média mensal horária em que as linhas são os meses e as colunas as horas.
tar_mes_hora <- sulbr_dh %>%
group_by(mes = month(date), hora = hour(date)) %>%
summarise(tmed = mean(tair, na.rm = TRUE)) %>%
ungroup() %>%
pivot_wider(names_from = "hora",
values_from = "tmed")
#View(tar_mes_hora)
tar_mat <- as.matrix(tar_mes_hora[, -1])
dim(tar_mat)
#> [1] 12 24
x <- 1:nrow(tar_mat)
y <- 1:ncol(tar_mat) - 1
image(
x, # eixo x
y, # eixo y
z = tar_mat, # matriz de dados
col = topo.colors(n = 32), # paleta de cores
axes = FALSE,
xlab = "mês",
ylab = "hora"
)
# intervalo de variação
int_var <- range(tar_mat)
limites <- c(trunc(int_var[1]), ceiling(int_var[2]))
contour(
x,
y,
tar_mat,
levels = seq(limites[1], limites[2], by = 3),
add = TRUE,
col = "peru"
)
axis(1, at = x)
axis(2, at = y[c(TRUE, FALSE)])
box()
title(
main = "Variação sazonal horária da Tar \n no Sul do Brasil",
cex.main = 0.9
)
11.5.3.2 Telas gráficas
A executar a função plot()
o RStudio automaticamente abre uma tela gráfica e plota o gráfico. Para remover o gráfico gerado é executar dev.off()
.
plot(y1)
# fechar a tela gráfica
dev.off()
Eventualmente você pode exibir um gráfico fora do painel de gráficos do RStudio. Para isso antes de gerar o gráfico, rode a função x11()
ou dev.new()
.
x11()
plot(y1)
Seu gráfico aparecerá em uma janela gráfica fora do ambiente do RStudio. Você abrir mais janelas gráficas repetindo a expressão x11()
(dev.new()
). Abaixo nós abriremos uma janela para fazer outro plot.
x11()
plot(y1^2)
Você poderia fechar um gráfico de cada vez digitando dev.off()
, mas se houver muitos gráficos você tem a opção de usar a função graphics.off()
. Ela fechará todas as telas gráficas abertas, inclusive as qu estiverem no painel de gráficos do RStudio.
graphics.off()
O Rstudio permite que você visualize um gráfico com mais detalhe e ajustando a janela de acordo com sua preferência através do botão zoom no painel de gráficos.
11.5.3.3 Salvando gráficos
O pode exportar um gráfico para diferentes saídas gráficas (png, pdf, ps, jpeg e etc). Uma lista completa das opções disponíveis está disponível em ?device
.
plot(y1)
Vamos usar o exemplo do gráfico com diferentes paleta de cores para demonstrar como salvar vários gráficos em um único arquivo pdf.
## fechando qualquer tela gráfica aberta
graphics.off()
## abrindo saída gráfica
arquivo <- file.path(tempdir(), "5plots-1arquivo.pdf")
pdf(
file = arquivo,
onefile = TRUE,
width = 7,
height = 4
)
for (ipal in seq_along(paletas)) {
plot(
x = onda$x1[1:n],
y = onda$y1[1:n],
type = "p",
xlab = "x",
ylab = "y",
main = "Várias cores",
sub = "Onda colorida",
col = paletas[[ipal]], # função para paleta arco-íris
pch = 20,
cex = (1:n) / 60 * 4
)
}
dev.off()
Você pode abrir o arquivo salvo digitando file.show(arquivo)
.
Para salvar cada gráfico em um arquivo separado a chamada da função pdf()
precisa ser feita antes de cada gráfico e dentro do laço do for()
.
## fechando qualquer tela gráfica aberta
graphics.off()
## looping em cada coluna da matriz mat
for (ipal in seq_along(paletas)) {
## mostra tela o índice do looping em execução
cat(ipal, "\n")
## criando nome do arquivo
arquivo <- file.path(
tempdir(),
paste0("plot", ipal, "_arquivo", ipal, ".pdf")
)
## abrindo saída gráfica
pdf(file = arquivo, width = 7, height = 4)
# plot da variável de cada coluna da matriz
plot(
x = onda$x1[1:n],
y = onda$y1[1:n],
type = "p",
xlab = "x",
ylab = "y",
main = "Várias cores",
sub = "Onda colorida",
col = paletas[[ipal]], # função para paleta arco-íris
pch = 20,
cex = (1:n) / 60 * 4
)
## fechando pdf
dev.off()
}
#file.show(arquivo)
11.5.4 Plotando vários gráficos em uma mesma página
par(mfrow = c(2, 3), las =1, cex.lab = 1.2, cex.axis = 1.2)
with(sulbr_md, {
plot(x = seq_along(site),
y = period,
type = "o",
xlab = "#site",
ylab = "Período (anos)"
) # linha e ponto conectados
plot(x = seq_along(site),
y = missing,
type = "h",
xlab = "#site",
ylab = "Dados faltantes (%)"
) # linha
plot(x = period,
y = long_gap/24,
log = "y",
type = "p",
pch = 9,
ylab = "Log. Tamanho da falha (dias)",
xlab = "Período de dados") # linha e ponto desconectados
plot(x = sdate,
y = dtr_med,
col = recode(state, RS = "green", SC = "blue", PR = "red"),
cex = 1.2,
pch = recode(state, RS = 20, SC = 6, PR = 3),
xlab = "#site"
)
hist(max_tair,
xlab = "Tmax absoluta (°C)",
border = "black",
col = "salmon",
ylab = "Frequência"
) # linha e ponto
box()
plot(1:10,
1:10,
type = "n",
frame = F,
axes = F,
xlab = "",
ylab = "")
text(5, 5, "5 gráficos \n em uma \n página", cex = 3)
})
#par()
11.5.5 Gráfico com 2 eixos
plot(
x = aq$date,
y = aq$Ozone,
type = "l",
lwd = 2,
ylab = "",
xlab = "Data"
)
par(new = T)
plot(
x = aq$date,
y = aq$Temp,
type = "l",
col = 2,
lwd = 2,
axes = FALSE,
ylab = "",
xlab = ""
)
# eixo secundário
axis(
side = 4,
col = 2,
col.axis = 2
)
# anotação das variáveis
mtext(
text = "Ozônio",
line = -2,
adj = 0.2
)
mtext(
text = "Temperatura",
col = 2,
line = -1,
adj = 0.2
)
11.5.6 Adicionando legenda
plot(
rain$Tokyo,
type = "l",
col = "red",
ylim = c(0, 300),
main = "Chuva mensal em grandes cidades",
xlab = "Mês do ano",
ylab = "Chuva (mm)",
lwd = 2
)
lines(
rain$NewYork,
type = "l",
col = "blue",
lwd = 2
)
lines(
rain$London,
type = "l",
col = "green",
lwd = 2
)
lines(
rain$Berlin,
type = "l",
col = "orange",
lwd = 2
)
## legenda
legend(
"topright",
legend = c("Tokyo", "NewYork", "London", "Berlin"),
col = c("red", "blue", "green", "orange"),
lty = 1,
lwd = 2,
bty = "n"
)