我试图创建一个美国的等值线,并希望为小东海岸州添加标签,如下例所示:
我用于地图的代码是
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
范围内的一大块 - 我无法保证它会为我想制作的每张地图。
制作这样的标签是否有一种不那么特别的方式,它不会产生第二个图例并使用它自己的颜色范围?或者,如果没有,有没有办法删除第二个图例并将标签颜色绑定到地图上的状态颜色?
编辑:我已经弄明白了如何删除第二个图例(gg <- gg + guides(color=FALSE)
做了诀窍),但仍然存在地图的色标和点的色阶不同的问题
答案 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_point
和geom_text
中的数据规范。我认为错误意味着在没有指定数据的情况下,它会尝试使用数据作为地图,但我不是要求它对数据做任何事情 - 只是为了绘制点。所以我对ggplot的理解可能还有差距。