在 ggplot2中更改字体

很久以前,我用 windowsFonts(Times=windowsFont("TT Times New Roman"))改变了我的 ggplot2字体。现在,我不能把它从这个字体上去掉。

在尝试在 ggplot2 theme()中设置 family=""时,我似乎不能生成字体的变化,因为我使用不同的字体系列编译了下面的 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,但是有一个教程我正在遵循(如果我能再次找到它,我将更新这里的链接) ,说这是正常的,不是一个问题。而且,这在某种程度上起了作用,因为我的图表曾经使用过一些阿里字体或者 helvitica 字体。我认为这一直是一个现在的警告,即使在最初的时候迁移。

更新

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

$serif [1]“ TT Times New Roman”

$sans [1]“ TT Arial”

$mono [1]“ TT Courier New”

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

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

我想你刚刚错过了一个初始化步骤。

您可以通过命令 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)

产生这样的结果:

enter image description here

更新:

您可以通过以下代码片段找到 element_textfamily参数所需的字体名称:

> 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)

收益率: enter image description here

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

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

导入一些谷歌字体

# 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)

编辑 : 在 RStudio 中使用 showtext的另一个解决方案

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

编辑2 : 从0.9版本开始,showtext 可以很好地与 RStudio 图形设备(RStudioGD)兼容。只需在 RStudio 会话中调用 showtext_auto(),然后图就会正确显示。

对于希望在 shinyapps.io 上的 shiny应用程序中向其 ggplots添加自定义字体的人来说,这可能很有意思。

你可以:

  1. www目录中放置自定义字体: 例如 给你中的 IndieFlower.ttf
  2. 按照 给你中的步骤操作

这将导致 app.R文件内的下列上部分:

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

一个完整的例子应用程序可以找到 给你

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

改变所有字体在您的图 plot + theme(text=element_text(family="mono"))其中 mono是您选择的字体。

默认字体选项列表:

  • 单核细胞增多症
  • 没有
  • 衬线
  • 信使
  • Helvetica
  • 时代杂志
  • 先锋派
  • 书呆子
  • Helvetica-窄
  • 新世纪教科书
  • 帕拉蒂诺
  • 哥特式
  • URWBookman
  • NimbusMon
  • URWHelvetica
  • 光轮山
  • NimbusSanCond
  • CenturySch
  • URWPalladio
  • URWTimes
  • 光轮

R 没有很好的字体覆盖率,正如 Mike Wise指出的那样,R 对常用字体使用不同的名称。

这个页面 详细介绍了默认字体。

更改 ggplot2图形的全局字体。

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

我修正了 geom _ text 没有在 R 标记中应用 family = “ Roboto”命令的问题,方法是确保 Yaml 头部具有主题: null。之前它被设置为“ page”,并且只覆盖了 geom _ text 行,这很奇怪..。