A tipografia de um texto deve complementar a mensagem e o tom que se quer comunicar. O mesmo vale para o texto que acompanha um gráfico.

O pacote extrafont permite a importação e uso de outras fontes. A instalação do pacote é como de costume, mas, na primeira vez em que ele for carregado é preciso executar a função extrafont::font_import() para que o R importe todas as fontes disponíveis no seu computador. Depois é preciso carregar as fontes importadas usando extrafont::loadfonts()

library(extrafont)
# Só é preciso fazer isso uma única vez
extrafont::font_import()
extrafont::loadfonts()

As fontes novas são utilizadas via o argumento family. Usando as funções base do R, este argumento aparece dentro da função par (que configura vários parâmetros dos gráficos). O código abaixo mostra como trocar a fonte do gráfico. Note que todos os objetos textuais (título, legenda, etc.) são convertidos para a mesma fonte. Caso se queira fontes diferentes para estes elementos é preciso especificá-los adequadamente. Por exemplo, para trocar somente a fonte do título plot("nome", family = "nome_fonte").

plot(mpg ~ wt, data = mtcars, ylab = "Milhas por galão", xlab = "Peso (ton.)")
title("Peso x eficiência de carros")
text(labels = "exemplo de texto", x = 3, y = 30)
legend("topright", legend = "exemplo de legenda", pch = 1)

par(family = "Georgia")

Vale notar que, uma vez definida a fonte usando a função par, todos os gráficos subsequentes vão usar esta fonte. Para trocar a fonte é preciso usar a função par novamente. Além da fonte também é possível trocar a ênfase (e.g. face = c("bold", "italic")) e também o tamanho da letra (e.g. cex.axis = 1.5, cex.main = 2).

ggplot2

Também é possível trocar a fonte de gráficos feitos com outros pacotes, como o ggplot2. O exemplo abaixo monta um gráfico similar ao que foi feito acima. Modifica-se a fonte dentro da função theme. Esta função é um tanto particular, então vale a pena discorrer um pouco sobre ela. Ela é basicamente usada para modificar elementos do gráfico. Há quatro elementos principais, dos quais só nos interessa um: o element_text. São seis os principais elementos textuais que pode-se modificar:

  • axis.text - texto dos eixos (em geral, os números do eixo);
  • axis.title - nome do eixo (e.g. “Milhas por galão” no exemplo acima);
  • legend.text - texto da legenda;
  • legend.title - título da legenda;
  • plot.title - título do gráfico;
  • text - todos os acima.

Pode-se ser mais específico com o texto dos eixos usando axis.text.x e axis.text.y, por exemplo. O último dos elementos listados acima funciona como um “coringa”, ele serve para modificar de uma vez só todos os elementos textuais de um gráfico. No exemplo abaixo modifico somente o text.

library(ggplot2)
p <- 
ggplot(data = mtcars, aes(x = wt, y = mpg)) +
  geom_point() +
  stat_smooth(method = "lm", formula = y ~ poly(x, 2), se = FALSE) +
  labs(x = "Peso (ton.)",
       y = "Milhas por galão",
       title = "Eficiência e peso de carros",
       subtitle = "Regressão quadrática entre o peso de diferentes carros e sua eficiência energética")
p + theme(text = element_text(family = "Times New Roman", size = 14))

O próximo exemplo mostra como modificar alguns dos diferentes elementos do gráfico. Aproveito a variável cyl (cilindradas) para diferenciar os carros em três grupos para que o gráfico agora tenha uma legenda.

p + geom_point(aes(colour = as.factor(cyl))) +
  theme(
  axis.text = element_text(family = "Tahoma", face = "italic"),
  axis.title = element_text(family = "Georgia"),
  legend.title = element_text(family = "Bauhaus 93"),
  legend.text = element_text(family = "Verdana"),
  plot.title = element_text(family = "Algerian", size = 20)
  )

Por último, também pode ser interessante usar fontes diferentes para representar dados diferentes. Isto é possível usando o argumento family dentro do aes. Da mesma forma, seria possível também representar grupos de dados diferentes com tamanhos de fontes diferentes ou mesmo destacar algum grupo específico com itálico.

nomes = row.names(mtcars)
mtcars$cyl <- as.factor(mtcars$cyl)
ggplot(data = mtcars, aes(x = wt, y = mpg)) +
  geom_text(aes(label = nomes, family = c("Tahoma", "Bauhaus 93", "Algerian")[cyl]))

Visualizando todas as fontes

Como pode-se mapear fontes diferentes para pontos distintos de um gráfico é relativamente simples montar uma visualização com todas as fontes carregadas. A função fonts do extrafont monta um vetor (character) com o nome de todas as fontes carregadas. No meu caso, tenho 200 fontes diferentes carregadas, então monto um “grid” 20x10 em que cada ponto vai ser uma fonte.

fontes <- fonts()
length(fontes)
## [1] 200

É bastante simples fazer isto usando a função rep que repete um vetor n vezes. Note o uso do argumento each na segunda linha do código abaixo. Este argumento faz com que o vetor 1:10 seja repetido a cada 20 repetições, isto é, o primeiro número é repetido 20 vezes antes que se reptita o próximo número.

m1 <- rep(1:20, 10)
m2 <- rep(1:10, each = 20)
fontes_df <- data.frame(x = m1, y = m2, fontes = fontes, text = "abc123")
ggplot() +
  geom_text(data = fontes_df, aes(x = x, y = y, label = text, family = fontes)) +
  scale_x_continuous(breaks = 1:20) +
  scale_y_continuous(breaks = 1:20) +
  theme_classic()

Para encontrar o nome da fonte basta substituir as coordenadas no data.frame criado acima. O exemplo abaixo mostra como encontrar o nome da fonte impressa na posição (12, 6).

fontes_df[fontes_df$x == 12 & fontes_df$y == 6, ]
##      x y     fontes   text
## 112 12 6 Lucida Fax abc123

Outra forma de visualizar as fontes é plotando diretamente seus nomes. Faço um exemplo em menor escala disto abaixo.

library(stringr)
m1 = rep(1:10, 10)
m2 = rep(1:10, each = 10)
fontes = fonts()
fontes = str_trunc(fontes, 10)
fontes_df = data.frame(x = m1, y = m2, fontes = fontes[1:100])
ggplot() +
  geom_text(data = fontes_df, aes(x = x, y = y, label = fontes, family = fontes)) +
  scale_x_continuous(breaks = 1:20) +
  scale_y_continuous(breaks = 1:20) +
  theme_classic()