如何在ggplot2/ggmap中为月度incidence地图设置固定颜色比例尺
解决GGmap月度地图颜色比例尺不统一的问题
我看了你的代码,问题出在每个子图的颜色映射会自动适配当前月份的hour数据范围,所以有的月份刻度少、有的刻度多,颜色条没法统一。要让所有地图用同一个颜色比例尺,只需要在scale_color_viridis_c里加上limits = c(0, 23)参数,强制固定数值范围就行。
下面是修改后的完整代码,我保留了你原有的所有逻辑,只加了关键的一行:
library(ggmap) library(sp) # 数据预处理 murder <- subset(crime, offense == "murder") murder <- SpatialPointsDataFrame( murder[,c("lon", "lat")], data=murder, proj4string = CRS("+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0") ) # 获取Stamen底图 p <- ggmap(get_stamenmap( bbox=c(left=min(murder$lon), bottom=min(murder$lat), right=max(murder$lon), top=max(murder$lat)), zoom=12 )) # 提取唯一月份并过滤数据(保留你原有的过滤规则) d <- unique(murder$month) murder <- murder[!(murder$month=="january" & murder$hour>0 & murder$hour<17),] murder <- murder[!(murder$month=="february" & murder$hour>110 & murder$hour<24),] murder <- murder[!(murder$month=="march" & murder$hour>12 & murder$hour<17),] # 循环生成月度地图 for (i in d){ murder2 <- murder[murder$month==i,] mapa <- p + geom_point( data=murder2@data, aes(x=murder2@coords[,1], y=murder2@coords[,2], color=as.numeric(hour)), alpha=0.5, size=7 ) + scale_color_viridis_c( option="C", # 关键:固定颜色映射的数值范围,确保所有地图用同一比例尺 limits = c(0, 23), breaks=c(0,2,4,8,12,16,20,23), labels=c("00:00","02:00", "04:00","08:00","12:00","16:00","20:00","23:00"), name="Hour", guide=guide_legend( keyheight = unit(3, units = "mm"), keywidth=unit(6, units = "mm"), label.position = "bottom", title.position = 'top', nrow=1, label.theme=element_text(size = 6, face = "bold", color = "grey2", family = "Gotham"), title.theme=element_text(size = 6, face = "bold", color = "grey2", family = "Gotham", hjust=0.5) ) ) ggsave(filename=paste0(i,".png"), plot=mapa, bg="transparent", width=15, height=15, units="cm", dpi=200) }
为什么这样修改?
limits = c(0, 23)会强制所有地图的颜色映射范围固定在0到23,不管当前月份的hour数据有没有覆盖全这个区间。- 你已经用
breaks指定了要显示的8个刻度值,结合limits后,所有地图的颜色条都会完整显示这8个刻度,不会因为某个月份缺少数据就收缩或改变刻度位置。
这样生成的所有PNG图颜色比例尺就完全一致了,后续制作GIF动画时视觉效果会统一很多。
内容的提问来源于stack exchange,提问作者Armando González Díaz
相关产品推荐
相关产品推荐

