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

R语言ggplot密度图添加车辆分箱均值与右侧次坐标轴方法咨询

实现方案

首先需要先预计算指定时间分箱下的车辆均值,再通过坐标轴映射比例将均值结果匹配到现有密度图的Y轴范围,最后添加次坐标轴还原真实的均值数值,完整实现代码如下:

前置依赖

需要先加载 tidyverse 系列包:

library(tidyverse)

步骤1:预计算分箱车辆均值

你可以根据需求调整分箱宽度、均值的计算逻辑:

# 按time_rad每1单位为一个分箱计算均值
speed_bin_mean <- speed %>%
  # 调整breaks参数的by值即可修改分箱宽度
  mutate(time_bin = cut(time_rad, breaks = seq(0, 2*pi, by = 1), include.lowest = TRUE)) %>%
  group_by(time_bin) %>%
  summarise(
    # 取分箱中点作为绘图的X坐标
    time_mid = (min(time_rad) + max(time_rad)) / 2,
    # 这里计算的是分箱内的日均车辆数,如果你需要车辆长度均值,替换为car_mean = mean(LENGTH)即可
    car_mean = n() / n_distinct(SOURCE_DATE)
  )

# 计算坐标轴缩放系数,将车辆均值范围匹配到密度值的范围
max_density <- max(
  # 计算动物到访密度的最大值
  layer_data(ggplot(df, aes(x=TimeRad_enter1)) + geom_density(aes(color=Focal_species)))$y,
  # 计算车辆密度的最大值
  layer_data(ggplot(speed, aes(x=time_rad)) + geom_density())$y
)
max_car <- max(speed_bin_mean$car_mean)
scale_factor <- max_density / max_car

步骤2:完整绘图代码

ggplot() +
  # 原有动物到访密度图层
  geom_density(data = df, aes(x = TimeRad_enter1, color = Focal_species)) +
  # 原有车辆密度图层
  geom_density(data = speed, aes(x = time_rad), color = "black") +
  # 新增车辆均值展示图层,这里用红色折线展示,也可以替换为柱状图
  geom_line(data = speed_bin_mean, aes(x = time_mid, y = car_mean * scale_factor), 
            color = "darkred", linewidth = 1) +
  # 基础标签设置
  labs(y = "密度", x = "时段", title = "全天到访量密度分布", color = "目标物种") +
  # X轴时间标签设置
  scale_x_continuous(labels = c("00:00", "07:38", "15:16", "22:56"), limits = c(0, 2*pi)) +
  # Y轴+次坐标轴设置
  scale_y_continuous(
    sec.axis = sec_axis(~ . / scale_factor, name = "日均车辆数")
  ) +
  # 主题设置
  theme(
    axis.text = element_text(size = 16, color = "black"),
    text = element_text(family = "serif"),
    title = element_text(size = 20),
    legend.text = element_text(size = 14),
    # 可选:单独设置次坐标轴样式和均值展示色统一
    axis.title.y.right = element_text(color = "darkred"),
    axis.text.y.right = element_text(color = "darkred")
  )

可调整参数说明

  • 分箱宽度:修改cut(time_rad, breaks = seq(0, 2*pi, by = 1))中的by值即可,数值越小分箱越细
  • 均值展示样式:将geom_line替换为geom_col即可用柱状图展示均值,可添加alpha参数调整透明度避免遮挡密度线
  • 均值计算规则:修改summarise中car_mean的计算逻辑即可适配你需要的均值类型

内容的提问来源于stack exchange,提问作者Isak Holmberg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 01:27:02