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
相关产品推荐
相关产品推荐

