【问题标题】:Unable to add ggsn scalebar to ggplot无法将 ggsn 比例尺添加到 ggplot
【发布时间】:2018-09-29 07:39:24
【问题描述】:

我正在尝试使用 ggsn::scalebar() 将比例尺添加到 ggplot 地图,但是尽管尝试了许多不同的参数组合,但我总是会遇到一些错误。这是我的地图的代码:

# load libraries
library(tidyverse)
library(viridis)
library(sp)
library(rgdal)
library(ggsn)

# data
my.data.df <- data.frame(value = c(-1.2269832, -1.0153486, -0.9581069, -1.1534667, -1.0139735, -0.8711997, -0.8618286, -0.8524683),
                         x = c(538127.3, 538129.3, 538125.3, 538127.3, 538129.3,538131.3, 538121.3, 538123.3),
                         y = c(1101055, 1101055, 1101053, 1101053, 1101053, 1101053, 1101051, 1101051))
bb <- data.frame(long = c(538107, 538142), lat = c(1101020.5, 1101058.5))


# make a map
my.map <- ggplot(my.data.df, aes(x=x, y=y, fill=value)) +
  geom_tile() +
  geom_path(data = lines, aes(x=long, y=lat, group=group), inherit.aes = FALSE) +
  scale_fill_viridis("Subsidence (m)",
                     limits = c(-1.5, 0.5)) +
  scale_x_continuous(limits = c(538107, 538142)) +
  scale_y_continuous(limits = c(1101020.5, 1101058.5)) +
  coord_fixed() +
  theme(plot.title = element_text(hjust = 0.5),
        axis.title = element_blank(),
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        legend.justification=c(1,0),
        legend.position=c(1,0),
        plot.margin=unit(c(0,0,0,0), "cm"))

Take a look at the map here.当我尝试在地图上添加比例尺时出现问题:

my.map + 
  scalebar(dist = 5, dd2km = FALSE, dist_unit = 'm', location = 'bottomleft')

这会返回错误:

比例尺错误(dist = 5, dd2km = FALSE, dist_unit = "m", location = "bottomleft") : 参数 "x.min" 丢失,没有默认值

添加 x.min、x.max、y.min、y.max:

my.map + 
  scalebar(dist = 5, dd2km = FALSE, dist_unit = 'm', location = 'bottomleft', x.min = 538107, x.max = 538142, y.min = 1101020.5, y.max = 1101058.5)

返回此错误:

FUN(X[[i]], ...) 中的错误:找不到对象“值”

尝试添加数据参数:

my.map + 
  scalebar(data = my.data.df, dist = 5, dd2km = FALSE, dist_unit = 'm', location = 'bottomleft', x.min = 538107, x.max = 538142, y.min = 1101020.5, y.max = 1101058.5)

返回错误:

错误:data 必须唯一命名,但在其中有重复的列 另外:警告消息:1:在 min(data$long) 中:没有非缺失 min 的参数;返回 Inf 2: In max(data$long) : no non-missing 最大参数;返回 -Inf 3: In min(data$lat) : no non-missing min 的参数;返回 Inf 4: In max(data$lat) : no non-missing 最大参数;返回 -Inf

最后,我发现帮助说 scalebar() 中的数据参数实际上是在寻找一个边界框作为数据框,所以我尝试使用它:

my.map + 
  scalebar(data = bb, dist = 5, dd2km = FALSE, dist_unit = 'm', location = 'bottomleft', x.min = 538107, x.max = 538142, y.min = 1101020.5, y.max = 1101058.5)

但出现此错误:

FUN(X[[i]], ...) 中的错误:找不到对象“值”

我想知道添加比例尺是否会导致 ggplot 出现问题,因为它不再将“值”识别为数据框中的列以用于填充两次尝试。但是,我真的不确定。任何见解或解决方案将不胜感激!

【问题讨论】:

  • 我实际上无法用ggsn 0.4.0 完全复制您的问题。例如,dist_unit = "m" 是一个未使用的参数,当我将其取出时,我收到以下消息:argument "model" is missing, with no default。 (由于theme_few(),您还需要在代码中调用library(ggthemes),但这是一个小问题。)您可以再次检查代码吗?
  • 试试my.map + scalebar(my.data.df, dist = 0.01, height = 0.2, location = 'topleft')
  • @Kim,感谢您的评论。我打算从我的例子中取出 theme.few() ,但一定忘记了。我已经编辑了问题以删除它。我正在使用 ggsn 0.4.8,因此您遇到的错误非常不同。
  • @Tung,该代码给了我这个错误: 比例尺错误(C17_09_df,dist = 0.01,height = 0.2,location = “topleft”):dd2km 应该是合乎逻辑的,当我添加 dd2km = FALSE,它告诉我缺少 min 和 max 参数。

标签: r


【解决方案1】:

我遇到了同样的问题。通过将填充映射从 ggplot 调用移动到 geom_tile 调用,它解决了问题。

【讨论】:

    猜你喜欢
    • 2016-04-26
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-17
    • 1970-01-01
    • 1970-01-01
    • 2021-08-15
    相关资源
    最近更新 更多