使用ggsn包在ggmap中添加易于阅读的比例尺?

3
我正在给我的一些地图中插入比例尺。我使用ggmaps,并且目前使用ggsn包插入比例尺。然而,在我工作的地图类型上,该比例尺非常难以阅读(请参见下面的地图)。我希望要么(a)找到一种使它更易于阅读的方法,(b)将比例尺放在地图边界之外,或者(c)使用不同的软件包以便于进行自定义设置。
基本上,我的代码看起来像这样。这个例子应该很容易复制。
map <- get_map(location = c(146, 15), zoom = 8,
               maptype = “satellite”, source = "google") 

Map <- ggmap(map)

Map + ggsn::scalebar(x.min = 144.5, x.max = 147.5,
           y.min = 13.5, y.max = 16.5, 
           dist = 50, dd2km = TRUE, model = 'WGS84')

生成类似下面的地图,右下角的比例尺很难读取。

ggmap with scalebar

有什么想法吗?非常感谢!


ggsn::scalebar 看起来不太可配置,除非重写该函数。根据您想要的输出类型,leaflet 包可能是一个选项(它适用于交互式 HTML/JS 地图,但也可以生成静态地图)。如果有用的话,我很乐意发布一个 leaflet 解决方案。 - neilfws
Leaflet能够与ggplot2一起使用吗?我的脚本的一个重要部分依赖于能够使用ggplot2在地图上绘制内容。非常感谢! - A. Poulton
不,leaflet与ggplot2完全独立。我只能建议查看scalebar函数的代码,看看是否可以进行修改。 - neilfws
添加了一个答案,展示如何修改该函数。 - neilfws
1个回答

3

Github上的scalebar开发版具有新的参数st.colorbox.fill,可以更好地自定义比例尺。

使用以下命令安装该版本:

devtools::install_github('oswaldosantos/ggsn')

然后使用e.g.

ggmap(Map) + 
  my_scalebar(x.min = 144.5, x.max = 147.5,
            y.min = 13.5,  y.max = 16.5,
            dist = 50, dd2km = TRUE, model = 'WGS84',
            box.fill = c("yellow", "white), st.color = "white")

enter image description here

旧版答案

在发现新版本之前,我写了这个修改函数的答案。

我认为在这里最好的方法是修改scalebar函数。

首先,您需要加载ggsn包并编辑函数:

library(ggsn)
my_scalebar <- edit(scalebar)

这应该会弹出一个编辑器。修改函数顶部,使其看起来像这样:
function (data = NULL, location = "bottomright", dist, height = 0.02, 
  st.dist = 0.02, st.bottom = TRUE, st.size = 5, dd2km = NULL, 
  model, x.min, x.max, y.min, y.max, anchor = NULL, facet.var = NULL, 
  facet.lev = NULL, box2_fill = "yellow", legend_color = "white")
{
  require(maptools)

我们添加了三个内容:
  • 一个参数box2_fill,默认值为“yellow”
  • 一个参数legend_color,默认值为“white”
  • 需要maptools,因为该函数使用该包中的gcDestination()
接下来,请查找以gg.box2开头的行,并将其更改为使用box2_fill的值:
  gg.box2 <- geom_polygon(data = box2, aes(x, y), fill = box2_fill, 
    color = "black")

然后,请编辑函数底部附近的部分,使用 legend_color 的值:

else {
    gg.legend <- annotate("text", label = paste0(legend[, 
      "text"], "km"), x = x.st.pos, y = st.dist, size = st.size,
      color = legend_color)
  }

保存操作将关闭编辑器并将新函数my_scalebar保存到您的工作空间。

现在,您可以使用这个新函数了。您可以为新参数box2_fill =legend_color =提供值,或者尝试使用默认值:

ggmap(Map) + 
  my_scalebar(x.min = 144.5, x.max = 147.5,
            y.min = 13.5,  y.max = 16.5,
            dist = 50, dd2km = TRUE, model = 'WGS84')

如果您认为您的编辑是有用的,您可以使用pull request 在Github上向包开发人员建议。 注意:看起来开发者已经开始解决这个问题了,因为scalebar的Github版本具有新的box.fillst.color参数。


这是有关编程的内容,请将其从英语翻译成中文。仅返回翻译后的文本: 这个答案有一个编辑:dd2km已经过时了。需要用transform = TRUE,dist_unit =“km”进行替换。 - smundlay

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