如何修复在 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 构建***失败”错误?
linux----------fedora如何打开ssh,可以远程链接