如何为Plotly scattermapbox设置多色以展示数值高低
解决Scatter Map Box颜色映射数值高低的问题
你当前的代码存在几个关键问题,导致无法实现「用颜色展示数值高低差异」的需求:
- 对字符串字段
start.station.name计算percent_rank没有意义,颜色映射需要绑定数值型字段(比如骑行时长、站点骑行次数) - Plotly的
scattermapbox中,颜色映射不是通过marker=list(colors='rainbow')设置,而是要通过color参数指定映射的数值列,搭配colorscale指定配色方案 - 直接使用单条骑行记录绘图会导致同一站点多个点重叠,可视化效果混乱
以下是两种可行的修改方案,按需选择:
方案1:按站点聚合数据(推荐)
先对站点进行聚合计算(比如平均骑行时长、总骑行次数),再用聚合后的数据绘图,避免同站点多点重叠:
# 1. 按站点聚合,计算核心数值指标 station_data <- JCCitiBike %>% select(start.station.id, start.station.name, latitude, longitude, tripduration) %>% group_by(start.station.id, start.station.name, latitude, longitude) %>% summarise( avg_tripduration = mean(tripduration, na.rm = TRUE), # 平均骑行时长 total_trips = n(), # 站点总骑行次数 .groups = "drop" ) %>% filter(total_trips > 10) # 可选:过滤骑行次数过少的站点,减少噪音 # 2. 绘制带颜色映射的散点地图 p1 <- station_data %>% plot_ly( type = 'scattermapbox', lat = ~latitude, lon = ~longitude, color = ~avg_tripduration, # 绑定要展示数值高低的字段(这里用平均骑行时长) colorscale = 'rainbow', # 指定配色方案,还可选择'viridis'/'RdYlBu'等 colorbar = list(title = "平均骑行时长"), # 显示颜色条,标注数值对应关系 marker = list( size = ~total_trips/10, # 可选:让点的大小和总骑行次数关联 opacity = 0.7 ), text = ~paste0( "站点:", start.station.name, "<br>", "平均时长:", round(avg_tripduration, 1), "<br>", "总骑行次数:", total_trips ) ) %>% layout( mapbox = list(style = 'open-street-map', zoom =7, center = list(lon = -74, lat = 41)), title = "站点平均骑行时长分布" ) p1
方案2:直接使用过滤后的单条记录
如果坚持用你原来过滤的tripduration>3100的单条数据,只需调整颜色绑定逻辑即可:
cityb1 <- filter(cityb, tripduration>3100) p1 <- cityb1 %>% plot_ly( type = 'scattermapbox', lat = ~latitude, lon = ~longitude, color = ~tripduration, # 直接绑定骑行时长数值 colorscale = 'rainbow', colorbar = list(title = "骑行时长"), marker = list(size=15, opacity=0.7), text = ~paste0("站点:", start.station.name, "<br>骑行时长:", tripduration) ) %>% layout(mapbox = list(style = 'open-street-map', zoom =7, center = list(lon = -74, lat = 41))) p1
内容的提问来源于stack exchange,提问作者J R
相关产品推荐
相关产品推荐

