You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 00:40:57