更改ggplot2中的字体


91

从前,我改变了我的 ggplot2使用windowsFonts(Times=windowsFont("TT Times New Roman"))来更改字体。现在我无法摆脱它。

在尝试设置时family=""ggplot2 theme()我似乎无法生成字体更改,因为我使用不同的字体系列编译以下MWE。

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正在返回警告font family not found in Windows font database,但是我正在关注一个教程(如果可以再次找到它,我将在这里更新链接),说这是正常现象,而不是问题。另外,这在某种程度上是可行的,因为我的图形曾经使用过arial或helvitica类型的字体。我认为即使在迁移初期,这始终是当前的警告。

更新

当我运行windowsFonts()我的输出是

$ serif [1]“ TT Times New Roman”

$ sans [1]“ TT Arial”

$ mono [1]“ TT Courier新产品”

但是,这是在我运行之后,font_import()因此只能得出的结论是我的字体没有保存在正确的位置。运行font_import()请求的代码实际上将库加载:

LocalLibraryLocation <- paste0("C:\\Users\\",Sys.getenv("USERNAME"),"\\Documents","\\R\\win-library\\3.2");
    .libPaths(c(LocalLibraryLocation, .libPaths()))

2
这是Windows特定的问题和答案吗?是否有人想推广到Linux?
smci

2
另外,windowsFonts在3.4.1之后从grDevices中消失了。这里的代码需要更新。
smci

1
@smci:看这个这个。您只需要在Linux中指定正确的路径
Tung

Answers:


124

我想您只是错过了初始化步骤。

您可以使用命令查看可用的字体windowsFonts()。例如,当我开始看这个时,我的看起来像这样:

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

$sans
[1] "TT Arial"

$mono
[1] "TT Courier New"

安装完extraFont软件包并font_import像这样运行(大约花了5分钟):

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

我还有更多可用空间-可以争论的太多了,当然这里列出的太多了。

然后,我尝试了您的代码:

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)

产生这个:

在此处输入图片说明

更新:

你可以找到你所需要的字体的名称family的参数element_text用下面的代码片段:

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

然后:

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)

产量: 在此处输入图片说明


感谢您的帮助,在途中。我现在可以在之间切换(到目前为止,mono||sans这些看起来没有什么不同),并且serif``, but not the actually name like “ TT Times New Roman” , but additionally, I not sure that my loadFonts成功。当我打电话时,fonts()我列出了将近300种字体,但我猜是它们没有安装在本地环境中,因此Windows设备可以访问它们。我不确定这是否有意义,但是我尝试通过片段对我的原始问题进行更新,这可能会有所帮助。再次感谢!
EngBIRD 2015年

感谢您提供的名称片段更新,它看起来非常有帮助,如果家庭是我的装置可以识别的唯一字符串,那么您的喜剧无女士示例如何产生正确的外观。
EngBIRD 2015年

运气。在该字体(以及许多其他字体)中,姓氏与家族值相同。如此wf[which(wf=="Comic Sans MS")]收益$``Comic Sans MS`` [1] "Comic Sans MS"
Mike Wise

谢谢,您知道是否可以从特定位置定向或加载字体吗?即即使安装加载字体或指定字体?重复摘要显示调用时,我没有其他Windows可见字体...
EngBIRD 2015年

您是否紧接彼此运行font_import和loadfonts()?
Mike Wise

39

另一个选择是使用showtext支持更多字体类型(TrueType,OpenType,Type 1,Web字体等)和更多图形设备的软件包,并避免使用外部软件,例如Ghostscript。

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

导入一些Google字体

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

将字体从当前搜索路径加载到 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() 

绘图:需要打开Windows图形设备,因为showtext它不能与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) 

编辑showtext在RStudio中使用的另一种解决方法。在R会话开始时运行以下代码(

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

1
谢谢,我期待着尝试!
EngBIRD

1
谢谢你一千次。。。这个包使超级容易:a)通过font_families()验证ggplot可用的字体系列-b)通过font_files()查找字体文件名-c)添加字体文件作为字体系列,由font_add(family,font_file_name)组成。太棒了!!!
敏捷豆

@AgileBean:很高兴能为您提供帮助:)
Tung

1
重要提示:必须先从xquartz.org安装XQuartz软件包,否则在尝试加载库时会出现非描述性错误。
ivo Welch,

此解决方案不适用于我。我仍然在窗口和Rstudio的绘图窗口中都获得默认字体。
GreenManXY

9

一个简单的答案,如果您不想安装任何新东西

更改绘图plot + theme(text=element_text(family="mono"))中的所有字体mono所选字体。

默认字体选项列表:

  • 单核细胞增多症
  • 衬线
  • 信使
  • 海尔维蒂察
  • 时报
  • 前卫花园
  • 布克曼
  • Helvetica-Narrow
  • 新世纪学校
  • 帕拉蒂诺
  • 乌托邦语
  • URWBookman
  • 雨云星期一
  • 乌尔维特·赫尔维蒂察
  • 雨云
  • 雨云圣康德
  • 世纪学校
  • 乌拉尔帕迪奥
  • URW时代
  • 雨林

R的字体覆盖率不高,就像Mike Wise一样指出的那样,R对常用字体使用不同的名称。

此页面详细浏览了默认字体。


4

晚会晚了,但是对于那些希望在其ggplots内部添加自定义字体的人来说,这可能是有趣的shiny在shinyapps.io上应用程序。

您可以:

  1. 将自定义字体放在www目录中:例如,IndieFlower.ttf这里
  2. 这里开始

这导致app.R文件内的以下上部:

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

可以找到完整的示例应用程序 这里


2

全局更改ggplot2图的字体。

theme_set(theme_gray(base_size = 20, base_family = 'Font Name' ))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.