在绘图中绘制标签或图例时,使用数字空间unicode U + 2007有时非常有用,可以使用不同数字的数字正确对齐数字。对于屏幕设备,只需在输出中嵌入\u2007
即可使其工作得相当好(在Windows上使用X11(type="Xlib")
比使用cairo的Linux默认设置更好。)
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引擎知道这是一个间距符号而不是实际打印某些内容,而是可以引入适当数量的字距调整。也许可以使用正确的度量标准文件来做到这一点。但是到哪里去了?
很可能这两种方法必须以某种方式混合,选择好的字体需要使用好的字体度量文件,或者使用字距调整我还需要确保一些可以携带的单比特编码那个角色。
答案 0 :(得分:1)
以下不会引发错误:
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。