如何在R中利用给定数据集创建按时间(月/年)统计的散点图
解决按月统计盗窃次数的散点图问题
问题根源
你之前的代码生成平线是因为:
- 原始代码中
y = offense用的是字符型变量,所有数据的offense值都是Motor Vehicle Theft,ggplot会将其视为单一离散值,导致所有点堆叠在同一水平线上。 - 你尝试转换
offense的方式有误:seattle_thefts$offense <- mutate(...)错误地将整个数据框赋值给单个列,正确的赋值应该更新整个数据框,不过其实这一步完全可以省略。
正确实现步骤
我们需要先按月聚合数据,统计每个月的盗窃次数,再基于聚合后的数据绘制散点图:
- 加载所需包
library(dplyr) library(lubridate) library(ggplot2)
- 按月聚合盗窃次数
用floor_date将时间戳转换为当月第一天,再统计每个月的事件数量:
monthly_thefts <- seattle_thefts %>% # 提取每个事件对应的月份 mutate(month = floor_date(report_date_time, "month")) %>% # 按月份分组,统计次数 count(month, name = "sum_of_thefts")
或者用group_by + summarize的写法,效果完全一致:
monthly_thefts <- seattle_thefts %>% group_by(month = floor_date(report_date_time, "month")) %>% summarize(sum_of_thefts = n()) # n()直接统计组内行数,无需提前转换offense
- 绘制散点图
基于聚合后的数据集,x轴为月份,y轴为当月盗窃次数:
ggplot(monthly_thefts, aes(x = month, y = sum_of_thefts)) + geom_point(size = 3) + # 可根据需求调整点的大小 labs( x = "月份", y = "机动车盗窃次数", title = "西雅图每月机动车盗窃次数统计" ) + theme_minimal() # 可选主题,让图表更美观
额外说明
如果想展示每日/每个时间点的事件,同时x轴按月划分,可以直接用原始数据,但需要将x轴按月份格式化:
ggplot(seattle_thefts, aes(x = report_date_time, y = 1)) + geom_point() + scale_x_datetime(date_breaks = "1 month", date_labels = "%Y-%m") + labs(x = "月份", y = "事件标记", title = "西雅图机动车盗窃事件时间分布")
但这种方式仅展示事件存在性,无法直观体现每月次数,所以优先推荐聚合后绘制散点图的方案。
内容的提问来源于stack exchange,提问作者Kyle F
相关产品推荐
相关产品推荐

