【问题标题】:Plotting symbols fails in PDF在 PDF 中绘制符号失败
【发布时间】:2012-08-19 05:39:43
【问题描述】:

我有以下代码来创建plot。在x- 和y-axes 上有symbols 出现在屏幕上,当我以该格式保存我的情节时,JPEG,但当我将情节另存为PDF 时不会。

我的\u2030 是否有替代符号可以打印在我的 PDF 中或我的问题的其他解决方案?请参阅以下正确(JPEG 格式)和错误(PDF)图的示例。

plot(c(-1,1), c(-1,1), bty = "n", type= "n", las = 1, cex.lab = 1.5, cex.axis = 1.25, main = NULL, 
ylab=expression(paste("Correlation Coefficient (r) for ", delta ^{15},"N"," \u0028","\u2030","\u0029")), 
xlab=expression(paste("Correlation Coefficient (r) for ", delta ^{13},"C"," \u0028","\u2030","\u0029")))
axis(1, at = seq(-1.0, 1.0, by = 0.1), labels = F, pos = 0, cex.axis = 0.05, tcl = 0.25)
axis(2, at = seq(-1.0, 1.0, by = 0.1), labels = F, pos = 0, cex.axis = 0.05, tcl = 0.25)

【问题讨论】:

  • 您是否尝试过其他 pdf 设备,例如 cairo_pdf?
  • 我没有发现任何对我来说似乎“不正确”的东西?
  • 我尝试了 cairo_pdf,但运行plot 命令时出现错误。
  • 一种解决方法(如果您的最终目标是包含在 LaTeX 文档中的情节......)是 tikzDevice 包(目前从 CRAN 中流放)。您是否尝试过使用symbol() 和?plotmath 一样?另见stackoverflow.com/questions/5886018/… [cairo_pdf 出现什么错误?它在类似情况下对我有用]
  • 如果使用 Mac 的人正在努力解决这个问题,将设备切换到 cairo_pdf 可以解决许多人在此处指出的问题。 cairo_pdf 和 ggplot2 似乎也正确地重现了操作系统特定的 permil 符号。即,如果您只输入“‰”而不是\u2030。

标签: r pdf plot unicode symbols


【解决方案1】:

根据您的系统是否具有所需的真正字体文件 [提示:安装 showtext 包并使用 View(font_files()] 您应该能够将可用的 unicode 字符转换为 pdf 文件

  1. 首先导出到一个临时文件,比如“temp.png”
  2. 使用 pdf() 或 cairo_pdf() 导出为 pdf 文件,例如“UnicodeToPDF.pdf”
  3. 结合使用 grid.arrange(来自 gridExtra)、rasterGrob(来自 grid)和 readPNG(来自 png)将 temp.png 文件插入到 UnicodeToPDF.pdf 文件中
  4. 删除“temp.png”文件
#--- 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("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
Corrvalues = data.frame(X=seq(-0.8,0.8,0.2),
                        Y=seq(-0.8,0.8,0.2),
                        PCH=-c(10122:10130)) #--- This is equivalent to using unicode characters 10122-10130 (note the use of -)
#--- Refer to http://xahlee.info/comp/unicode_index.html to see more unicode character integers

png("temp.png", width=11, height=11, units="in", res=300)
par(mar=c(4,5,3,1) + 0.1)
plot(c(-1,1), c(-1,1), bty = "n", type= "n", las = 1, cex.lab = 1.5, cex.axis = 1.25, main = NULL, 
     ylab=expression(paste("Correlation Coefficient (r) for ", delta ^{15},"N"," \u0028","\u2030","\u0029")), 
     xlab=expression(paste("Correlation Coefficient (r) for ", delta ^{13},"C"," \u0028","\u2030","\u0029")))
axis(1, at = seq(-1.0, 1.0, by = 0.1), labels = F, pos = 0, cex.axis = 0.05, tcl = 0.25)
axis(2, at = seq(-1.0, 1.0, by = 0.1), labels = F, pos = 0, cex.axis = 0.05, tcl = 0.25)
points(Corrvalues$X,Corrvalues$X,pch=Corrvalues$PCH,cex=2.75,col="#FF7F00")
dev.off()

pdf("UnicodeToPDF.pdf", width=11, height=11)
grid.arrange(
  rasterGrob(
    readPNG(
      "temp.png",
      native=F
    )
  )
)
dev.off()

file.remove("temp.png")

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

【讨论】:

  • 这根本不等同于,也不能替代,保存为 PDF。您正在将图像光栅化为 PNG 并将其放入 PDF 中。这根本不一样(放大!),在大多数情况下,您根本不需要担心 PDF —— 只需坚持使用 PNG。
  • 这里是原始问题的放大图:“我的 \u2030 是否有替代符号可以打印在我的 PDF 中或我的问题的其他解决方案?”如您所见,欢迎使用该问题的替代解决方案。至少在我的 Windows 系统中,当我运行我建议的代码时,我看不出保存在 temp.png 中的图像和插入到 pdf 中的图像之间有任何区别。 Unicode 字符被打印成 pdf,这是我提供的替代解决方案。请您详细说明我的解决方案可能出了什么问题,导致两张图片之间出现明显差异?
  • “请您详细说明我的解决方案可能出了什么问题,导致两张图片之间出现明显差异?” — 我的意思是你应该字面上放大图片。您会看到它是光栅化的,而不是无损缩放的矢量图形。
  • 嗯,我花了几分钟把两张图片并排放置,尽可能放大,我看不出有什么不同。从实际的角度来看,人眼很难看到两个图像并能够抓住任何差异并最终检测到矢量图形的缺失;因此,对于一个非常具体的可视化,所提供的解决方案是否像您认为的那样糟糕,应该留给用户来决定。很高兴您鼓励社区先进行放大,然后再进行最终决定。谢谢。
  • 我不相信你真的这样做了,因为the difference is blindingly, strikingly obvious。当然,这是缩放的,但您甚至可以在 未 缩放时看到差异。打印时看起来更糟。而且PNG版本也比PDF大10倍左右。增加 DPI 会进一步增加文件大小。 — 无论如何,也许这对您的用例来说不是问题,这是完全合法的。但是你不使用 PDF,你使用 PNG。但是 OP 想要 PDF,因此您的解决方案通常没有帮助。
【解决方案2】:

我在使用 MAC 以 PDF 格式保存时遇到了同样的问题。我正在使用 ggsave 和 MacRoman 进行保存。

ggsave("Name_of_your_file.pdf", #choose your own name
   encoding="MacRoman",
   width = 20, #size that you want
   height = 20, #size that you want
   units = "cm")

它会将您的文件保存在您保存 R 文件的位置。

【讨论】:

    【解决方案3】:

    您可能必须更改编码。在我的 Mac 上,这让我得到了 ‰ 符号:

    pdf('test.pdf',encoding="MacRoman")
    plot.new()
    text(0,labels="\u2030")
    dev.off()
    

    在‘enc’ directory of package grDevices 中查找可用的编码并尝试一下。

    【讨论】:

    • 当我尝试你的代码时,我得到Error in text.default(0, labels = "‰") : unknown encoding 'MacRoman' in 'mbcsToSbcs。关于这意味着什么以及如何解决它的任何建议?
    • 是的。您需要尝试不同的编码,因为您不是在 Mac 上,而是在使用 Windows。
    • 在工作中在我的 Windows 机器上进行测试后:我无法复制您的问题,并且代码运行良好,编码 MacRoman 也应该在 Windows 上可用。我建议安装最新的 R 版本(2.15.1),如果问题仍然存在,请给我们sessionInfo() 的整个输出。
    • 我会更新到R的新闻版,让大家知道。谢谢!
    【解决方案4】:

    问题是您的默认字体没有“‰”(我将其称为“per mil”)作为使用 \u0028 生成的字形。您需要更改为具有该字形的字体:

    ?pdfFonts
    

    这就是我在没有问题的情况下得到的设置(至少据我了解)

    > str(pdfFonts("sans"))
    List of 1
     $ sans:List of 3
      ..$ family  : chr "Helvetica"
      ..$ metrics : chr [1:5] "Helvetica.afm" "Helvetica-Bold.afm" "Helvetica-Oblique.afm" "Helvetica-BoldOblique.afm" ...
      ..$ encoding: chr "default"
      ..- attr(*, "class")= chr "Type1Font"
    

    【讨论】:

    • 我得到相同的输出,但可以用默认编码复制问题。
    • 我对 Mac 上的默认编码没有任何问题。 (这可能对尚未披露其操作系统的 OP 没有帮助。)
    • 他上面的评论说:R version 2.14.0 (2011-10-31) Platform: i386-pc-mingw32/i386 (32-bit)
    • 可能是语言环境。 sessionInfo()$locale 告诉我我正在使用“C/en_US.UTF-8/C/C/C/C”。
    • 好吧,我错过了他在一台 Windows 机器上。他不太可能有 Helvetica。我的语言环境是 [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8 我认为是默认设置,所以@Roland,我想你为您的安装做了一些非标准的事情。
    猜你喜欢
    • 2016-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多