在ggplot中面对多个数据集:如何设置比例

时间:2014-03-31 20:47:33

标签: r ggplot2 maps facet-wrap

我试图做一些看似在ggplot中应该相当简单的事情。我怀疑我没有找到正确的条款,因此没有任何显示。基本上我从一个数据框中获取数据,在另一个数据框中映射数据。我希望facet_wrap函数在确定适当的比例时忽略地图数据框中的数据。这是一些可重现的代码:

mapdata <- map_data("world")
df1 <- data.frame(category="A", lon=rnorm(20, -160, 3), lat=rnorm(20, 55, 3))
df2 <- data.frame(category="B", lon=rnorm(20, -130, 3), lat=rnorm(20, 52, 3))
df <- rbind(df1, df2)
g <- ggplot() + geom_point(data=df, aes(lon, lat)) + facet_wrap("category", scales="free")

Points without the maps 但现在,如果我尝试向每个构面添加一个地图,它将使用两个数据集中的范围。

g + geom_polygon(data=mapdata, aes(x=long, y=lat, group=group))

Points with the maps

如何在计算限制时告诉ggplot仅使用数据框df?基本上我想将这些子图集中在点上,但是有一张地图显示它们的位置。任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:0)

先前对issue进行了评论,因此没有本地方式这样做。子集可能是你最好的选择。将类别添加到mapdatafacet_wrap足够智能,可以分隔不同类别的限制。

mapdata$category <- ifelse(
  findInterval(mapdata$lon, range(df1$lon)) == 1 & 
    findInterval(mapdata$lat, range(df1$lat)) == 1, 
  "A",
  ifelse(
    findInterval(mapdata$lon, range(df2$lon)) == 1 & 
      findInterval(mapdata$lat, range(df2$lat)) == 1,
    "B",
    NA)
)

g + geom_polygon(data=mapdata[!is.na(mapdata$category), ], aes(x=long, y=lat, group=group))

enter image description here

需要做一些额外的工作才能使它看起来很漂亮(可能是一个更大的子集区域?),但你明白了。