R语言ggplot2如何创建与数据无关的自定义图例
ggplot2自定义无数据映射图例实现方法
ggplot2完全支持创建与数据集无映射关系的自定义图例,无需借助Photoshop等第三方软件后期处理,针对你给出的ggmap空间绘图场景,有两种常用实现方案,可直接复用修改。
方案1:手动注释法(和PS手动加图例逻辑完全一致)
直接在图幅的空白位置通过annotate()函数添加点、文本元素,组合成你需要的图例样式,所有元素的位置、样式可以自由调整,不需要绑定任何数据映射。
修改后的完整可运行代码如下:
library(ggplot2) library(ggmap) # 基础地图加载 bas = get_stamenmap(c(-6.3, 53.25, -6, 53.40), zoom=7, maptype="terrain-background") mp <- ggmap(bas) # 点位数据 locs <- data.frame( lon_dec = c(-6.04015), lat_dec = c( 53.3345)) # 绘图+自定义图例 (big_map <- mp + geom_point(data=locs, aes(x=lon_dec, y=lat_dec), size = 2) + annotate(geom = "text", x = -6.04015, y = 53.3395, label = "1,2,3") + # 以下为自定义图例部分,坐标可根据实际图幅调整 annotate("point", x = -6.27, y = 53.38, size = 2) + annotate("text", x = -6.25, y = 53.38, label = "1 - A", hjust = 0) + annotate("point", x = -6.27, y = 53.365, size = 2) + annotate("text", x = -6.25, y = 53.365, label = "2 - B", hjust = 0) + annotate("point", x = -6.27, y = 53.35, size = 2) + annotate("text", x = -6.25, y = 53.35, label = "3 - C", hjust = 0) + # 关闭裁剪、调整边距避免图例被遮挡 coord_sf(clip = "off") + theme(plot.margin = margin(r = 20, unit = "pt")) )
方案2:空映射生成ggplot标准侧边栏图例
如果需要ggplot默认的右侧浮动标准图例样式,可以通过构造空的美学映射实现:将图例分类传入aes()中,把对应几何元素的透明度设为0(不在主图中显示冗余元素),再手动指定图例的标签、样式即可,同样不需要绑定实际数据集字段。
示例代码如下:
(big_map_legend <- mp + geom_point(data=locs, aes(x=lon_dec, y=lat_dec), size = 2) + annotate(geom = "text", x = -6.04015, y = 53.3395, label = "1,2,3") + # 构造空映射,alpha设为0隐藏主图中的冗余点 geom_point(aes(x = lon_dec, y = lat_dec, color = c("1-A","2-B","3-C")), data = locs, alpha = 0) + # 手动指定图例显示内容 scale_color_manual(values = rep("black", 3), name = "类别说明", labels = c("1 - A", "2 - B", "3 - C")) + theme(legend.position = "right") )
两种方案都可以实现无数据绑定的自定义图例效果,第一种自由度更高,可以自由调整图例的摆放位置、样式,第二种更贴合ggplot默认的图例视觉风格,可根据自己的需求选择。
内容的提问来源于stack exchange,提问作者Amin Shn
相关产品推荐
相关产品推荐

