如何使用R和ggplot绘制Zoom会议全程在线参会人数变化图
Zoom会议同时在线人数可视化实现方案
完全可以基于你现有的join.time、leave.time数据实现需求,以下是具体操作逻辑和代码:
核心思路
每个用户的入会动作会使在线人数+1,退会动作会使在线人数-1,把所有动作按时间排序后计算累计值,就能得到任意时间点的同时在线人数。你可以选择两种统计方式:
- 事件触发式:精确对应用户入会退会的时间点,人数变化为阶梯状
- 时间切片式:按固定时间间隔(如1分钟、5分钟)统计区间内的端点在线人数,曲线更平滑,适合长会议场景
具体实现代码
1. 加载依赖包
# 用到tidyverse做数据处理,ggplot2做可视化,lubridate处理时间格式 library(tidyverse) library(lubridate)
2. 数据处理(事件触发式)
# 构造事件表:区分入会/退会事件,标记人数变化值 event_df <- DF %>% select(join.time, leave.time) %>% pivot_longer(cols = everything(), names_to = "event_type", values_to = "time") %>% mutate(count = ifelse(event_type == "join.time", 1, -1)) %>% # 按时间排序后计算累计在线人数 arrange(time) %>% mutate(online_num = cumsum(count))
3. 数据处理(时间切片式,更常用)
# 生成覆盖会议全程的时间序列,可自定义间隔为"5 min"、"10 min"等 time_seq <- seq(from = min(DF$join.time), to = max(DF$leave.time), by = "1 min") # 统计每个时间切片点的在线人数 online_stat <- tibble(time = time_seq) %>% rowwise() %>% mutate(online_num = sum(DF$join.time <= time & DF$leave.time >= time))
4. 绘制可视化图表
以时间切片式的统计结果为例,绘制带填充的折线图:
ggplot(online_stat, aes(x = time, y = online_num)) + # 折线层 geom_line(color = "#1f77b4", linewidth = 1.2) + # 面积填充层,可根据需要删除 geom_area(fill = "#aec7e8", alpha = 0.5) + # 坐标轴和标题配置 labs( x = "会议时间", y = "同时在线人数", title = "Zoom会议实时在线人数趋势" ) + # 时间轴格式化,按1小时展示刻度 scale_x_datetime(date_labels = "%H:%M", date_breaks = "1 hour") + theme_bw()
如果想要直方图样式,把geom_line替换为geom_col即可。
内容的提问来源于stack exchange,提问作者Signe Hagner
相关产品推荐
相关产品推荐

