r - EPS 图中的图形空间

标签 r unicode fonts character-encoding postscript

在绘图中绘制标签或图例时,有时使用图形空间、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 序列。对于不同的函数调用,整个过程重复三次。

我可以使用一些魔法来完成这项工作吗?我可以想到两种可能的方法。

  1. 其中之一是创建我自己的字体编码,使字符易于访问。但我不知道图形空间的 Postscript 字体名称,也不知道如何找到。我还猜测我可能必须选择 NimbusSan 或其他具有足够字形集的字体,因为古代 Helvetica 可能不会指定该字体。

  2. 我能想到的另一种方法是以某种方式让 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/

相关文章:

java - 为我的所有 Jlabel JTextArea 等设置通用字体大小

r - 将字符串的前两个字符移到字符串中的特定字符之后

python - 如何解码消息的 mime 部分并在 Python 2.7 中获取 **unicode** 字符串?

excel - 如何根据字体大小将文本从 A 列复制到 B 列

python - 如何使用 BeautifulSoup 将 UTF-8 编码的 HTML 正确解析为 Unicode 字符串?

python - 我想在 python 中打印 "\"字符,但我得到 "\\"

intellij-idea - 重置 Intellij/DataGrip 2020.1 字体更改

r - 无法获取推文的纬度和经度值

r - 将列并行分配给 data.table

r - 如何根据 R 中的其他行执行条件运算?