在ggmap上放置坐标的小ggplot2图表

5

我希望首先使用ggmap以经度和纬度作为坐标轴来绘制特定区域的图形。

然后,我想在特定位置上放置小的ggplot2图表,给定它们的经度和纬度。这些可以是具有最小主题的条形图。

我的数据库可能有以下列:

1. town
2. longitude
3. latitude
4. through 6. value A, B, C

我生成一个图表(伪代码)
p <- ggmap(coordinates) 

我有我自己的极简 ggplot2 设计。
q<-ggplot2()+geom_bar(....)+ ... x-axis null y axis null minimal template

如何将两个设计结合起来,使得在地图的特定坐标上有小型极简 ggplot 绘图?

3
这篇博客或许可以帮到您…… https://ikashnitsky.github.io/2017/subplots-in-maps/ - Andrew Gustar
1个回答

7
这是我使用饼图作为散点图上的点所做的一个例子。您可以使用相同的概念将条形图放在特定的纬度/经度坐标上地图上。 R::ggplot2::geom_points:如何用饼图替换点? 需要进一步更新。部分使用的代码来自另一个已被删除的答案。如果您通过搜索引擎找到了这个答案,请留下评论,我会重新完善它。

更新:

enter image description here

使用大部分您的答案中的自适应代码,但我不得不更新一些行。

p <- ggmap(Poland) + coord_quickmap(xlim = c(13, 25), ylim = c(48.8, 55.5), expand = F)

这个更改可以得到更好的投射效果,消除了关于重复比例尺的警告。
df.grobs <- df %>% 
  do(subplots = ggplot(., aes(1, value, fill = component)) + 
       geom_col(position = position_dodge(width = 1), 
                alpha = 0.75, colour = "white") +
       geom_text(aes(label = round(value, 1), group = component), 
                 position = position_dodge(width = 1),
                 size = 3) +
       theme_void()+ guides(fill = F)) %>% 
  mutate(subgrobs = list(annotation_custom(ggplotGrob(subplots), 
                                           x = lon-0.5, y = lat-0.5, 
                                           xmax = lon+0.5, ymax = lat+0.5))) 

在这里,我明确指定了你的geom_col的躲闪宽度,以便将其与geom_text匹配。我使用round(value, 1)来设置标签美学属性,它会自动继承xy美学属性,这些属性来自于subplots = ggplot(...)调用。我还手动设置了相当小的大小,使标签适合,但是我增加了每个子图的整体边界框大小,从0.35增加到0.5。

df.grobs %>%
  {p + 
    .$subgrobs + 
    geom_text(data=df, aes(label = name), vjust = 3.5, nudge_x = 0.065, size=2) + 
    geom_col(data = df,
             aes(Inf, Inf, fill = component), 
             colour = "white")}

我在这里做的唯一更改是为了美学上的“ghost”geom_col。 当它们被设置为0,0时,它们根本没有绘制,因为那不在x和y限制范围内。 通过使用Inf,Inf,它们被绘制在远处的右上角,足以使它们不可见,但仍然在图例中绘制。

谢谢Brian,我重新制作了它。我有一个小问题,你能帮我解决吗?我无法正确地放置标签,出现了标记问题。我将放置代码,然后您可以使用它作为您的答案,这样我就可以将其标记为答案? - Jacek Kotowski
这太棒了,你太棒了!我一定要学习它,已经尝试将甜甜圈作为仪表盘进行实验...它在很大程度上填补了缺失的subplot()。谢谢你。我相信其他人也会从你的想法中受益匪浅。 - Jacek Kotowski
能否在 ggmap 上使用折线图实现相同的效果? - Ariel
1
@Ariel,是的,只需更改较大块中的代码(从geom_col更改为geom_line等)。 - Brian
@Brian,非常感谢您演示这个巧妙的技巧。然而,目前为止,这个例子是不可重现的,虽然我已经接近了,但在最后一步中出现了一个无法克服的错误。请注意,早期帖子中的原始df使用列x1y1,而不是lonlat,我认为现在唯一的问题在于最终的代码块。如果您能看一下,我将不胜感激。我也只是使用下面的代码生成地图p <- ggmap(get_map(c(left = 13, right = 25, bottom = 48.8, top = 55.5))) p <- p + coord_cartesian() - nickb

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