【问题标题】:Unicode character in R plot - pdf deviceR图中的Unicode字符 - pdf设备
【发布时间】:2019-05-08 10:01:05
【问题描述】:

我想绘制一个坐标轴标题,其中有一个thin space 作为千位分隔符,并将该图另存为 R 中的 pdf。例如,我将格式化这样的数字:

string <- "100\u2009000"
string
[1] "100 000"

这里 R 控制台显示了细空格字符“\u2009”的正确表示(虽然在网络上它看起来像一个完整的空间)然后如果我绘制这个并将它发送到这样的 pdf:

pdf("foo.pdf")
plot(1,1, axes = FALSE, xlab = "", ylab = "", col = "#FFFFFF")
text(1, 1, string)
dev.off()

我收到一堆警告:

Warning messages:
1: In text.default(1, 1, string) :
  conversion failure on '100 000' in 'mbcsToSbcs': dot substituted for <e2>
2: In text.default(1, 1, string) :
  conversion failure on '100 000' in 'mbcsToSbcs': dot substituted for <80>
3: In text.default(1, 1, string) :
  conversion failure on '100 000' in 'mbcsToSbcs': dot substituted for <89>
4: In text.default(1, 1, string) :
  font metrics unknown for Unicode character U+2009
5: In text.default(1, 1, string) :
  conversion failure on '100 000' in 'mbcsToSbcs': dot substituted for <e2>
6: In text.default(1, 1, string) :
  conversion failure on '100 000' in 'mbcsToSbcs': dot substituted for <80>
7: In text.default(1, 1, string) :
  conversion failure on '100 000' in 'mbcsToSbcs': dot substituted for <89>

在生成的 pdf 中,数字如下所示:100...000

我看到我可以为 pdf 设备提供一个编码参数,但我没有设法让它工作。

【问题讨论】:

    标签: r pdf plot unicode encoding


    【解决方案1】:

    您可以改用cairo_pdf 设备:

    string <- "100\u2009000"
    string
    
    cairo_pdf("foo.pdf")
    plot(1,1, axes = FALSE, xlab = "", ylab = "", col = "#FFFFFF")
    text(1, 1, string)
    dev.off()
    

    这对我有用并生成了 pdf。

    【讨论】:

    • 谢谢,我不知道cairo_pdf()。它也对我有用。但是,文件大小可能会增加一倍以上,因为它使用的是位图:来自 R 帮助:“请注意,与 postscript 和 pdf 不同,cairo_pdf 和 cairo_ps 有时会记录位图而不是矢量图形。另一方面,它们可以(在合适的情况下)平台)包括更广泛的 UTF-8 字形,并嵌入使用的字体。“与 pdf() 相比,我使用 cairo_pdf() 获得了不同的字体缩放。也许这是唯一的解决方案?
    • 非常奇怪的描述。在这种情况下,“有时”是什么意思?我从 cairo_pdf 获得的文件与我从 pdf() 获得的文件大小相同。它也是一个矢量图形,所以我很困惑为什么在你的情况下会有所不同。抱歉,恐怕我帮不上忙。
    • :) 是的,我同意“有时”有点含糊。这只是来自cairo_pdf() 手册的引用。这里的简单示例产生相同的文件大小,大概是因为它是如此简单。我实际处理的示例是 ggplot,然后生成位图。因此,我希望找到一个不使用 cairo_pdf() 的解决方案。
    【解决方案2】:

    您也可以使用showtext 来渲染文本,如果您使用PDF,则可以保证生成矢量图形。但是文本会转换为形状,这意味着您不能再将它们选择为文本。

    library(showtext)
    showtext_auto()
    
    string <- "100\u2009000"
    string
    
    pdf("bar.pdf")
    plot(1, 1, axes = FALSE, xlab = "", ylab = "", col = "#FFFFFF")
    text(1, 1, string, family = "wqy-microhei")
    dev.off()
    

    【讨论】:

    • 哇,这对我来说非常好用。我实际上会在我的应用程序的解决方案中使用它,因为我避免了上面讨论的与 cairo_pdf() 相关的问题。但是,我会将 cairo_pdf() 答案保留为可接受的解决方案,因为它可能是大多数用例的最佳方法。
    • 当我使用showtext-方法时,字体不同于默认的pdf() 或例如pdf(family="sans")-来电。使用showtext_auto()时,你知道如何导出标准字体吗?
    猜你喜欢
    • 1970-01-01
    • 2020-10-31
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    • 2015-11-05
    • 2017-11-16
    • 1970-01-01
    相关资源
    最近更新 更多