Alterar fontes no ggplot2

97

Era uma vez, eu mudei minha ggplot2fonte usando o windowsFonts(Times=windowsFont("TT Times New Roman"))para alterá-la. Agora eu não consigo tirar isso disso.

Na tentativa de conjunto family=""em ggplot2 theme()que eu não consigo gerar uma mudança de fontes como eu compilar o MWE abaixo com diferentes famílias de fontes.

library(ggplot2)
library(extrafont)
loadfonts(device = "win")

a <- ggplot(mtcars, aes(x=wt, y=mpg)) + geom_point() +
        ggtitle("Fuel Efficiency of 32 Cars") +
        xlab("Weight (x1000 lb)") + ylab("Miles per Gallon") +
        theme(text=element_text(size=16, 
#       family="Comic Sans MS"))
#       family="CM Roman"))
#       family="TT Times New Roman"))
#       family="Sans"))
        family="Serif"))


print(a)
print("Graph should have refreshed")

R está retornando um aviso font family not found in Windows font database, mas havia um tutorial que eu estava seguindo (se eu conseguir encontrá-lo novamente, atualizarei o link aqui) que dizia que isso era normal e não era um problema. Além disso, de alguma forma isso funcionou em um ponto porque meu gráfico uma vez usou alguma fonte do tipo arial ou helvitica. Acho que este sempre foi um alerta presente, mesmo durante os tempos iniciais de migração.

ATUALIZAR

quando eu executo windowsFonts()minha saída é

$ serif [1] "TT Times New Roman"

$ sans [1] "TT Arial"

$ mono [1] "TT Courier New"

Mas, isso é depois que eu executei, font_import()então só posso concluir que minhas fontes não estão sendo salvas no lugar certo. O código que executou a font_import()solicitação realmente carrega as bibliotecas com:

LocalLibraryLocation <- paste0("C:\\Users\\",Sys.getenv("USERNAME"),"\\Documents","\\R\\win-library\\3.2");
    .libPaths(c(LocalLibraryLocation, .libPaths()))
EngBIRD
fonte
2
Esta é uma pergunta e resposta específicas do Windows? Alguém quer generalizar para o Linux?
smci
2
Além disso, windowsFontsdesapareceu de grDevices após 3.4.1 . O código aqui precisa ser atualizado.
smci
1
@smci: veja isso e isso . Você só precisa especificar o caminho certo no Linux
Tung

Respostas:

129

Você acabou de perder uma etapa de inicialização, eu acho.

Você pode ver quais fontes estão disponíveis com o comando windowsFonts(). Por exemplo, o meu se parece com isto quando comecei a olhar para isto:

> windowsFonts()
$serif
[1] "TT Times New Roman"

$sans
[1] "TT Arial"

$mono
[1] "TT Courier New"

Depois de instalar o pacote extraFont e rodar font_importassim (demorou cerca de 5 minutos):

library(extrafont)
font_import()
loadfonts(device = "win")

Eu tinha muitos mais disponíveis - muitos discutíveis, certamente muitos para listar aqui.

Então tentei seu código:

library(ggplot2)
library(extrafont)
loadfonts(device = "win")

a <- ggplot(mtcars, aes(x=wt, y=mpg)) + geom_point() +
  ggtitle("Fuel Efficiency of 32 Cars") +
  xlab("Weight (x1000 lb)") + ylab("Miles per Gallon") +
  theme(text=element_text(size=16,  family="Comic Sans MS"))
print(a)

produzindo isto:

insira a descrição da imagem aqui

Atualizar:

Você pode encontrar o nome de uma fonte necessária para o familyparâmetro de element_textcom o seguinte snippet de código:

> names(wf[wf=="TT Times New Roman"])
[1] "serif"

E depois:

library(ggplot2)
library(extrafont)
loadfonts(device = "win")

a <- ggplot(mtcars, aes(x=wt, y=mpg)) + geom_point() +
  ggtitle("Fuel Efficiency of 32 Cars") +
  xlab("Weight (x1000 lb)") + ylab("Miles per Gallon") +
  theme(text=element_text(size=16,  family="serif"))
print(a)

rendimentos: insira a descrição da imagem aqui

Mike Wise
fonte
Obrigado pela ajuda, a meio caminho. Posso alternar entre mono||sans(não parecem diferentes até agora) e loadFonts serif``, but not the actually name like "TT Times New Roman" , but additionally, I not sure that my foi bem-sucedido. Quando ligo fonts(), tenho uma lista de quase 300 fontes, mas meu palpite é que elas não foram instaladas no ambiente local, tornando-as acessíveis ao dispositivo Windows. Não tenho certeza se isso faz algum sentido, mas tentei fornecer uma atualização à minha pergunta original com trechos que podem ajudar. Obrigado novamente!
EngBIRD
Obrigado por essa atualização de trecho de nomes, parece muito útil, como seu exemplo de comic sem Ms produziu a aparência correta se a família é a única string que minha instalação reconhece.
EngBIRD
Sorte. Nessa fonte (e em muitas outras), o sobrenome é igual ao valor da família. Então, wf[which(wf=="Comic Sans MS")]rende$``Comic Sans MS`` [1] "Comic Sans MS"
Mike Wise
Obrigado, você sabe se é possível direcionar ou carregar as fontes de um determinado lugar? Ou seja, mesmo para instalar fontes de carregamento ou especificar as fontes? Não recebo as fontes adicionais visíveis das janelas ao repetir a chamada de exibição de resumo ...
EngBIRD
Você executou font_import e loadfonts () um após o outro?
Mike Wise
43

Outra opção é usar um showtextpacote que suporte mais tipos de fontes (TrueType, OpenType, Type 1, fontes da web, etc.) e mais dispositivos gráficos, e evita usar software externo como Ghostscript.

# install.packages('showtext', dependencies = TRUE)
library(showtext)

Importar algumas fontes do Google

# https://fonts.google.com/featured/Superfamilies
font_add_google("Montserrat", "Montserrat")
font_add_google("Roboto", "Roboto")

Carregar fonte do caminho de pesquisa atual para showtext

# Check the current search path for fonts
font_paths()    
#> [1] "C:\\Windows\\Fonts"

# List available font files in the search path
font_files()    
#>   [1] "AcadEref.ttf"                                
#>   [2] "AGENCYB.TTF"                           
#> [428] "pala.ttf"                                    
#> [429] "palab.ttf"                                   
#> [430] "palabi.ttf"                                  
#> [431] "palai.ttf"

# syntax: font_add(family = "<family_name>", regular = "/path/to/font/file")
font_add("Palatino", "pala.ttf")

font_families()
#> [1] "sans"         "serif"        "mono"         "wqy-microhei"
#> [5] "Montserrat"   "Roboto"       "Palatino"

## automatically use showtext for new devices
showtext_auto() 

Sinopse: é necessário abrir o dispositivo gráfico do Windows, pois showtextnão funciona bem com o dispositivo gráfico integrado RStudio

# https://github.com/yixuan/showtext/issues/7
# https://journal.r-project.org/archive/2015-1/qiu.pdf
# `x11()` on Linux, or `quartz()` on Mac OS
windows()

myFont1 <- "Montserrat"
myFont2 <- "Roboto"
myFont3 <- "Palatino"

library(ggplot2)

a <- ggplot(mtcars, aes(x = wt, y = mpg)) + 
  geom_point() +
  ggtitle("Fuel Efficiency of 32 Cars") +
  xlab("Weight (x1000 lb)") + ylab("Miles per Gallon") +
  theme(text = element_text(size = 16, family = myFont1)) +
  annotate("text", 4, 30, label = 'Palatino Linotype',
           family = myFont3, size = 10) +
  annotate("text", 1, 11, label = 'Roboto', hjust = 0,
           family = myFont2, size = 10) 

## On-screen device
print(a) 

## Save to PNG 
ggsave("plot_showtext.png", plot = a, 
       type = 'cairo',
       width = 6, height = 6, dpi = 150)  

## Save to PDF
ggsave("plot_showtext.pdf", plot = a, 
       device = cairo_pdf,
       width = 6, height = 6, dpi = 150)  

## turn showtext off if no longer needed
showtext_auto(FALSE) 

Edit : outra solução alternativa para usar showtextno RStudio. Execute o seguinte código no início da sessão R ( fonte )

trace(grDevices::png, exit = quote({
    showtext::showtext_begin()
}), print = FALSE)

Edição 2 : a partir da versão 0.9, showtext pode funcionar bem com o dispositivo gráfico RStudio (RStudioGD). Simplesmente chame showtext_auto()a sessão RStudio e então os gráficos serão exibidos corretamente.

Tung
fonte
1
Obrigado, estou ansioso para experimentar isso!
EngBIRD
1
obrigado mil vezes ... o pacote torna muito fácil a) verificar quais famílias de fontes você tem disponível para ggplot por font_families () - b) procurar os nomes dos arquivos de fonte por font_files () - c) adicionar o arquivo de fonte como uma família de fontes por font_add (family, font_file_name). Impressionante!!!
Agile Bean
@AgileBean: fico feliz em poder ajudar :)
Tung,
1
importante: todos vocês devem instalar o pacote XQuartz de xquartz.org primeiro, ou você obterá um erro não descritivo ao tentar carregar a biblioteca.
ivo Welch
Esta solução não funciona para mim. Ainda recebo a fonte padrão, tanto na janela quanto na janela de plotagem do Rstudio.
GreenManXY de
11

Uma resposta simples se você não quiser instalar nada novo

Para alterar todas as fontes em seu gráfico plot + theme(text=element_text(family="mono"))Onde monoestá a fonte escolhida.

Lista de opções de fonte padrão:

  • mono
  • sans
  • serifa
  • Correio
  • helvética
  • Vezes
  • Vanguarda
  • Bookman
  • Helvetica-Narrow
  • NewCenturySchoolbook
  • Palatino
  • URWGothic
  • URWBookman
  • NimbusMon
  • URWHelvetica
  • NimbusSan
  • NimbusSanCond
  • CenturySch
  • URWPalladio
  • URWTimes
  • NimbusRom

R não tem grande cobertura de fontes e, como Mike Wise aponta, R usa nomes diferentes para fontes comuns.

Esta página apresenta as fontes padrão em detalhes.

DA Wells
fonte
4

Atrasado para a festa, mas isso pode ser do interesse de pessoas que desejam adicionar fontes personalizadas ggplotsem um shinyaplicativo no Brightapps.io.

Você pode:

  1. Fonte personalizada lugar no wwwdiretório: por exemplo, IndieFlower.ttfa partir de aqui
  2. Siga as etapas a partir daqui

Isso leva à seguinte seção superior dentro do app.Rarquivo:

dir.create('~/.fonts')
file.copy("www/IndieFlower.ttf", "~/.fonts")
system('fc-cache -f ~/.fonts')

Um exemplo completo de aplicativo pode ser encontrado aqui .

simbolismo
fonte
3

Para alterar a fonte globalmente para gráficos ggplot2.

theme_set(theme_gray(base_size = 20, base_family = 'Font Name' ))
Antex
fonte