8

我制作的任何地图:

ggplot() + geom_sf()

生成预期的地图,但未正确显示度数符号,如下图所示。

地图一角的度数符号错误

这个答案中给出的关于 SO -地图轴标签中的度数符号不正确- 的答案没有帮助,我发布了一个单独的问题,因为我看到了一个不同的标志。

更改字体没有帮助。

我还尝试sf在一个单独的项目中安装来自 Github 的 (0.9)的当前版本renv,但结果相同。

我在Linux上,Fedora 31。

要复制:

library("ggplot2")
library("sf")
nc <- st_read(system.file("shape/nc.shp", package="sf"))

ggplot() +
  geom_sf(data = nc)

2019-03-15 更新

该问题并非特定于 ggplot/geom_sf;正如评论中所建议的,我遇到了同样的问题plot.new(); text(0.5,0.5, bquote(120*degree*N), cex=5) 错误度数符号的附加示例

另外,为了澄清,我没有在帮助中详细说明与 Wine 相关的问题?X11()。如果我在终端中运行fc-match Symbol,我会得到:

StandardSymbolsPS.t1:“标准符号 PS”“常规”

2019-03-19 更新

在全新的 Fedora 31 和 Fedora 32 beta 安装中得到确认。可能是 Fedora 的问题。

我尝试了不同的语言环境(包括例如“en_US.UTF-8”或“German”)和设备(例如cairo_pdf()cairo_ps()),结果相同。

X11.options() 将“cairo”显示为类型(将其更改为 Xlib,或者 dbcairo 不会更改结果)。

在下面的答案中使用TestChars()dww 提出的功能显示如下: 测试

但是,如果我用 knitr 编织成 pdf,我会得到大多数符号,包括°。

从pdf测试

如果我编织到 html,我会得到通常的乱码。

2020-03-20 更新

正如@jpmam1 所建议的,这似乎与 中的回归有关pango,可以通过降级来临时修复pango。然而,对 pango 进行降级会破坏操作系统的其他核心部分,例如nautilus.

我在 Fedora 上打开了一个错误:https ://bugzilla.redhat.com/show_bug.cgi?id=1815128

4

3 回答 3

7

以下是使用在 Fedora 31 VirtualBox VM 上运行的 R (ver3.6.3 2020-02-29) / R Studio (ver1.2.5033) 来解决您的问题的两种解决方案:

1) 使用自定义比例插入 unicode 字符以生成正确的符号(包括 N/S 或 E/W,具体取决于您的 long/lat):

#install.packages("ggplot2")
#install.packages("sf")
library("ggplot2")
library("sf")

nc <- st_read(system.file("shape/nc.shp", package="sf"))

ggplot() +
  geom_sf(data = nc) +
  scale_x_continuous(labels = function(x) paste0(x, '\u00B0', "W")) +
  scale_y_continuous(labels = function(x) paste0(x, '\u00B0', "N"))

2)降级pango库。在 Fedora 31 中,pango 升级到 1.44,由于从 Freetype 切换到 HarfBuzz,它会影响位图字体,例如默认的 R-Studio 字体。降级软件包修复了系统范围内特殊字符的呈现。这也应该解决 Fedora 32 中的问题(未经测试)。

sudo dnf downgrade --releasever 30 pango-1.43.0-4.fc30.x86_64
于 2020-03-18T05:11:38.610 回答
3

这与其说是一个答案,不如说是一些要尝试的诊断,因为这些诊断太长而无法发表评论。

请注意,您看到的“奇怪符号”是在指定字体中没有符号时得到的。

在我们陷入诊断之前,还要注意来自?plotmath

在类 Unix 上:在 UTF-8 语言环境中,可以输入任何 Unicode 字符,可能是 \uxxxx 或 \Uxxxxxxxx 转义序列,但问题是图形设备是否能够显示该字符。使用 cairo 的 X11 设备中可能提供最广泛的字符:请参阅其帮助页面,了解安装其他字体如何提供帮助。这通常可用于以粗体或斜体显示希腊字母。

在非 UTF-8 语言环境中,通常不支持当前编码所针对的语言以外的符号。

现在一些事情来尝试调查原因:

1. 获取有关您所在地区的信息

Sys.getlocale()

2. 要查看您的默认 x11 设置:

X11.options()

我们特别感兴趣的type是看看 x11 设备是否使用 cairo。如果不是,请尝试设置 cairo 选项X11.options()以查看是否有帮助

3. 要查看可用的字符,请输入以下内容:

TestChars <- function(...)
{
  info = l10n_info()
  r <- c(32:126, 160:254)
  par(pty = "s")
  plot(c(-1,10), c(20,260), type = "n", xlab = "", ylab = "", xaxs = "i", yaxs = "i")
  grid(11, 24, lty = 1)
  mtext(paste("MBCS:", info$MBCS, "  UTF8:", info$`UTF-8`, "  Latin:", info$`Latin-1`))
  for(i in r) try(points(i%%10, 10*i%/%10, pch = i, font = 5,...))
  points(6,170, col='red', cex=5)
}
TestChars()

在我的系统上,它看起来像这样(注意我画了一个圆圈来突出显示符号 176,即您遇到的问题)。

在此处输入图像描述

4.查看其他图形设备上可用的符号

尝试在不同的设备上使用TestChars函数,看看有没有一个完整的集合。例如,

cairo_pdf()
TestChars()
dev.off()

如果在尝试了这些方法之后您仍然遇到问题,请将诊断结果输入回您的问题中,以防他们可以帮助其他人解决问题。

于 2020-03-19T15:00:48.587 回答
3

事实证明,这种不当行为是由 R 本身中遗留的符号使用引起的。

这可能会在 R 本身的上游修复: https ://bugs.r-project.org/bugzilla/show_bug.cgi?id=17748 它引用了我在收到对此问题的反馈后为 Fedora 打开的下游问题: https ://bugzilla.redhat.com/show_bug.cgi?id=1815128

Iñaki Ucar 已在 R 邮件列表上发布了一个有效的解决方法: https ://stat.ethz.ch/pipermail/r-devel/2020-March/079185.html

我在这里复制它以供参考:

$ sudo dnf install gdouros-symbola-fonts

然后将以下内容添加到 /etc/fonts/local.conf (系统范围)或 ~/.fonts.conf (仅适用于您的用户):

<fontconfig>
<match target="pattern">
 <test name="family"><string>Symbol</string></test>
 <edit name="family" mode="prepend" binding="same">
   <string>Symbola</string>
 </edit>
</match>
</fontconfig>

现在你应该看到这个:

$ fc-match Symbol
Symbola.ttf: "Symbola" "Regular"

和符号应该正确呈现。

同样,这个解决方案的功劳归于 Iñaki Ucar。

感谢所有提供此问题答案的人,他们在故障排除和促进此过程方面提供帮助。希望这将在 R 核心本身的上游修复。

于 2020-03-30T18:46:09.327 回答