R可以绘制一些Unicode字符,但无法绘制其他字符。

14
我们的系统管理员刚将我们的操作系统升级到SLES12SP1。我重新安装了Rv3.2.3并尝试绘制图表。我使用cairo_pdf并尝试使x轴标签成为\u0298,即太阳符号,但无法正常工作:标签为空白。例如:
cairo_pdf('Rplots.pdf')
plot(1, xlab='\u0298') # the x-label comes up blank
dev.off()

这个之前是可以工作的,但不知道为什么现在不能用了。它和其他字符一起可以工作,例如

cairo_pdf('Rplots.pdf')
plot(1, xlab='\u2113') # the x-label comes up with the \ell symbol
dev.off()

当我仅仅粘贴太阳符号时,即

plot(1, xlab='ʘ')

然后我收到了警告

Warning messages:
1: In title(...) :
  conversion failure on 'ʘ' in 'mbcsToSbcs': dot substituted for <ca>

这台机器是德国制造的,但我正在使用美国英语UTF-8区域设置:

> sessionInfo()
R version 3.2.3 (2015-12-10)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: SUSE Linux Enterprise Server 12 SP1

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

你有什么建议可以让太阳符号出现吗?

2个回答

4
注意:我认为在使用新系统之前,您应该首先执行以下操作:
capabilities() #And see what the result for cairo is.

虽然其中一个想法需要知道您使用的字体,因此可能需要输出 l10n_info()$MBCSnames(X11Fonts())

选项1)Hershey字体具有所有占星符号作为特殊转义字符。输出的第4页:

 demo(Hershey)   # has \\SO as the escape sequence for the "solar" symbol.

因此,查看 draw.vf.cell 函数的代码,我们可以看到它使用 text 函数来绘制这些字符,因此在用它来标记轴时需要将 xpd=TRUE 添加到参数中。
plot(1, xlab="") ; text(1, .45, "\\SO" , vfont=c("serif", "plain"), xpd=TRUE )

enter image description here

选项2)在您选择的字体中查找太阳符号。您可以尝试将字体设置为“Helvetica”以外的其他字体。请参阅?X11,其中有关于Cairo字体的部分。 points函数的帮助页面有一个名为TestChars的函数,可以让您在各种字体中打印字符字形到输出设备上。在这种情况下,您的输出设备可能是cairopdfx11。在我的设备上(UNIX的Mac分支),Arial字体具有此输出:

   png(type="cairo-png");plot(1, xlab="\u0298");dev.off()

多年来我对类似问题的观察表明,Cairo图形更可靠地跨平台。但是由于R可以在没有cairo支持的情况下编译,这并不是确定的事情。

enter image description here


3
也许你的文本编辑器使用的是拉丁字母表,因此你会向控制台发送拉丁字符。
查看编码。
Encoding('ʘ')

并且和/或尝试
plot(1, xlab=iconv('ʘ', from='latin1', to="UTF-8"))

但是要小心,复制时可能会改变编码方式。如果您使用Notepad ++,您可以在文本编辑器中在不同的编码格式之间进行转换。


此外,> Encoding("ʘ") [1] "UTF-8" - rhombidodecahedron
那我不确定,但也许问题在于您没有使用德语作为本地语言。Sys.setlocale("LC_TIME", "de_DE.UTF-8") 我使用的是R版本3.2.3(2015-12-10),并且本地语言设置如下:locale: [1] LC_CTYPE=de_AT.UTF-8 LC_NUMERIC=C
[3] LC_TIME=de_AT.UTF-8 LC_COLLATE=de_AT.UTF-8
[5] LC_MONETARY=de_AT.UTF-8 LC_MESSAGES=de_AT.UTF-8
[7] LC_PAPER=de_AT.UTF-8 LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=de_AT.UTF-8 LC_IDENTIFICATION=C 它可以正常工作,但我不能确定。
- Florian

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