如何修复在 Linux/Fedora 31 上的 R 中未正确显示的度数符号

Posted

技术标签:

【中文标题】如何修复在 Linux/Fedora 31 上的 R 中未正确显示的度数符号【英文标题】:How to fix degree symbol not showing correctly in R on Linux/Fedora 31 【发布时间】:2020-06-24 15:24:37 【问题描述】:

我使用的任何地图:

ggplot() + geom_sf()

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

这个答案中给出的答案 SO - degree symbol incorrect in map axis labels - 没有帮助,我发布了一个单独的问题,因为我看到了不同的标志。

更改字体没有帮助。

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

我使用的是 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;正如 cmets 中所建议的,我遇到了与 plot.new(); text(0.5,0.5, bquote(120*degree*N), cex=5) 相同的问题

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

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

2019-03-19 更新

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

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

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

使用dww在下面的答案中提出的TestChars()函数显示如下:

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

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

2020-03-20 更新

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

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

【问题讨论】:

你能测试一下这是否真的是一个ggplot/sf问题。更有可能源于 plotmath 或 R 中的其他地方。如果你运行 plot.new(); text(0.5,0.5, bquote(120*degree*N), cex=5),你会得到什么? 你说得对,我也遇到了同样的问题...稍后会更新问题 直接调用unicode字符会打印什么符号?例如。情节.新(); text(0.5,0.5, bquote(paste("120", "\u00B0", "N", sep = "")), cex=5) @jpmam1 正确的°符号,完全符合预期 这是一个绘图问题,还是在出口中发生?保存带有重音字符的文件时,我在 Ubuntu 上遇到了类似的问题;我能够通过执行pdf.options(encoding = 'ISOLatin2') 来克服它 【参考方案1】:

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

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

#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

【讨论】:

这是一种解决方法,而不是解决方案,当然使用自定义比例可以解决此问题,如问题中链接的 SO 答案中所述。它也不保留作为坐标必要部分的 N/S 和 E/W 符号。当然,通过进一步的自定义和 if 语句,可以解决这个问题,但这不是一个解决方案。 非常感谢更新,看起来很棒。我会提请上游注意的。如果没有更好的选择,赏金就在这里 不幸的是,这不是一个可行的解决方案,因为降级 pango 会破坏 'nautilus' - "nautilus: symbol lookup error: nautilus: undefined symbol: pango_attr_insert_hyphens_new!【参考方案2】:

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

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

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

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

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

现在有一些事情可以尝试调查原因:

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

Sys.getlocale()

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

X11.options()

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

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()

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

【讨论】:

这看起来很有帮助,谢谢。快速回复...即使将语言环境设置为 en_US.UTF-8 或 C,我也基本上看不到这些标志(即我看到所有标志都是 00B0),除了最后一个和点(第 6 列倒数第二个)。 Cairo 是 X11.options() 中的类型,我看到相同的更改设备。将首先检查?plotmath,然后将详细信息添加到问题中。再次感谢! 添加了问题的详细信息【参考方案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 核心本身的上游修复。

【讨论】:

以上是关于如何修复在 Linux/Fedora 31 上的 R 中未正确显示的度数符号的主要内容,如果未能解决你的问题,请参考以下文章

如何修复 AttachedBehavior 上的 DependencyPropertyDescriptor AddValueChanged 内存泄漏?

如何修复 Colab 上的“错误:pytorch3d 构建***失败”错误?

fedora30平台安装docker 19.03

linux----------fedora如何打开ssh,可以远程链接

安装windows、mac os X、Linux fedora 三系统在同一台pc上,如何操作???

linux fedora35中配置软件存储库:添加启用禁用