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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 12:20:30