绘图符号在PDF中无法显示

9
我有以下代码用于创建一个绘图。在x轴y轴上,屏幕上会显示符号,当我将绘图保存为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)

enter image description here enter image description here


3
你尝试过其他的PDF设备吗,比如cairo_pdf - Roman Luštrik
我找不到任何看起来“不正确”的地方? - Marcus Riemer
我尝试使用cairo_pdf,但在运行上述“plot”命令时出现错误。 - Keith W. Larson
一个解决方法(如果你的最终目标是在LaTeX文档中包含一个图)是使用tikzDevice包(目前被从CRAN流放)。你尝试过使用symbol(),例如?plotmath吗?另请参见https://dev59.com/OW025IYBdhLWcg3wpXod [你在使用cairo_pdf时遇到了什么错误?在类似情况下,它对我有效] - Ben Bolker
1
如果使用Mac的人遇到了这个问题,将设备切换到cairo_pdf可以解决问题,正如许多人在这里指出的那样。 ggplot2中的cairo_pdf似乎也可以正确地重现特定于操作系统的permil符号。即,如果您只键入""而不是\u2030 - Mikko
显示剩余4条评论
4个回答

4
问题在于您的默认字体没有“‰”(我会将其读作“千分之一”)作为用\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"

1
我得到了相同的输出,但是无法使用默认编码复制问题。 - Roland
我在我的Mac上使用默认编码没有遇到任何困难。(这可能对未透露操作系统的OP没有帮助。) - IRTFM
他上面的评论说:“R版本2.14.0(2011-10-31)平台:i386-pc-mingw32 / i386(32位)” - Ben Bolker
可能是语言环境的问题。sessionInfo()$locale 告诉我正在使用 "C/en_US.UTF-8/C/C/C/C"。 - Roland
好的,我错过了他在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,我认为您在安装时做了一些非标准操作。 - IRTFM
显示剩余2条评论

3

您可能需要更改编码方式。在我的 Mac 上,这会得到 ‰ 符号:

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

查看grDevices包的‘enc’目录中提供的编码,然后尝试使用它们。


当我尝试运行你的代码时,出现了Error in text.default(0, labels = "‰") : unknown encoding 'MacRoman' in 'mbcsToSbcs的错误。有什么建议可以解决这个问题吗? - Keith W. Larson
是的。由于您不是在Mac上使用,而是在Windows上使用,因此需要尝试不同的编码方式。 - Roland
1
在我工作的Windows机器上测试后:我无法复制您的问题,代码也可以正常运行,使用编码MacRoman,这应该在Windows上也可用。我建议安装最新的R版本(2.15.1),如果问题仍然存在,请提供sessionInfo()的完整输出。 - Roland
我会更新到最新版本的R并让大家知道。谢谢! - Keith W. Larson

1

我在MAC上使用ggsave和MacRoman保存PDF表格时遇到了同样的问题。

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文件的位置。

-1

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

  1. 首先导出到一个临时文件,例如“temp.png”
  2. 使用pdf()或cairo_pdf()导出到pdf文件,例如“UnicodeToPDF.pdf”
  3. 结合使用gridExtra中的grid.arrange、grid中的rasterGrob和png中的readPNG,将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的评论而添加的。 在此输入图像描述


这与保存为PDF根本不同,也不能替代它。你将图像光栅化为PNG并放入PDF中。这完全不同(放大一下!),在大多数情况下,你根本不需要考虑PDF —— 只需使用PNG即可。 - Konrad Rudolph
这里是对原问题的详细说明:“是否有其他符号可以打印在我的PDF中,代替我的 \u2030,或者有其他解决方案?” 可以看出,对于该问题的其他解决方案都是受欢迎的。至少在我的Windows系统中,当我运行我提出的代码时,我无法看到保存在temp.png中的图像和插入pdf中的图像之间的任何区别。Unicode字符可以被打印到pdf中,这就是我提供的替代解决方案。请问您能否详细说明一下我的解决方案可能出现什么问题,导致两个图像之间出现明显的差异? - James Silva
“请问您能否详细说明我的解决方案可能出了什么问题,以导致两张图片之间存在明显差异?” — 我的意思是您应该真正放大图片。您会发现它被光栅化了,而不是一个缩放无损的矢量图形。 - Konrad Rudolph
好的,我花了几分钟将这两张图片并排放置,尽可能地放大,但我无法发现任何区别。从实际角度来看,人眼很难看出两张图片之间的差异,并最终检测到缺乏矢量图形;因此,是否提供的解决方案对于特定的可视化效果是否像你想象中的那样糟糕,应该由用户自行决定。你鼓励社区在做出最终决定之前先进行放大查看是很好的。谢谢。 - James Silva
我不相信你真的这样做了,因为差异非常明显。当然,这是放大后的图像,但即使不放大也能看出差异。而且打印时看起来更糟糕。PNG版本的文件大小也比PDF大10倍左右。增加DPI会使文件大小更大。——无论如何,也许这对你的用例不是问题,这是完全合理的。但那么你就不要使用PDF,你使用PNG。但OP想要一个PDF,你的解决方案因此通常没有帮助。 - Konrad Rudolph
你说得对,我没有使用你的机器进行缩放,而是使用我的R-4.01 Windows 10机器。我更新了我的帖子,展示了在Acrobat Reader中缩放一个Unicode字符后的效果。关于文件大小,我得到了一个64KB的PNG和一个83KB的PDF,绝对不是10倍的增加。虽然如此,这对我来说是一次很好的学习。谢谢。 - James Silva

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接