如何在R的PDF绘图中使用UTF-8编码字符向量设置pch参数
R绘图PDF格式无法显示UTF-8符号问题
我用intToUtf8生成UTF-8字符作为散点图的pch符号,在PNG图里正常显示,但PDF图里完全出不来,试了ISOLatin1.enc和ISOLatin2.enc编码都没用。
具体代码及现象
生成符号向量:
(.pch <- c(intToUtf8(9675), intToUtf8(9679))) # [1] "○" "●"
PNG绘图正常运行:
png('foo.png', 400, 400) with(df, plot(x, y, pch=.pch[(z < 0) + 1], xlim=0:1, ylim=0:1)) legend('topleft', pch=.pch, legend=letters[1:2]) dev.off()
PDF绘图显示异常:
pdf.options(encoding='ISOLatin2.enc') pdf('foo.pdf', 4, 4) with(df, plot(x, y, pch=.pch[(z < 0) + 1], xlim=0:1, ylim=0:1)) legend('topleft', pch=.pch, legend=letters[1:2]) dev.off()
会话信息
> sessionInfo() R version 4.3.1 (2023-06-16) Platform: x86_64-pc-linux-gnu (64-bit) Running under: Ubuntu 22.04.3 LTS Matrix products: default BLAS: /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.10.0 LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.10.0 locale: [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 [7] LC_PAPER=en_US.UTF-8 LC_NAME=C [9] LC_ADDRESS=C LC_TELEPHONE=C [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C time zone: Europe/Zurich tzcode source: system (glibc) attached base packages: [1] stats graphics grDevices utils datasets methods base loaded via a namespace (and not attached): [1] compiler_4.3.1 tools_4.3.1
测试数据
df <- structure(list(x = c(0.2, 0.6, 0.7, 0.9), y = c(0.4, 0.7, 0.9, 0.5), z = c(-1, -1, 1, 1)), class = "data.frame", row.names = c(NA, -4L))
解决办法
1. 改用Cairo PDF设备
Cairo设备对UTF-8字符兼容性更好,直接替换pdf()为cairo_pdf()即可,无需额外设置编码:
cairo_pdf('foo.pdf', 4, 4) with(df, plot(x, y, pch=.pch[(z < 0) + 1], xlim=0:1, ylim=0:1)) legend('topleft', pch=.pch, legend=letters[1:2]) dev.off()
2. 用原生pch编号替代UTF-8字符
如果不想依赖Cairo,直接用R原生支持的点符号编号:空心圆用pch=1,实心圆用pch=19,效果一致且兼容性拉满:
pdf('foo.pdf', 4, 4) .pch <- c(1, 19) with(df, plot(x, y, pch=.pch[(z < 0) + 1], xlim=0:1, ylim=0:1)) legend('topleft', pch=.pch, legend=letters[1:2]) dev.off()
3. 指定PDF设备用UTF-8编码
直接在pdf()函数里设置encoding="UTF-8",前提是系统字体支持这些UTF-8字符:
pdf('foo.pdf', 4, 4, encoding="UTF-8") with(df, plot(x, y, pch=.pch[(z < 0) + 1], xlim=0:1, ylim=0:1)) legend('topleft', pch=.pch, legend=letters[1:2]) dev.off()
内容的提问来源于stack exchange,提问作者jay.sf
相关产品推荐
相关产品推荐

