【问题标题】:Save unicode characters to .pdf in R在 R 中将 unicode 字符保存为 .pdf
【发布时间】:2020-10-31 09:21:06
【问题描述】:

我想用ggsave将特定的unicode字符保存到pdf文件中。

示例代码

library(ggplot2)

ggplot() +
  geom_point(data = data.frame(x=1, y=1), aes(x,y), shape = "\u2191") +
  geom_point(data = data.frame(x=2, y=2), aes(x,y), shape = "\u2020")

ggsave("test.pdf", plot = last_plot()), width = 40, height = 40, units = "mm")

但是,当保存.pdf 时,unicode 字符会转换为三个点...

尝试修复它

  1. 我尝试在ggsave 中使用cairo_pdf 设备-> 无效。
  2. 用这个post来绘制unicode字符,但是不太明白...

问题

如何在 pdf 中同时使用两个 unicode 字符?

> sessionInfo()
R version 3.6.2
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS Catalina 10.15.5

【问题讨论】:

  • 我讨厌成为坏消息的承担者,但不幸的是这个问题没有合适的解决方案。原则上,您可以使用pdf.options 设置不同的编码,但支持的编码取决于平台(请参阅dir(system.file('enc', package = 'grDevices'))),我在 macOS 上找不到支持这两种符号的任何编码。您可以编写一个 custom 编码文件。我不推荐它。

标签: r ggplot2 unicode


【解决方案1】:

这似乎适用于我的 Mac:

library(tidyverse)

quartz(type = 'pdf', file = 'test.pdf')

ggplot() +
    geom_point(data = data.frame(x=1, y=1), aes(x,y), shape = "\u2191") +
    geom_point(data = data.frame(x=2, y=2), aes(x,y), shape = "\u2020")

使用这里的建议:https://stackoverflow.com/a/44548861/1827

【讨论】:

    【解决方案2】:

    使用带有 unicode 字符和 pdf 的 ggsave() 有点棘手。尝试明确发布到设备。当我使用pdf() 时它对我不起作用,但使用cairo_pdf() 有效。

    p <- ggplot() +
      geom_point(data = data.frame(x=1, y=1), aes(x,y), shape = "\u2191", size=4) +
      geom_point(data = data.frame(x=2, y=2), aes(x,y), shape = "\u2020", size=4)
    

    然后比较这些:

    # using pdf() gives me warnings and does not work
    pdf('test.pdf')
    print(p)
    dev.off()
    
    # using cairo_pdf() works
    pdf('test_cairo.pdf')
    print(p)
    dev.off()
    

    【讨论】:

    • 不幸的是cairo_pdf(至少在 macOS 上)给出了错误的输出。 :-( 文本渲染略微但不和谐(尤其是字距调整)。它提供了非常糟糕的输出。此外,这 not 实际上解决了开罗问题。只有两个符号中的一个被正确打印macOS。使用它而不是 ggsave(…, device = cairo_pdf) 绝对没有区别。
    【解决方案3】:

    欢迎您在这里查看我对类似问题的回答:https://stackoverflow.com/questions/12096152/plotting-symbols-fails-in-pdf/63214207?r=SearchResults&s=2|0.0000#63214207

    但这里有解决您问题的方法。

    #--- A function to install missing packages and load them all
    myfxLoadPackages = function (PACKAGES) {
      lapply(PACKAGES, FUN = function(x) {
        if (suppressWarnings(!require(x, character.only = TRUE))) {
          install.packages(x, dependencies = TRUE, repos = "https://cran.rstudio.com/")
        }
      })
      lapply(PACKAGES, FUN = function(x) library(x, character.only = TRUE))
    }
    
    packages = c("ggplot2","gridExtra","grid","png")
    myfxLoadPackages(packages)
    
    #--- The trick to get unicode characters being printed on pdf files:
    #--- 1. Create a temporary file, say "temp.png"
    #--- 2. Create the pdf file using pdf() or cairo_pdf(), say "UnicodeToPDF.pdf"
    #--- 3. Combine the use of grid.arrange (from gridExtra), rasterGrob (from grid), and readPNG (from png) to insert the
    #       temp.png file into the UnicodeToPDF.pdf file
    test.plot = ggplot() +
      geom_point(data = data.frame(x=1, y=1), aes(x,y), shape = "\u2191", size=3.5) +
      geom_point(data = data.frame(x=2, y=2), aes(x,y), shape = "\u2020", size=3.5) +
      geom_point(data = data.frame(x=1.2, y=1.2), aes(x,y), shape = -10122, size=3.5, color="#FF7F00") +
      geom_point(data = data.frame(x=1.4, y=1.4), aes(x,y), shape = -129322, size=3.5, color="#FB9A99") +
      geom_point(data = data.frame(x=1.7, y=1.7), aes(x,y), shape = -128515, size=5, color="#1F78B4")
    ggsave("temp.png", plot = test.plot, width = 80, height = 80, units = "mm")
    #--- Refer to http://xahlee.info/comp/unicode_index.html to see more unicode character integers
    
    pdf("UnicodeToPDF.pdf")
    grid.arrange(
      rasterGrob(
        readPNG(
          "temp.png",
          native=F
        )
      )
    )
    dev.off()
    
    file.remove("temp.png")
    

    已添加以下图片以跟进 Konrad Rudolph 的 cmets。

    【讨论】:

    • 这根本不等同于,也不能替代,保存为 PDF。您正在将图像光栅化为 PNG 并将其放入 PDF 中。这根本不一样(放大!),在大多数情况下,您根本不需要担心 PDF —— 只需坚持使用 PNG。
    • 你好康拉德。恕我直言,我认为需要放大的是你。如果滚动到顶部,您将看到原始问题的编写方式:“我想使用 ggsave 将特定的 unicode 字符保存到 pdf 文件中。”。这正是我所说的。享受吧!
    • 您可能正在解决这个问题的狭义阅读,但是,由于我之前的评论中解释的原因,这是(不幸的是!)一个 bad 解决方案。使用 PDF 而不是 PNG 的全部意义在于获取矢量图形;你的回答没有做到这一点。
    • 我理解您的沮丧并同意您的观点,即 pdf() 函数存在一个根本性错误。如果我的实际解决方案不符合您的需求和期望,我深表歉意。但我希望它可以帮助其他用户,同时发布一个基本且技术上合理的解决方案。
    • 嗯,我花了几分钟把两张图片并排放置,尽可能放大,我看不出有什么不同。从实际的角度来看,人眼很难看到两个图像并能够抓住任何差异并最终检测到矢量图形的缺失;因此,对于一个非常具体的可视化,所提供的解决方案是否像您认为的那样糟糕,应该留给用户来决定。很高兴您鼓励社区先进行放大,然后再进行最终决定。谢谢
    猜你喜欢
    • 2020-01-30
    • 2021-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 2018-02-10
    • 1970-01-01
    相关资源
    最近更新 更多