R语言ggplot2绘制月度读书完成量柱状图报错求助
解决ggplot绘制日期柱状图的"date_trans works with objects of class Date only"报错
核心问题与修正步骤
报错的直接原因是你用来做x轴的mon列不是Date类对象,scale_x_date只能处理标准的Date类型数据。同时你的代码还有几处语法和参数错误,下面一步步修正:
修正包名与依赖
你加载的ggplot是错误的,正确的包名是ggplot2;另外date_format需要scales包支持,所以先加载正确的包:library(ggplot2) library(scales)将日期列转换为Date类型
不管你的mon是"YYYY-MM-DD"还是"YYYY-MM"格式,都要转成Date类:- 如果是完整日期(如"2023-05-12"):
data$mon <- as.Date(data$mon) - 如果是年月格式(如"2023-05"),补充当月第一天来转换:
data$mon <- as.Date(paste0(data$mon, "-01")) - 嫌麻烦可以用
lubridate包自动识别格式:library(lubridate) data$mon <- ymd(data$mon)
- 如果是完整日期(如"2023-05-12"):
修正geom_bar的参数错误
你写的aes('Book finished')是无效的,分两种情况处理:- 如果你是原始数据(每一行对应一本完成的书):直接用
geom_bar()即可,它会自动统计每个月份的数量 - 如果你已经按月份汇总好数据(有一列比如
count记录数量):需要指定y轴并设置stat="identity"
- 如果你是原始数据(每一行对应一本完成的书):直接用
修复语法错误
theme()前面少了一个+号,这会导致代码无法正确拼接图层
完整示例代码
情况1:原始数据(每一行是一本完成的书)
library(ggplot2) library(scales) # 转换日期列 data$mon <- as.Date(data$mon) # 绘图 book_finished_plot <- ggplot(data, aes(x = mon)) + geom_bar(width = 20, fill = "#4285F4") + scale_x_date(date_breaks = "1 month", labels = date_format("%m")) + theme(axis.text.x = element_text(angle = 90, vjust = 0.5)) + labs(x = "月份", y = "完成书籍数量", title = "每月读书完成量统计") print(book_finished_plot)
情况2:已汇总的月度数据(有count列)
library(ggplot2) library(scales) library(dplyr) # 先转换日期并汇总(如果还没做的话) data_summary <- data %>% mutate(mon = as.Date(paste0(mon, "-01"))) %>% count(mon, name = "finished_count") # 绘图 book_finished_plot <- ggplot(data_summary, aes(x = mon, y = finished_count)) + geom_bar(stat = "identity", width = 20, fill = "#34A853") + scale_x_date(date_breaks = "1 month", labels = date_format("%m")) + theme(axis.text.x = element_text(angle = 90, vjust = 0.5)) + labs(x = "月份", y = "完成书籍数量", title = "每月读书完成量统计") print(book_finished_plot)
内容的提问来源于stack exchange,提问作者Lcha
相关产品推荐
相关产品推荐

