【问题标题】:Saving ggplot with expression and unicode in axis title with cairo使用 cairo 在轴标题中保存带有表达式和 unicode 的 ggplot
【发布时间】:2021-11-23 05:09:12
【问题描述】:

我想保存以下情节:

library(ggplot2)

myplot <- ggplot(iris) +
  geom_point(aes(x = Sepal.Width, y = Sepal.Length)) +
  ylab(expression(~delta^13*C~"[\211]"))

ggsave(myplot, 
       filename = "myplot.png", 
       type = "cairo")

但我收到以下错误:

Error in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y,  : 
  Metric information not available for this family/device

问题必须是表达式和​​ unicode 的组合,因为这两个工作:

myplot <- ggplot(iris) +
  geom_point(aes(x = Sepal.Width, y = Sepal.Length)) +
  ylab("[\211]")

myplot <- ggplot(iris) +
  geom_point(aes(x = Sepal.Width, y = Sepal.Length)) +
  ylab(expression(~delta^13*C))

我该如何解决这个问题?

编辑:我想打印“per mille”符号。显然它的 unicode 是 U2030,我错误地认为“\211”是一个 unicode,但肯定是别的东西。

编辑 2: 同时,我发现 this question 有类似的问题。在那里,一个建议是用encoding = "MacRoman" 保存情节,不幸的是这对我不起作用:

Error in png_dev(..., res = dpi, units = "in") : 
  unused argument (encoding = "MacRoman")

编辑 3:

> capabilities()["cairo"]
cairo 
 TRUE 
> sessionInfo()
R version 4.0.1 (2020-06-06)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1

Matrix products: default

locale:
[1] LC_COLLATE=German_Germany.1252  LC_CTYPE=German_Germany.1252    LC_MONETARY=German_Germany.1252 LC_NUMERIC=C                   
[5] LC_TIME=German_Germany.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] patchwork_1.1.1 ggplot2_3.3.5   dplyr_1.0.7  

【问题讨论】:

  • 你试过\u211\u0211吗?这就是我添加 unicode 符号的方式。至少在我的机器上可以正常工作。
  • @stefan 嗯,当我尝试时, [] 被打印为轴标签。知道我做错了什么吗?
  • "[\u211]" 也适合我。你用的是什么字体?
  • @RobinGertenbach 默认设置(我认为是 Arial?)。但我怀疑这是字体问题,因为它本身就可以工作,只是与expression 的组合没有。

标签: r ggplot2 cairo


【解决方案1】:

您要实际使用哪个 unicode 符号。我想这只是您指定 unicode 符号的语法错误。

试试这个代码:

myplot <- ggplot(iris) +
  geom_point(aes(x = Sepal.Width, y = Sepal.Length)) +
  ylab(expression(~delta^13*C~"\U0211"))

ggsave(myplot, 
       filename = "myplot.png", 
       type = "cairo")

这对我来说非常适合。

给出如下图:

您使用"\U0211"。所以"\U 指定你想要unicode,然后是代码。

在此处查找 unicode 符号: https://en.wikipedia.org/wiki/List_of_Unicode_characters

这是您必须输入的第一列才能获得正确的符号。 所以例如对于 U+020F 你写"\U020F"

更新

这里有一个关于你的 unicode 符号的新信息的例子

myplot <- ggplot(iris) +
  geom_point(aes(x = Sepal.Width, y = Sepal.Length)) +
  ylab(expression(~delta^13*C~"\U2030"))

 ggsave(myplot, 
           filename = "myplot.png", 
           type = "cairo")

给我这个情节:

您介意尝试上面的确切代码吗?也尝试在不保存的情况下运行 - 因为情节的保存实际上不应该是问题。

所以也尝试运行

library("ggplot2")
ggplot(iris) +
      geom_point(aes(x = Sepal.Width, y = Sepal.Length)) +
      ylab(expression(~delta^13*C~"\U2030"))

在那里,看看y轴标签是否正确显示。

如果还是不行:

也可能是,您使用的字体不包含您尝试使用的 unicode 字符。

然后将以下内容添加到您的绘图代码中:

ggplot(iris) +
  geom_point(aes(x = Sepal.Width, y = Sepal.Length)) +
  ylab(expression(~delta^13*C~"\U2030")) +
  theme(text=element_text(family="Arial Unicode MS"))

“Arial Unicode MS”实际上可以是任何可用的字体,并以您想要的形式包含 unicode 字符。

也许这些提示已经解决了问题 - 如果不只是写另一条评论,也许您还需要一些进一步的步骤。

进一步的步骤:

由于它仍然不起作用并且您提到它似乎是特定于使用 type = cairo 保存的,请尝试以下操作:

首先提供更多信息并使用以下命令检查cairo

capabilities()["cairo"]

结果应该是真的。

然后向我们发布有关您系统的一些信息

sessionInfo()

因为这些字体和绘图通常取决于您的操作系统。

然后我们 100% 确定我们有可用的字体/unicode 符号:

library(ggplot2)
install.packages("extrafont")
library("extrafont")
font_import()
loadfonts()
fonts()

对 fonts() 的调用现在应该可以输出可用的字体了。

也许您可以另外发布这些信息,我们可以为您提供进一步的步骤。

之后你可以再试一次,单独使用 extrafonts() 有时已经解决了问题:

library("ggplot2")
library("extrafont")
font_import()
loadfonts()

myplot <- ggplot(iris) +
  geom_point(aes(x = Sepal.Width, y = Sepal.Length)) +
  ylab(expression(~delta^13*C~"\U2030")) +
  theme(text=element_text(family="Arial Unicode MS"))
  
ggsave(myplot, 
       filename = "myplot.png", 
       type = "cairo")

正如我所说,capabilities()["cairo"] 必须返回 truefamily="Arial Unicode MS" 必须是 fonts() 返回的某种字体

在准备好额外字体后也值得尝试不同的 grDevice

library("extrafont")
font_import()
loadfonts()

myplot <- ggplot(iris) +
  geom_point(aes(x = Sepal.Width, y = Sepal.Length)) +
  ylab(expression(~delta^13*C~"\U2030")) +
  theme(text=element_text(family="Arial Unicode MS"))
  
ggsave(myplot, 
       filename = "myplot.png", 
       type = "cairo-png")

还有更多你可以尝试...这是一篇非常有趣的文章about saving graphics on different OS。有趣的是,根据您的操作系统和图形设备,导出的图形看起来略有不同。

只需在您的评论中阅读您想使用 Cairo 来提高质量。试试它是否适用于 ragg 而不是 Cairo - 质量可能会更好。

ragg 提供了一组高质量和高性能的栅格 设备,能够生成 png、tiff 或 ppm 文件,或 直接在 R 中的原始颜色值。

ragg 是我们提高图形性能和 堆栈所有级别的 R 质量

library(ragg)

myplot <- ggplot(iris) +
  geom_point(aes(x = Sepal.Width, y = Sepal.Length)) +
  ylab(expression(~delta^13*C~"\U2030")) +
  theme(text=element_text(family="Arial Unicode MS"))

ggsave(
       filename = "myplot3.png",
       myplot,
       device = ragg::agg_png( 
         width = 3000,
         height = 3000, 
         units = "px",
         res = 500)
)

由于您现在对expression 仍有一些问题,您也可以将其与ggtext 结合使用。那么就不需要expression了。

myplot <- ggplot(iris) +
  geom_point(aes(x = Sepal.Width, y = Sepal.Length)) +
  ylab("\U03B4<sup>13</sup>C\U2030") +
  theme(
    axis.title.y = element_markdown(size = 11, lineheight = 1.2)
  )

ggsave(
       filename = "myplot4.png",
       myplot,
       device = ragg::agg_png( 
         width = 3000,
         height = 3000, 
         units = "px",
         res = 500)
)

使用包ggtext 基本上可以让您使用轴标题(粗体、多种颜色、不同尺寸……都在一个标签中)做各种事情。另请参阅ggtext 手册。

【讨论】:

  • 目前很难说,试试答案中更新的代码示例,也许我们之后会知道更多:)
  • 谢谢,但我能够从一开始就很好地显示情节。仅当我尝试将其保存为type = cairo 时才会发生该错误。没有 type = cairo 的保存工作。所以问题一定是那个特定符号和type = cairo的组合,我猜。不幸的是,更改字体并不能解决这个问题。
  • 你能提供我答案底部提到的输出吗?更容易在正确的方向上提供帮助。 (sessionInfo()、capabilities()["cairo"] 和 fonts())
  • 我已将前两个的输出添加到我的问题中。 font_import() 对我不起作用:Scanning ttf files in C:\Windows\Fonts ... Extracting .afm files from .ttf files... C:\Windows\Fonts\AGENCYB.TTF : No FontName. Skipping. .. 所有字体都一样..
  • 使用此解决方法(希望)解决此问题,然后重试:stackoverflow.com/a/68642855/6332958
【解决方案2】:

某些 unicode 仅适用于某些字体。 Here is a list of fonts that work with unicode u2030.

emojifont 包可以更轻松地使用某些 unicode,通过呈现您需要的字体/系列来保存文件。这样,您就不必寻找正确的字体并将其安装在您的操作系统中。

library(ggplot2)
install.packages('emojifont')
library(emojifont)



myplot <- ggplot(iris) +
  geom_point(aes(x = Sepal.Width, y = Sepal.Length)) +
  ylab(expression(~delta^13*C~"[\u2030]"))


myplot

ggsave(my_plot, 
       filename = "myplot.png", 
       type = "cairo")

它也适用于\u211

【讨论】:

    猜你喜欢
    • 2017-03-24
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 2010-09-28
    • 2013-12-12
    • 2017-02-03
    • 2016-10-12
    相关资源
    最近更新 更多