在R ggplot2中将条形图绘制到地图上

Posted

技术标签:

【中文标题】在R ggplot2中将条形图绘制到地图上【英文标题】:Plotting bar charts to a map in R ggplot2 【发布时间】:2021-11-03 23:58:39 【问题描述】:

我想在 ggplot2 的地图中添加条形图。存在类似的问题(this one 和 this one),但他们的答案涉及 ggsubplot,它已被弃用。 geom_scatterpie() 提供了一种使用饼图执行此操作的方法(example 1,但另见 example 2),但饼图不像条形图那样直观。同样,我们可以使用geom_sf(size=) 将气泡大小绘制到地图上,如here 所述。那么有没有办法用酒吧来代替呢?

每个位置制作一个条的可重现示例:

# devtools::install_github("hrbrmstr/albersusa")
library(albersusa)
library(sf)
library(ggplot2)

# make a map
statesus <- fortify(usa_sf("laea"))
p <- ggplot() +
     geom_sf(data=statesus, size=0.4)

# set up the data
lat <- c(-68.24, -109.88, -80.88, -113.85)
lon <- c(44.35, 38.24, 25.37, 48.75)
park <- c("Acadia", "Canyonlands", "Everglades", "Glacier")
proportion <- c(0.10, 0.80, 0.05, 0.45) # bar heights
parkdat <- data.frame(lat=lat, lon=lon, park=park, proportion=proportion)
parkdatsf <- st_as_sf(parkdat,
             coords=c(lon="lon", lat="lat"), 
             crs=4326, 
             agr="constant")

# add points to the map (ideally these would be bars)
p + geom_sf(data=parksdatsf)

【问题讨论】:

【参考方案1】:

将条添加为点对我来说听起来有点尴尬。如果您想在地图中添加条形图,一种选择是使用geom_rect,如下所示:

library(sf)
library(ggplot2)
library(albersusa)

p <- ggplot() +
  geom_sf(data=usa_sf(), size=0.4) +
  theme_minimal()

scale <- 10
width <- 4

p + 
  geom_rect(data=parkdat, aes(xmin = lat - width / 2, xmax = lat + width / 2, ymin = lon, ymax = lon + proportion * scale, fill = park))

【讨论】:

这可以制作您共享的地图,并且主要完成我正在寻找的内容。但是,如果您沿曲线投影地图(如我在示例代码中使用的"laea" 投影),则它不起作用。对于受过训练的眼睛来说,这种投影并不是最好的。也许要让geom_rect 工作,线条需要笔直。 嗯。我知道了。恐怕我缺乏地理空间知识来完成这项工作,而无需进行一些我缺乏时间的研究。我只能想象我们必须转换条形的坐标并获得直条,我们可能必须使用 geom_polygon。 无论如何我都会将此标记为答案。

以上是关于在R ggplot2中将条形图绘制到地图上的主要内容,如果未能解决你的问题,请参考以下文章

R可视化ggplot2绘制堆叠的条形图(Stacked Barplot)

R语言ggplot2可视化绘制分组水平并行条形图(bar plot)并为条形图内添加标签

R语言可视化包ggplot2绘制分组的条形图(bar plot柱状图)实战:多变量柱状图

R语言ggplot2可视化绘制条形图(bar plot)使用gghighlight包突出高亮条形图中的特定条形(highlight specific bar plot)

R语言可视化包ggplot2绘制排序条形图实战:按照分类因子排序按照数值排序

在R中的单个图上绘制两个变量的条形图和第三个变量的线图