地图坐标轴标签中的度符号不正确。

7
如果我使用geom_sf创建地图,轴标签上的度数符号会出错。我得到的度数符号在文本中垂直居中,而不是像上标一样升起。
例如,
library(sf)                                            
library(ggplot2)                                       
nc = st_read(system.file("shape/nc.shp", package="sf"))

ggplot() +                                             
  geom_sf(data = nc) +
  theme(axis.text = element_text(size=16))

enter image description here

当我在网上看到例子时,它们通常看起来是正确的(例如下面的图片,从这里复制),所以我猜这与我的本地设置有关。

enter image description here

我尝试更改字体,使用library(extrafont),但是我尝试的每一种字体都存在这个问题。

更新

我认为这不是ggplot特定的问题,因为我在任何使用plotmath中的degree关键字的图形中都会遇到相同的问题。例如:

par(mar=c(0,0,0,0))
plot.new()
text(0.5,0.5, bquote(120*degree*N), cex=5)

enter image description here

我正在使用 Linux (Kubuntu 19.04) 操作系统,R 版本为 3.5.2,ggplot2 版本为 3.2.1,sf 版本为 0.7-7。

不确定还需要提供哪些相关信息,如有需要可以随时更新回答。


对我来说可以工作。我猜测,正如你已经暗示的那样,是系统(字体)的问题。 - Roman Luštrik
ggplot() + geom_sf(data = nc) + theme(axis.text = element_text(size=16)) + coord_sf() 有什么变化吗? - Rodrigo Orellana
感谢@RodrigoOrellana的建议 - coord_sf没有改变任何东西。 - dww
你尝试在“theme”调用中设置字体族吗? - Chris
谢谢@Chris,是的,正如问题中提到的那样,更改字体并不能解决它。 - dww
3个回答

9

我遇到了类似的问题,经过阅读这里和其他相关问题后,我找到了解决方法。我使用的是Rstudio,所以我想如果你不用它进行R编程,你也可以轻松地找到解决方法(希望如此)。

我的解决方法是:工具 -> 全局选项,然后在这里将后端更改为Cairo。

这就是更改的样子:

输入图像描述


5

终于找到了答案:

X11的文档中写道:

在已安装Wine符号字体的Linux系统上发现了符号渲染不正确的问题(例如quote(pi)和expression(10^degree))。这时fontconfig会优先选择该字体,错误地解释其编码。通过将以下行添加到“~/.fonts.conf”或“/etc/fonts/local.conf”文件中,可以避免此问题,从而优先选择URW Type 1符号字体。

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

将这些行添加到 /etc/fonts/local.conf 中,可以解决我的问题。

传奇,这解决了问题。顺便说一下,您可能需要创建自己的etc/local/fonts.conf然后重新启动。我在这里提出了这个问题: https://gitlab.freedesktop.org/fontconfig/fontconfig/issues/209 - dez93_2000
我有一个类似的问题,这个修复方法并没有解决我的问题。我认为这个问题足够不同,应该作为一个单独的SO问题发布。当然,任何帮助都是受欢迎的,但我也把它留在这里,以防它与其他人发现的 https://dev59.com/6Lnoa4cB1Zd3GeqPWsTJ 有关。 - giocomai

3
作为一种解决方法,我正在手动创建轴标签。仍在寻找更好的解决方法,并对不良行为进行解释。
xlabs = seq(-84,-76, 2)
ylabs = seq(34, 36.5, 0.5)
ggplot() +                                             
  geom_sf(data = nc) +
  scale_x_continuous(breaks = xlabs, labels = paste0(xlabs,'°W')) +
  scale_y_continuous(breaks = ylabs, labels = paste0(ylabs,'°N')) +
  theme(axis.text = element_text(size=16))

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接