ggplot,标记美国东部沿海的小型海岸国家,浮动彩色标记

时间:2015-10-16 16:29:29

标签: r ggplot2 maps

我试图创建一个美国的等值线,并希望为小东海岸州添加标签,如下例所示:

example map, showing the value for the small east coast states as labelled dots in the atlantic

我用于地图的代码是

gg <- ggplot()
gg <- gg + geom_map(data = usfix, map = usfix, 
                    aes(x=long, y=lat, map_id=id), 
                    fill="#ffffff", color="#ffffff", size=0.15)
gg <- gg + geom_map(data = state.avg, map=usfix, 
                    aes(fill = score, map_id=id), 
                    color="#ffffff", size=0.15)
gg <- gg + labs(x=NULL, y=NULL)
gg <- gg + theme(panel.border = element_blank())
gg <- gg + theme(panel.background = element_blank())
gg <- gg + theme(axis.ticks = element_blank())
gg <- gg + theme(axis.text = element_blank())
gg <- gg + theme(panel.grid = element_blank())
gg <- gg + theme(legend.position = c(.15,.7))
gg <- gg + coord_fixed()
gg

我试图将标签添加为新的点图层

gg <- gg + geom_point(aes(x=2500000,y=(-1:4)*(-100000), color = percentile), 
                      data=state.avg[state.avg$STATE_CODE %in% 
                      c("MA", "RI", "CT", "NJ", "DE", "MD"),])
gg <- gg + geom_text(data = state.avg[state.avg$STATE_CODE %in% 
                     c("MA", "RI", "CT", "NJ", "DE", "MD"),], 
                     aes(label = STATE_CODE, x=2600000,y=(-1:4)*(-100000)),
                     hjust=0, size = 4)

但是这会产生第二个图例,并且还会将状态标签点的颜色与状态颜色略有不同(如果这六个状态的percentile没有&# 39; t跨越全国percentile范围内的一大块 - 我无法保证它会为我想制作的每张地图。 enter image description here

制作这样的标签是否有一种不那么特别的方式,它不会产生第二个图例并使用它自己的颜色范围?或者,如果没有,有没有办法删除第二个图例并将标签颜色绑定到地图上的状态颜色?

编辑:我已经弄明白了如何删除第二个图例(gg <- gg + guides(color=FALSE)做了诀窍),但仍然存在地图的色标和点的色阶不同的问题

1 个答案:

答案 0 :(得分:1)

根据hrbrmster的优秀建议,我使用ggplot_build()解决了问题如下:

利用str {utils}ggplot_build(gg)对象中导航,我发现每个州的颜色都在ggplot_build(gg)$data[[2]]$fill,状态标签在ggplot_build(gg)$data[[2]]$map_id }。因此,我可以使用

获得犹他州的颜色
ggplot_build(gg)$data[[2]]$fill[which(ggplot_build(gg)$data[[2]]$map_id == 'utah')]

因此,我可以用

为东海岸各州的点着色
state.getcolor <- function(x) {
  ggplot_build(gg)$data[[2]]$fill[which(ggplot_build(gg)$data[[2]]$map_id == x)]
}
eastcoast.colors <- sapply(c("massachusetts", "rhode island", "connecticut", "new jersey", 
                           "delaware", "maryland", "district of columbia"), state.getcolor)

并将其传递到geom_point图层

gg <- gg + geom_point(aes(x=2500000, y=(-1:5)*(-100000)), color = eastcoast.colors, 
                      data = state.avg[state.avg$STATE_CODE %in% 
                      c("MA", "RI", "CT", "NJ", "DE", "MD", "DC"),])
gg <- gg + geom_text(aes(label = c("MA", "RI", "CT", "NJ", "DE", "MD", "DC"), 
                     x=2600000, y=(-1:5)*(-100000)), hjust=0, size=3, 
                     data = state.avg[state.avg$STATE_CODE %in% 
                     c("MA", "RI", "CT", "NJ", "DE", "MD", "DC"),])

我仍然不完全确定为什么它失败并出现错误“data.frame中的错误(x = 2500000,y = c(1e + 06,0,-1e + 06,-2e + 06,-3e + 06) ,:   参数意味着不同的行数:1,7,71“当我尝试删除geom_pointgeom_text中的数据规范。我认为错误意味着在没有指定数据的情况下,它会尝试使用数据作为地图,但我不是要求它对数据做任何事情 - 只是为了绘制点。所以我对ggplot的理解可能还有差距。

相关问题