【问题标题】:Changing Plot Font with Cairo in R在 R 中使用 Cairo 更改绘图字体
【发布时间】:2021-12-22 06:02:14
【问题描述】:

我发现 R 的默认图的别名很差。作为解决方案,我将 Cairo 设置为图形设备,现在绘图看起来好多了。

不幸的是,使用 Cairo 产生了另一个问题,即由于某种原因,我无法应用在绘图窗口中显示图表时使用的字体(在上面的左图中,Cambria已使用,但右图未能应用此字体)。

这是我的代码:

library(readxl)
library(scales)
library(ggplot2)
library(dplyr)
library('Cairo')

windowsFonts(Cam = windowsFont("Cambria"))

dataset <- read_excel('CW Data.xlsx')
colnames(dataset)[4] <- "Broadband Subs (%)"

options(scipen = 1000)

# Scatter plot FDI~GDP with regression line
CairoWin()
ggplot(dataset, aes(x=`2019 GDP ($bn)`, y=`2019 FDI ($m)`)) + 
  geom_point(size=3, shape=1) +
  geom_smooth(method='lm',formula=y~x, se=FALSE, color='black') +
  scale_x_continuous(label = comma) + scale_y_continuous(label=comma) +
  theme(panel.background = element_rect(fill="peachpuff"), 
        plot.background = element_rect(fill="peachpuff")) +
  theme(panel.grid.major = element_line(colour = "gray72"), 
        panel.grid.minor = element_line(colour = "gray72")) + 
  theme(text = element_text(family = "Cam")) 

ggsave("FDI~GDP.png", device="png", type = "cairo") 

这是我正在使用的 Excel 数据的 OneDrive 链接

https://1drv.ms/x/s!AvGKDeEV3LOs4gNr714Ie0KbOjhO?e=bkdPvk

【问题讨论】:

  • Ryan,而不是链接到一个不稳定的驱动器数据,可能需要登录,并且将来可能不再工作,您是否愿意创建一个像 teunbrand 在他的“答案”中建议的示例“?
  • 这是我从 OneDrive 链接得到的:This item might not exist or is no longer available This item might have been deleted, expired, or you might not have permission to view it.
  • 添加了 [windows] 标签,因为在将 x11Fonts 换成 windowsFonts 调用并在下面的非回答中使用 MCVE 后,我无法在 Linux 机器上重现。我假设 Cambria 应该产生一种看起来像老式打字机输出的字体(细、衬线、等宽)。

标签: r ggplot2 fonts cairo


【解决方案1】:

我建议你看看包ragg 和systemfonts。它们使使用字体变得非常容易,并且结果比基本选项的输出要好。

首先,我建议您使用View(systemfonts::system_fonts()) 查询所有可用的字体。您可以选择此处存在的所有字体并将其用于绘图或保存绘图。

我使用内置数据集重新创建了您的情节,因为您共享的 onedrive 链接已损坏。我是这样使用 Cambria 字体的。

plot <- ggplot(dataset, aes(x = mpg, y = hp)) +
  geom_point(size = 3, shape = 1) +
  geom_smooth(
    method = 'lm',
    formula = y ~ x,
    se = FALSE,
    color = 'black'
  ) +
  scale_x_continuous(label = comma) +
  scale_y_continuous(label = comma) +
  labs(x = "2019 GDP ($bn)", y = "2019 FDI ($m)") +
  theme(
    panel.background = element_rect(fill = "peachpuff"),
    plot.background = element_rect(fill = "peachpuff")
  ) +
  theme(
    panel.grid.major = element_line(colour = "gray72"),
    panel.grid.minor = element_line(colour = "gray72")
  ) +
  theme(text = element_text(family = "Cambria")) # relevant line

我更喜欢将绘图保存在对象中并将其显式传递给保存函数。

ggsave(
  "FDI~GDP.png", 
  plot = plot, 
  device = ragg::agg_png, # this is the relevant part
  width = 1920, 
  height = 1080,
  units = "px"
) 

结果如下:

我会说它完美无缺。您还可以使用ragg 作为 RStudio 中的图形设备,以使其更加一致。看看here。

如果要将绘图输出为 PDF,可以使用showtext 将系统字体注册到所有新打开的图形设备。所以你需要做的是:

library(showtext)
showtext_auto()
ggsave(
  "FDI~GDP.pdf", 
  plot = plot,
  width = 1920, 
  height = 1080,
  units = "px"
) 

【讨论】:

  • {ragg} 包非常适合生成光栅图形 (+1),但该解决方案不适用于 PDF 或 SVG 等矢量图形。
  • 确实如此。 SVG 与 svglite 一起工作,但我没有让 PDF 工作。
  • @teunbrand 我认为只要您的字体采用 afm 格式并通过pdfFonts 注册,它们就应该正确呈现。将你的 TrueType 字体转换为 afm 并注册它们是 {extrafont} 包所做的,这对我来说似乎确实解决了这个问题。不过,我不想将其发布为答案,因为我认为您已经尝试过这个?
  • 感谢您的提示,艾伦!不,我没有尝试过这个,因为由于过去的挫折,我试图避开 {extrafont} 包。 afm 格式对我来说完全陌生,所以我对此一无所知。不过,请随时发布答案!
  • 为此还有第三个新包showtext。我更新了我的答案以显示它是如何工作的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多