You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:56:14