ggplot中show.legend结合命名向量未达预期效果求助
问题:ggplot中仅保留单个colour图例的解决方案
问题描述
在同一ggplot绘图中,使用geom_polygon、geom_curve和geom_point设置了多个colour参数,希望仅显示geom_point的colour图例,但按文档设置show.legend后,geom_curve的colour图例未被隐藏,反而与geom_point的colour图例合并。
初始绘图代码:
ggplot() + geom_polygon(data = globe, aes(x=long, y = lat, group = group), colour = 'black', fill = NA)+ geom_curve(data = mapdata, aes(x = long.x, y = lat.x, xend = long.y, yend = lat.y, size=varA,alpha=0.01, colour="#FFFFFF"), show.legend=c(size=TRUE,colour=FALSE,alpha=FALSE))+ geom_point(data=mapdata,aes(x=long.x,y=lat.x, colour=varB, size=VarC))+ coord_equal()
附可复现数据集:
mapdata<-structure(list(lat.x = c(42.69, 42.69, 42.69, 42.69, 42.69, 42.69, 42.69, 42.69, 42.69, 42.69, 42.69, 42.69, 42.69, 42.69, 42.69, 42.69, 42.69, 42.69, 42.69, 42.69, 42.69, 42.69, 42.69, 42.69, 42.69, 42.69, 42.69, 42.69, 42.69, 42.69), long.x = c(23.31, 23.31, 23.31, 23.31, 23.31, 23.31, 23.31, 23.31, 23.31, 23.31, 23.31, 23.31, 23.31, 23.31, 23.31, 23.31, 23.31, 23.31, 23.31, 23.31, 23.31, 23.31, 23.31, 23.31, 23.31, 23.31, 23.31, 23.31, 23.31, 23.31), capital.x = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), VarC = c(31656.6425968, 31656.6425968, 31656.6425968, 31656.6425968, 31656.6425968, 31656.6425968, 31656.6425968, 31656.6425968, 31656.6425968, 31656.6425968, 31656.6425968, 31656.6425968, 31656.6425968, 31656.6425968, 31656.6425968, 31656.6425968, 31656.6425968, 31656.6425968, 31656.6425968, 31656.6425968, 31656.6425968, 31656.6425968, 31656.6425968, 31656.6425968, 31656.6425968, 31656.6425968, 31656.6425968, 31656.6425968, 31656.6425968, 31656.6425968), lat.y = c(52.52, 52.52, 52.52, 52.52, 39.93, 39.93, 41.72, 33.72, 14.72, 50.43, 34.02, -1.29, NA, 14.63, 33.88, 36.84, 40.17, 44.83, 31.78, 40.39, 29.38, NA, 48.16, 53.33, 45.8, 50.83, 59.44, 40.42, 40.39, 14.63 ), long.y = c(13.38, 13.38, 13.38, 13.38, 32.85, 32.85, 44.79, 73.06, -17.48, 30.52, -6.84, 36.82, NA, -90.55, 35.5, 10.22, 44.52, 20.5, 35.22, 49.86, 47.99, NA, 17.13, -6.25, 15.97, 4.33, 24.74, -3.71, 49.86, -90.55), varA = c(2.6657688088456, 2.6657688088456, 2.6657688088456, 2.6657688088456, 4.44265125649032, 4.44265125649032, 5.43372200355424, 9.06508335931904, 6.87212810133899, 6.04500531403601, 6.73696695800186, 6.14846829591765, 6.89365635460264, 3.95124371858143, 5.04985600724954, 2.39789527279837, 4.89034912822175, 2.07944154167984, 5.68697535633982, 5.78074351579233, 2.39789527279837, 7.87473912517181, 4.969813299576, 2.89037175789616, 3.25809653802148, 9.3461815948876, 0.693147180559945, 0.693147180559945, 5.78074351579233, 3.95124371858143 ), varB = structure(c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("(-1e-05,4.82e+04]", "(4.82e+04,8.22e+05]", "(8.22e+05,2.28e+06]", "(2.28e+06,5.63e+06]", "(5.63e+06,1.69e+07]", "(1.69e+07,6.91e+07]", "(6.91e+07,1.14e+08]"), class = "factor")), row.names = c(NA, -30L), class = c("tbl_df", "tbl", "data.frame"))
错误原因
- 不必要的美学映射:
geom_curve中的colour="#FFFFFF"被放在aes()内部,会被ggplot识别为固定值的美学映射,而非直接设置颜色属性。即使设置show.legend=c(colour=FALSE),由于该映射与geom_point的colour映射共享同一美学名称,ggplot会自动合并两个图例。 show.legend的作用限制:仅当美学属性在aes()内作为映射时,show.legend才会生效;若存在同名的其他图层映射,仅靠show.legend=FALSE无法阻止图例合并。
解决方案
将geom_curve的固定颜色设置移出aes(),作为图层直接参数,这样不会创建colour的美学映射,自然不会生成对应图例。同时保留show.legend控制size图例的显示:
修正后的代码:
library(ggplot2) library(maps) # 生成世界地图数据 globe <- map_data("world") ggplot() + # 绘制世界地图轮廓 geom_polygon(data = globe, aes(x=long, y = lat, group = group), colour = 'black', fill = NA)+ # 绘制曲线,将colour移出aes设置为固定值 geom_curve(data = mapdata, aes(x = long.x, y = lat.x, xend = long.y, yend = lat.y, size=varA, alpha=0.01), colour="#FFFFFF", show.legend=c(size=TRUE, alpha=FALSE))+ # 绘制点,保留colour映射 geom_point(data=mapdata,aes(x=long.x,y=lat.x, colour=varB, size=VarC))+ coord_equal()
相关文档内容翻译
ggplot2中,show.legend参数可设为逻辑值(TRUE/FALSE)或命名逻辑向量,用于控制各美学属性是否显示图例:
- 单个逻辑值:控制整个图层是否显示图例;
- 命名逻辑向量:可针对每个美学属性单独设置显示状态。
注意:仅当美学属性在aes()内作为映射时,show.legend才会生效;直接设置的固定属性(如移出aes()的colour)不会生成图例项,无需额外设置。
内容的提问来源于stack exchange,提问作者hamagust
相关产品推荐
相关产品推荐

