10  Gráficos

Data de Publicação

14 de abril de 2025

Neste tutorial apresentam-se conceitos introdutórios sobre a elaboração de gráficos no R. Estes conceitos serão depois aplicados em situações específicas ao longo de outros tutoriais.

10.1 A função plot()

A função plot() é uma função genérica para representar graficamente o objeto que é passado à função. O tipo de gráfico criado depende da natureza do objeto fornecido à função, sendo o processo de seleção automático.

10.1.1 Uma ou duas variáveis

Por norma são passadas à função plot() um (x) ou dois (x e y) vetores com os dados a serem representados. O tipo de gráfico produzido depende da natureza, numérica ou categórica, das variáveis especificadas. O código que se segue ilustra as várias possibilidades estando os gráficos resultantes na Figura 10.1. A descrição das variáveis pode ser obtida executando ?mtcars na consola do R.

1plot(mtcars$mpg)
2plot(mtcars$mpg, mtcars$disp)
3plot(mtcars$am)
4plot(factor(mtcars$am))
5plot(factor(mtcars$am), factor(mtcars$vs))
6plot(factor(mtcars$am), mtcars$mpg)
1
Figura 10.1 (a): quando a variável passada à função é numérica, é produzido um diagrama de dispersão com o índice da observação no eixo horizontal.
2
Figura 10.1 (b): no caso de serem passadas duas variáveis numéricas é produzido um diagrama de dispersão de y em função de x. Esta é a utilização mais frequente da função plot().
3
Figura 10.1 (c): como não foi indicado ao R que a variável am é nominal e foram utilizados os valores 0 e 1 para codificar a informação, o resultado é um diagrama de dispersão semelhante ao primeiro caso.
4
Figura 10.1 (d): neste caso, indicou-se ao R que a variável am é de natureza nominal utilizando a função factor() apresentada na Secção 9.7. De forma sensata, o gráfico apresentado é um diagrama de barras mostrando a contagem de observações em cada categoria.
5
Figura 10.1 (e): No caso de ambas as variáveis serem categóricas é produzido um gráfico de barras sobrepostas normalizadas. A largura das barras é proporcional às contagens da variável x.
6
Figura 10.1 (f): quando se passa à função plot() uma variável categórica e uma numérica (nesta ordem) o gráfico produzido é um diagrama de extremos e quartis para cada nível da variável categórica.
(a) Uma variável numérica
(b) Duas variáveis numéricas
(c) Uma variável categórica codificada como numérica
(d) Uma variável categórica codificada corretamente
(e) Duas variáveis categóricas
(f) Uma variável categórica e uma variável numérica
Figura 10.1: Resultado de plot() conforme o tipo de variáveis
Nota

Para já, vamos ignorar as questões estéticas. Sem parametrização adicional, os gráficos do R são bastante simples, apenas com os elementos essenciais. Voltar-se-à a este tópico noutras secções.

10.1.2 Data frames

Para especificar as variáveis a representar, não é obrigatório utilizar vetores. Em alternativa pode passar-se à função plot(), como argumento x, uma data frame com duas variáveis uma uma matriz com duas colunas. Por exemplo, considere-se o conjunto de dados cars e invoque-se a função plot(). O resultado é o da Figura 10.2.

plot(cars)
Figura 10.2: Resultado de plot(cars)

Neste caso, como o objeto cars é uma data frame com duas variáveis, speed (velocidade) e dist (distância de paragem), a função devolve um diagrama de dispersão com a primeira variável no eixo horizontal e a segunda no eixo vertical.

Caso houvesse mais de duas variáveis, como no conjunto de dados trees, seria apresentado um gráfico semelhante ao da Figura 10.3, em que é apresentado um diagrama de dispersão para cada combinação de duas de variáveis, escolhidas entre as variáveis presentes na data frame, podendo este gráfico ser também obtido com a função pairs().

plot(trees)
Figura 10.3: Resultado de plot(trees)

10.1.3 Outros objetos

Para uso em aplicações mais avançadas, a função plot() está definida para outro tipo de objetos, como séries cronológicas e números complexos, e tem inúmeras potencialidades. Nesta secção pretendeu-se apenas dar uma ideia da flexibilidade da função.

10.1.4 Outras representações

Por omissão, a função plot() representa diagramas de dispersão utilizando pontos. É possível obter outro tipo de representações através do argumento type =. Na Figura 10.4 ilustram-se os vários tipos de representações disponíveis.

plot(mtcars$mpg)
plot(mtcars$mpg, type = "l")
plot(mtcars$mpg, type = "b")
plot(mtcars$mpg, type = "o")
plot(mtcars$mpg, type = "h")
plot(mtcars$mpg, type = "s")
plot(mtcars$mpg, type = "S")
plot(mtcars$mpg, type = "n")
(a) Pontos, type = "p" (por omissão)
(b) Linhas, type = "l"
(c) Pontos e linhas, type = "b"
(d) Pontos e linhas, type = "o"
(e) Densidade, type = "h"
(f) Escada, type = "s" (ponto no topo)
(g) Escada, type = "S" (ponto no fundo)
(h) Nada, type = "n" (apenas estabelece os eixos)
Figura 10.4: Diferentes tipos de representação disponíveis em plot()

10.2 Outras funções (alto nível)

A função plot() é designada por função gráfica de alto nível, pois produz um gráfico completo. Para além de plot(), existem outras funções de alto nível que produzem outros tipos de gráficos. Algumas destas funções são automaticamente invocadas pela função plot() quando as variáveis fornecidas à função são de determinado tipo. Enumeram-se abaixo as funções de utilização mais comum:

  • plot(): normalmente utilizada para produzir diagramas de dispersão (Secção 5.3.1), mas trata-se de uma função genérica que produz outros tipos de visualizações e representações adequadas para vários tipos de objetos conforme discutido em acima.

  • hist(): função específica para produzir histogramas (Secção 4.2.2).

  • boxplot(): função específica para diagramas de extremos e quartis (Secção 4.3.2).

  • barplot(): função específica para elaborar gráficos de barras (Secção 3.2).

  • mosaicplot(): função específica para o gráfico em mosaico (Secção 5.1.2).

  • stripchart(): função para produzir diagramas de pontos (como por exemplo a Figura 4.7, úteis para visualizar pequenos conjuntos de dados.

  • pie(): função para elaborar gráficos circulares] (Secção 3.2).

Nas secções que se seguem será discutida a utilização de alguns parâmetros comuns a todas as funções enumeradas acima. Noutros tutoriais será abordada a utilização de cada função específica mencionada acima.

10.3 A função par()

A função par() serve para estabelecer de forma permanente ou consultar o valor de parâmetros a utilizar nos gráficos. Alguns parâmetros gráficos só podem ser modificados através de uma chamada a par() mas, na grande maioria, pode ser ajustados nas funções gráficas, tal como em plot().

Por exemplo, bty é um parâmetro gráfico que controla a aparência da caixa que envolve os gráficos (bty = "l" especifica uma caixa em forma de “L”) e ann = FALSE suprime os rótulos dos eixos. Estes parâmetros podem ser especificados numa chamada a par() ou podem ser especificados na chamada a uma função gráfica de alto nível, tal como plot(). Atente no exemplo no código que se segue e que produz a Figura 10.5.

par(bty = "l", ann = FALSE)
  
plot(cars$speed, cars$dist, ann = TRUE)
plot(cars$speed, cars$dist)
(a) O ajuste ann = TRUE afeta apenas este gráfico
(b) A chamada a par() afeta todos os gráficos
Figura 10.5: Ajuste de parâmetros com par()

Note que o ajuste realizados em par() afetam ambos os gráficos da Figura 10.5. No entanto, na Figura 10.5 (a) um dos parâmetros, ann, foi redefinido, afetando apenas essa figura.

Importante

Quando o parâmetro é especificado na chamada a plot() (ou outra função gráfica de alto nível) apenas afeta o gráfico que está a ser gerado. Por outro lado, se o parâmetro for estabelecido numa chamada a par() o valor definido será utilizado em todos os gráficos subsequentes.

A função par() permite consultar o valor dos parâmetros, devolvendo uma lista de valores. Uma utilização frequente desta possibilidade é poder fazer alterações nos parâmetros para um gráfico específico e depois recuperar os valores por omissão. No código que se segue exemplifica-se essa possibilidade.

1p <- par(bty = "l", ann = FALSE)
2# ...
3par(p)
1
Chamada a par(), guardando os valores prévios dos parâmetros modificados no objeto p.
2
Código para elaborar os gráficos desejados.
3
No final, restaura os valores dos parâmetros modificados.

Há inúmeros parâmetros que podem ser modificados e que não serão referidos neste tutorial. Recomenda-se a leitura da documentação, por exemplo, executando ?par na consola do R.

10.4 Títulos e rótulos

Em geral, em todas as funções que produzem gráficos, tal como a função plot(), é necessário ajustar os títulos e os rótulos dos eixos, pois os valores por omissão do R podem não ser adequados. A forma de o fazer é comum às diversas funções que produzem gráficos.

Para alterar os títulos e os rótulos dos eixos utilizam-se os argumentos descritos na Tabela 10.1 na chamada da função gráfica.

Tabela 10.1: Configuração de títulos e rótulos
Argumento Elemento
main = Título principal (no topo do gráfico)
sub = Título secundário (ao fundo do gráfico)
xlab = Rótulo do eixo horizontal
ylab = Rótulo do eixo vertical
ann = false Suprime títulos e rótulos

O código que se segue ilustra a utilização deste argumentos para configuração do gráfico apresentado na Figura 10.2, que se apresenta novamente na Figura 10.6.

plot(
  cars$speed, cars$dist,
  main = "Distância de paragem vs. velocidade",
  sub = "(elaborado a partir do conjunto cars)",
  xlab = "Velocidade",
  ylab = "Distância de paragem"
)
Figura 10.6: Configuração de títulos e rótulos

10.5 Eixos, escalas e caixa

Salvo indicação em contrário, os gráficos abrangem o intervalo de valores das variáveis fornecidas adicionada de uma pequena margem e o número e posição das marcas da escala são determinadas automaticamente de forma a serem valores redondos. Os argumentos da Tabela 10.2 permitem modificar a forma como os eixos são desenhados.

Tabela 10.2: Configuração dos eixos e escalas
Argumento Elemento
axes = false Suprime a apresentação dos eixos e da caixa envolvente
bty = "n" ou
frame.plot = FALSE
Supressão da caixa envolvente. Também se pode especificar um tipo de caixa envolvente diferente através de bty: "o" (por omissão), "l", "7", "c", "u" ou "]", sendo que a caixa imitará a letra maiúscula correspondente
xaxt = "n" Suprime a apresentação do eixo horizontal (vertical para yaxt)
xlim = c(x1, x2) Define os limites do eixo horizontal (vertical para ylim) sendo x1 e x2 os limites inferior e superior, respetivamente
xaxp = c(x1, x2, n) Define a posição das marcas no eixo horizontal (vertical para yaxp), sendo x1 e x2 as coordenadas da primeira e última marcas e n o número de intervalos desejado1
las = Especifica como a escala deve ser apresentada podendo tomar os valores 0 (paralela aos eixos), 1 (na horizontal), 2 (perpendicular aos eixos) ou 3 (na vertical)
xlog = true Para utilizar uma escala logarítmica no eixo horizontal (vertical para ylog). Alternativamente é possível especificar log = "x", log = "y" ou log = "xy" para indicar o(s) eixo(s) que devem ter escala logarítmica
asp = Configura o rácio entre as escalas horizontal e vertical. Por exemplo, para representar um círculo é necessário asp = 1 para evitar que este fique com um aspeto ovalizado

O código que se segue produz os gráficos da Figura 10.7 onde se podem verificar os efeitos dos ajustes nos vários parâmetros.

1plot(cars$speed, cars$dist, axes = FALSE)
2plot(cars$speed, cars$dist, xaxt = "n", yaxt = "n")
3plot(
  cars$speed, cars$dist,                    
  xlim = c(-5, 30),                                         
  yaxp = c(20, 100, 5),
  bty = "u"
)
4plot(cars$speed, cars$dist, log = "y", frame.plot = FALSE, las = 1)
1
Figura 10.7 (a): o argumento axes = FALSE suprime os eixos e a caixa envolvente.
2
Figura 10.7 (b): os eixos podem ser suprimidos individualmente com xaxt = "n" e yaxt = "n".
3
Figura 10.7 (c): especificaram-se os limites do eixo horizontal com xlim, as marcas do eixo vertical com yaxp e uma caixa envolvente aberta com bty = "u".
4
Figura 10.7 (d): o eixo vertical é logarítmica com log = "y", ambas as escalas são apresentadas na horizontal com las = 1 e foi omitida a caixa envolvente com frame.plot = FALSE.
(a) Supressão dos eixos e caixa
(b) Supressão dos eixos
(c) Ajuste das escalas e caixa
(d) Escala vertical logarítmica
Figura 10.7: Exemplos de ajustes nos eixos e escalas
Nota

Os parâmetros utilizados nos gráficos apresentados neste tutorial podem não fazer grande sentido prático. De facto, apenas se está a explorar as potencialidades na parametrização dos gráficos do R.

10.6 Pontos

O símbolo que representa cada ponto é determinado pelos parâmetros gráficos pch (símbolo), cex (tamanho) e col (cor). Os valores destes parâmetros podem ser fornecidos como um valor único, afetando todos os pontos, ou como um vetor de valores, afetando cada ponto individualmente e sendo reciclado como necessário (para relembrar a regra da reciclagem do R, ver a Secção 9.1.8).

10.6.1 Símbolo (pch)

Geralmente, para especificar o símbolo a utilizar, utiliza-se um número inteiro entre 0 e 25, que corresponde a um dos símbolos definidos no R. Por omissão o símbolo utilizado é o 1 (círculo). Para consultar a lista de símbolos pode executar ?pch na consola. Na Figura 10.8 apresentam-se dois exemplos da utilização do parâmetro pch.

plot(cars$speed, cars$dist, pch = 17)
plot(cars$speed, cars$dist, pch = 1:4)
(a) Apenas um símbolo para os pontos todos
(b) Vetor com 4 símbolos (reciclado)
Figura 10.8: Especificação do parâmetro pch

Note que, na Figura 10.8 (b), o símbolo 1 é utilizado para as observações 1, 5, 9, …, o símbolo 2 para as observações 2, 6, 10, … e assim sucessivamente. Na prática, os símbolos devem ser associados a uma qualquer condição e o gráfico deve ter uma legenda (Secção 10.11).

10.6.2 Tamanho (cex)

Por omissão, o valor do parâmetro cex é 1. O tamanho do símbolo é proporcional ao valor utilizado. As regras para a utilização de vetores de tamanhos são as mesmas que para os símbolos. A Figura 10.9 mostra exemplos da utilização de cex.

plot(cars$speed, cars$dist, cex = 5.5)
plot(cars$speed, cars$dist, cex = 1:3)
(a) Apenas um tamanho para os pontos todos
(b) Vetor com 3 tamanhos (reciclado)
Figura 10.9: Especificação do parâmetro cex

10.6.3 Cores (col)

O R dispõe de várias formas para especificar as cores a utilizar nos diversos elementos gráficos (ver Secção 10.10). Para especificar a cor dos símbolos utilizam-se os parâmetros col, para o contorno dos símbolos, e bg2 para o preenchimento, nos símbolos que o permitem.

As cores podem ser identificadas por números inteiros, por códigos ou por nomes. Tal como para os parâmetros acima, podem ser fornecidos vetores de cores. O código que se segue produz a Figura 10.10 e permite ver alguns exemplos da utilização de col.

plot(cars$speed, cars$dist, col = "blue")
plot(cars$speed, cars$dist, col = 1:3)
plot(cars$speed, cars$dist, pch = 15, col = "blue", bg = "lightblue")
plot(cars$speed, cars$dist, pch = 22, col = "blue", bg = "lightblue")
(a) Apenas uma cor para os pontos todos
(b) Vetor com 3 cores (reciclado)
(c) Símbolo que não permite especificar preenchimento
(d) Símbolo que permite especificar preenchimento
Figura 10.10: Especificação dos parâmetros col e bg

Na Secção 10.10 serão abordadas com mais detalhe as diversas formas de utilização da cor nos diferentes elementos gráficos

10.7 Linhas

A aparência das linhas é controlada pelos parâmetros lty (tipo), lwd (espessura) e col (cor). Relativamente à cor das linhas, esta é especificada da mesma forma que para os pontos. Discutem-se a seguir os outros dois parâmetros.

10.7.1 Tipo (lty)

O R dispõe de um conjunto de linhas pré-definidas e permite definir outras. As linhas pré-definidas podem ser especificadas com um número entre 0 e 6, correspondendo, respetivamente aos tipos "blank", "solid", "dashed", "dotted", "dotdash", "longdash" e "twodash". Na Figura 10.11 e código precedente estão exemplos da utilização de lty.

10.7.2 Espesura (lwd)

O parâmetro lwd controla a espessura da linha e deve ser numérico. Por omissão o valor de lwd é 1. Na figura Figura 10.11 (b) encontra-se um exemplo da especificação de lwd. Note que, no caso dos segmentos, o comprimento destes também é proporcional ao valor de lwd.

plot(mtcars$mpg, type = "l", lty = "dashed")
plot(mtcars$mpg, type = "l", lty = 2, lwd = 3)
(a) Especificação de uma linha tracejada
(b) Especificação de uma linha tracejada mais espessa
Figura 10.11: Especificação do parâmetro lty

10.8 Margens

As margens das figuras, definidas como o espaço que vai desde o limite da figura até à caixa que envolve o gráfico, podem ser ajustadas através dos parâmetros mai e mar, recorrendo à função par(). As margens podem ser especificadas em polegadas (mai) ou, mais frequentemente, em linhas de texto com mar.

Em ambos os casos é necessário fornecer um vetor com 4 valores, especificando as margens inferior, esquerda, superior e direita, respetivamente. Por omissão, o R estabelece mar = c(5, 4, 4, 2) + 0.1. Note que a margem direita é mais pequena, pois, por norma, está vazia. As outras devem ser suficientes para os títulos, subtítulos, escalas e rótulos dos eixos.

As situações mais comuns em que é necessário alterar as margens são a colocação de um segundo eixo vertical ou de uma legenda do lado direito. Caso o gráfico não inclua algum dos elementos referidos acima, as margens podem ser ajustadas.

A Figura 10.12 contém exatamente o mesmo gráfico da Figura 10.2. No entanto, especificaram-se margens muito pequenas (1.5 linhas) e vários elementos gráficos foram cortados ou seriam colocados fora da área útil. Para que as área das margens seja evidente utilizou-se um fundo cinzento (bg = "gray95").

p <- par(bg = "gray95", mar = rep(1.5, 4))
plot(cars)
par(p)
Figura 10.12: Especificação das margens

10.9 Funções gráficas de baixo nível

No sistema de gráficos do R existem dois tipos de funções para colocar elementos gráficos numa figura:

  • Funções gráficas de alto nível: são capazes de produzir um gráfico completo, tal como plot() ou as funções descritas na Secção 10.2.

  • Funções gráficas de baixo nível: este conjunto de funções acrescenta elementos a um gráfico já existente, por exemplo, pontos adicionais, linhas, anotações, etc.

Algumas das funções de baixo nível mais utilizadas são:

  • points(x, y, ...): para adicionar pontos adicionais ao gráfico, sendo possível especificar símbolos, cores, etc.

  • lines(x, y, ...): para adicionar linhas a ligar as coordenadas especificadas, sendo possível especificar tipos, espessuras, cores, etc.

  • text(x, y, labels, ...): para adicionar anotações ao gráfico, especificando a posição, o texto em si, tamanho, cores, etc.

  • mtext(text): para colocar texto nas margens.

  • abline(): trata-se de uma função para acrescentar linhas retas ao gráfico. A linha pode ser especificada de várias formas: a = e b = para a ordenada na origem e o declive, v = ou h = para linhas verticais e horizontais ou um objeto resultante de um modelo de regressão, reg = a partir dos quais se possam extrair os coeficientes da reta. Naturalmente, é possível especificar cores, espessuras, etc.

  • polygon(x, y): para adicionar um polígono fechado delimitado pelas coordenadas especificadas, sendo possível especificar cores, preenchimentos, etc.

  • title(): para adicionar um título ou subtítulo ao gráfico, especificando cores, tamanhos, etc.

  • axis(side, ...): para adicionar um eixo completo num dos lados do gráfico à escolha. Normalmente é utilizado quando se especifica axis = FALSE na função plot(), para poder configurar o eixo.

  • box(): para colocar uma caixa em torno do gráfico ou da figura, podendo especificar o tipo de linha, cores, etc.

  • legend(): para adicionar uma legenda ao gráfico. Esta função será descrita com detalhe na Secção 10.11.

O código que se segue produz a animação da Figura 10.13. Naturalmente, a figura final é confusa e não tem qualquer significado, apenas serve para ilustrar as potencialidades do R.

# posição das marcas em metros
at_m <- pretty(cars$dist * 0.3048)

# alargar margem direita
p <- par(mar = rep(5, 4, 4, 4))

1plot(cars, bty = "n", xlab = "Velocidade (mph)", ylab = "Distância (ft)")
2box(lty = "dotted", col = "gray")
3axis(4, at = at_m / 0.3048, labels = at_m)
4mtext("Distância (m)", side = 4, line = 3)
5points(1:26, 1:26, col = "red", pch = 5)
6text(1:26, 1:26, letters, cex = 0.75, pos = 1)
7lines(cars[10:30, ], lty = "dotted", col = "blue")
8abline(a = 30, b = 2, col = "orange1")
9abline(h = 100, col = "orange2")
10abline(v = 10:12, col = "orange3")
11abline(lm(dist ~ speed, data = cars), col = "purple", lty = "dotted")
12polygon(c(5, 10, 12, 7), c(80, 90, 100, 110), border = "darkred", col = "pink")
13text(8, 95, "um polígono", cex = 0.75)
14title(main = "Funções de baixo nível", col.main = "darkgreen")
1
Um gráfico simples, suprimindo a caixa envolvente. Esta é a única chamada a uma função de alto nível, plot().
2
Colocação de uma caixa envolvente com box().
3
Colocação de um segundo eixo vertical com as distâncias em metros usando axis(). A posição das marcas de escala foram previamente calculadas com a função pretty().
4
Adição de um rótulo ao segundo eixo vertical com a função mtext()
5
Adição de um conjunto de pontos, alguns fora da zona visível do gráfico, com a função points().
6
Utilização da função text() para colocar texto junto aos pontos adicionados. A constante letters contém as 26 letras minúsculas.
7
Adição de linhas a ligar alguns pontos com a função lines().
8
Colocação de uma linha reta especificando a ordenada na origem e o declive, com abline().
9
Colocação de uma reta horizontal.
10
Colocação de várias retas verticais.
11
Colocação de uma linha de tendência calculada com lm().
12
Adição de um polígono arbitrário com polygon().
13
Colocação de texto sobre o polígono com text().
14
Adição de um título com title().
Figura 10.13: Funções de baixo nível
Nota

Os diversos elementos são adicionados ao gráfico na ordem em que aparecem no código e são sobrepostos, ocultando objetos anteriores na mesma posição. Deve certificar-se que especifica a ordem correta para o efeito desejado. Outra possibilidade é a utilização de cores com algum grau de transparência.

10.10 Cores

Por norma, as funções gráficas aceitam o argumento col que especifica a cor do elemento a colocar no gráfico: pontos, linhas, texto, contornos ou preenchimentos. Ao longo das secções anteriores, especificaram-se desta forma cores, para diversos elementos gráficos.

Para além de col existem mais 3 parâmetros gráficos que podem ser especificados na generalidade das funções ou numa chamada a par():

  • col.axis: cor a utilizar na escala dos eixos.
  • col.lab: cor a utilizar nos rótulos dos eixos.
  • col.main: cor a utilizar no título do gráfico.
  • col.sub: cor a utilizar no subtítulo do gráfico.

10.10.1 Especificação de cores

No R, as cores são especificadas utilizando o modelo RGB (Red, Green, Blue) em que cada cor é descrita pelo nível de cada um das cores componentes primárias. Esse nível varia entre 0 e 1, que é depois ajustado a um valor entre 0 e 255 descrito por dois símbolos hexadecimais. Desta forma é possível especificar 2553 \(\approx\) 16.6 milhões de cores diferentes.

Nota

Um símbolo hexadecimal é um dos seguintes 16 carateres: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F. No caso das cores do modelo RGB, os níveis de cada componente podem tomar os valores 00, 01, 02, …, 0F, 10, 11, …, FD, FE, FF, representando os níveis de 0 a 255.

Por exemplo, se os 3 níveis forem iguais a 0 obtém-se a cor preta ("#000000") e se forem iguais a 255, a branca ("#FFFFFF").

Adicionalmente é possível especificar o nível de transparência acrescentando mais dois símbolos hexadecimais. Tal como as componentes primárias, o nível de transparência vai desde 00 (totalmente transparente) a FF (totalmente opaco). Por exemplo, a cor "#FF0000AA" especifica a cor vermelha ("#FF0000") com algum grau de transparência.

Para obter uma cor arbitrária, por exemplo, 30% de vermelho, 40% de verde, 50% de azul e 60% opaco, poder-se-ia utilizar a função rgb().

rgb(0.3, 0.4, 0.5, 0.6)
[1] "#4D668099"

Naturalmente, seria fastidioso relembrar e escrever códigos RGB sempre que se necessitasse de utilizar cores. Por esse motivo, foram definidos uma série de nomes, já utilizados nas secções anteriores, para que se possam especificar cores de forma expedita.

Por exemplo, especificar col = "#0000FF" é o mesmo que especificar col = "blue". Um outro exemplo, col = "chocolate" é o mesmo que col = "#D2691E". Para obter a lista de nomes de cores que o R conhece pode utilizar-se a função colors(), que devolve uma lista de 657 cores.

Uma outra forma de especificar as cores a utilizar é através de um número inteiro. Nesse caso, o número identifica uma cor na paleta em uso. As cores da paleta em uso, pode ser obtidas com:

palette()
[1] "black"   "#DF536B" "#61D04F" "#2297E6" "#28E2E5" "#CD0BBC" "#F5C710"
[8] "gray62" 

Neste caso, a paleta em utilização tem 8 cores que podem ser referidas pelos inteiros de 1 a 8. A mesma função pode ser utilizada para especificar uma nova paleta. Para melhor compreender a utilização e manipulação de paletas, deve fazer ?palette.

Nota

O R tem configuradas várias paletas (pode obter a lista com palette.pals()) e, por omissão, utiliza a paleta "R4". Caso se produzam vários gráficos para utilizar num mesmo material (por exemplo, um relatório) é importante escolher uma paleta adequada de forma a obter consistência.

Para lá das paletas pré-configuradas, há várias funções e packages para construir paletas com determinadas propriedades gráficas. Há inúmeros recursos disponíveis sobre o tópico da cor caso queira aprofundar conhecimentos ou configurar paletas, por exemplo, em Color Palette Finder.

Resumindo, para selecionar uma cor, há 3 formas diferentes:

  • Pelo nome, por exemplo, col = "gray62".
  • Pelo número na paleta em uso, por exemplo, col = 8.
  • Pelo código hexadecimal, por exemplo, col = "#9E9E9E".

No caso da paleta apresentada acima, os exemplos da lista especificam exatamente a mesma cor.

10.11 Legendas

Quando um gráfico contém informação múltipla e a interpretação não é óbvia, deve colocar-se uma legenda. Embora algumas funções de alto nível permitam especificar as características da legenda, tipicamente, esta é colocada com a função legend() depois de o gráfico estar desenhado.

Para especificar uma legenda é necessário passar à função legend() os argumentos relevantes. Na Tabela 10.3 está uma lista não exaustiva dos principais argumentos da função. Para uma listagem completa pode fazer ?legend.

Tabela 10.3: Configuração de legendas
Argumento Elemento
x =, y = Coordenadas do ponto superior esquerdo da caixa que contém a legenda. Pode ser especificada uma posição relativa com x = a: "bottomright", "bottom", "bottomleft", "left", "topleft", "top", "topright", "right" e "center"
legend = Vetor com as várias entradas de texto a colocar na legenda
fill =, border = Vetor de cores a utilizar no preenchimento e no bordo da caixa de cada entrada
col = Vetor de cores a utilizar nos símbolos de cada entrada
pch =, pt.cex =, lty =, lwd = Vetores que especificam os símbolos e as linhas para cada entrada
bty = "n" Para suprimir a caixa envolvente da legenda
ncol = Especifica o número de colunas da legenda
horiz = TRUE Para especificar uma legenda na horizontal
title = Para especificar um título para a legenda
inset = Para especificar a distância da legenda às margens, quando esta é colocada de forma relativa
xpd = TRUE Para permitir que a legenda ocupe as margens da figura

Na Figura 10.14 está o resultado do código abaixo, onde são ilustradas várias técnicas para a colocação de uma legenda.

cyl <- ordered(mtcars$cyl)

plot(
  mtcars$disp, mtcars$mpg,
  xlab = "Cilindrada (polegadas cúbicas)", ylab = "Consumo (milhas por galão)",
  col = as.numeric(cyl), pch = as.numeric(cyl)
)

legend(
  "topright",
  legend = levels(cyl),
  title = "Cilindros",
  inset = 0.02,
  col = 1:3,
  pch = 1:3
)

# ----------

cl <- c("steelblue", "darkgreen", "darkred")
sz <- c(1, 1.25, 1.5)

plot(
  mtcars$disp, mtcars$mpg,
  xlab = "Cilindrada (polegadas cúbicas)", ylab = "Consumo (milhas por galão)",
  col = cl[cyl], cex = sz[cyl], pch = 19
)

legend(
  "top",
  legend = levels(cyl),
  title = "Cilindros",
  inset = 0.02,
  horiz = TRUE,
  col = cl,
  pch = 19,
  pt.cex = sz
)

# ----------

x <- 0:20

plot(x, x ^ 2, type = "o", pch = 15, col = "purple", ann = FALSE)
points(x, x * 15, type = "o", pch = 16, col = "blue", lty = "dotted")

legend(
  0, 390,
  c("Linear", "Quadrática"),
  bty = "n",
  pch = 16:15,
  col = c("blue", "purple"),
  lty = c("dotted", "solid")
)

# ----------

par(mar = c(5, 4, 4, 5))

plot(cyl, xlab = "Cilindros", col = 3:5)

legend(
  "right",
  legend = levels(cyl),
  title = "Cilindros",
  inset = -0.15,
  fill = 3:5,
  xpd = TRUE
)
(a)
(b)
(c)
(d)
Figura 10.14: Configuração de legendas

Na Figura 10.14 (a) colocou-se uma legenda em função do nível de uma variável categórica. Por simplicidade, utilizaram-se a cores 1 a 3 da paleta e os símbolos 1 a 3. Desta forma, os vetores de símbolos e de cores foram definidos com facilidade. Note-se que a variável mtcars$cyl é numérica, mas foi definida uma variável categórica, cyl. Quando se utiliza a função as.numeric() numa variável categórica obtém-se o nível como um inteiro entre 1 e o número de níveis. O código a seguir mostra as diferenças:

mtcars$cyl
 [1] 6 6 4 6 8 6 8 4 4 6 6 8 8 8 8 8 8 4 4 4 4 8 8 8 8 4 4 4 8 6 8 4
cyl
 [1] 6 6 4 6 8 6 8 4 4 6 6 8 8 8 8 8 8 4 4 4 4 8 8 8 8 4 4 4 8 6 8 4
Levels: 4 < 6 < 8
as.numeric(cyl)
 [1] 2 2 1 2 3 2 3 1 1 2 2 3 3 3 3 3 3 1 1 1 1 3 3 3 3 1 1 1 3 2 3 1

A Figura 10.14 (b) é semelhante, optou-se por variar o tamanho e a cor em função da mesma variável categórica mas definiram-se dois vetores com cores e com tamanhos a utilizar. Note-se que, sendo cyl uma variável categórica, utilizar [cyl] é equivalente a utilizar [as.numeric(cyl)]. Utilizou-se também horiz = TRUE para colocar a legenda na horizontal, resultado que poderia ser obtido com ncol = 3.

Na Figura 10.14 (c) ilustra-se como se pode representar pontos e linhas numa legenda. Neste caso, os vetores foram definidos ad hoc, uma vez que há apenas duas categorias.

Por último, na Figura 10.14 (d) a legenda (totalmente inútil) é colocada na margem. Note-se que foi necessário alargar a margem, recorrendo a par() e permitir que a legenda seja colocada na margem com xpd = TRUE. Neste caso utilizaram-se as cores 3 a 5 da paleta. O tamanho da margem e o ajuste da posição foram determinados por tentativa e erro, mas poderiam ter sido determinados programaticamente utilizando os resultados de legend(..., plot = FALSE).

10.12 Ficheiros de imagens

Embora o RStudio permita exportar os gráficos criados a partir da aba dos gráficos, ou copiar um gráfico para a área de transferência, não raras vezes, é útil criar esses ficheiros diretamente de forma programática. A forma de o fazer é utilizar os dispositivos (devices) gráficos do R.

Estão definidos vários dispositivos que permitem criar ficheiros de imagens, como por exemplo, pdf(), png(), jpeg(), bmp(), tiff(), postscript() ou svg().

O código que se segue permitiria criar um ficheiro de imagem do tipo PNG com o nome imagem.png e com um tamanho de 480 por 300 pixeis.

png("imagem.png", width = 480, height = 340)
# ...
# comandos gráficos 
# ...
dev.off()

Naturalmente, cada dispositivo permite especificar um conjunto de parâmetros relevantes para esse formato.


  1. Para eixos logarítmicos, o significado é diferente, deve consultar a documentação.↩︎

  2. Existe um parâmetro gráfico com o mesmo nome que pode ser modificado com a função par() mas que tem um significado diferente (cor de fundo do gráfico).↩︎