在绘图中绘制标签或图例时,有时使用图形空间、unicode U+2007 来正确对齐具有不同位数的图形很有用。对于屏幕设备,只需嵌入 \u2007
输出中的 使得这个工作相当好(在 Windows 上或使用 X11(type="Xlib")
比我的 Linux 默认使用 cairo 更好)。
plot(runif(20), ylim=c(0,1.2), pch=c("x", "o"))
legend("top", c("\u20075%", "10%"), pch=c("x", "o"))
但是当我将输出设备设置为 postscript 以创建 EPS 文件时,事情就崩溃了:
setEPS()
postscript()
plot(runif(20), ylim=c(0,1.2), pch=c("x", "o"))
legend("top", c("\u20075%", "10%"), pch=c("x", "o"))
dev.off()
将产生如下消息:
Warning messages:
1: In strwidth(legend, units = "user", cex = cex, font = text.font) :
conversion failure on ' 5%' in 'mbcsToSbcs': dot substituted for <e2>
<80>
会重复相同的消息和<87>
它们共同构成了 U+2007 的 UTF-8 序列。对于不同的函数调用,整个过程重复三次。
我可以使用一些魔法来完成这项工作吗?我可以想到两种可能的方法。
其中之一是创建我自己的字体编码,使字符易于访问。但我不知道图形空间的 Postscript 字体名称,也不知道如何找到。我还猜测我可能必须选择 NimbusSan 或其他具有足够字形集的字体,因为古代 Helvetica 可能不会指定该字体。
我能想到的另一种方法是以某种方式让 postscript 引擎知道这是一个间距符号,并且可以引入适当数量的字距调整,而不是实际打印某些内容。也许可以使用正确的喜好指标文件来做到这一点。但从哪里得到呢?
很可能这两种方法必须以某种方式混合,选择一个好的字体需要使用一个好的字体规范文件,或者要使用字距调整,我仍然必须确保一些可以携带的单位编码那个角色。
最佳答案
以下内容不会引发错误:
setEPS()
cairo_ps()
plot(runif(20), ylim=c(0,1.2), pch=c("x", "o"))
legend("top", c("\u20075%", "10%"), pch=c("x", "o"))
dev.off()
显然,cairo 驱动程序将根据实际使用的字母来定义编码,并且它了解 unicode。编码中用于表示图形空间的名称是/uni2007
。
不过,使用的字体必须实际包含该 unicode 字符,因此您可能必须使用 family
参数指定合适的字体。否则 cairo 将默默地替换一个合适的替换字符,在本例中是一个“正常”空格,U+0020。
关于r - EPS 图中的图形空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24542141/