R ggplot2绘制日期折线图报错Discrete value supplied to continuous scale求助
问题根源
你的x轴变量Start.Date为日期类型,但代码中使用了针对数值型变量的scale_x_continuous设置坐标轴,类型不匹配是报错的直接原因。之前可以正常运行大概率是彼时Start.Date被误识别为数值型,重新读取数据后类型变为正确的日期格式,因此触发报错,你之前尝试转换为数值的操作属于走偏了方向,不需要对日期做数值转换。
修复方案
- 绘图前先明确将
Start.Date转换为标准日期格式,避免数据读取带来的类型偏差 - 将原代码中的
scale_x_continuous替换为适配日期类型的scale_x_date - 可清理breaks参数里重复的日期值,避免x轴出现重复标签,同时将手写的y轴刻度替换为更简洁的序列生成写法
修改后完整代码
IHS %>% filter(Start.Date != "2020-11-13", Start.Date != "2021-01-08", Start.Date != "2021-01-15", Start.Date != "2021-05-07") %>% filter(Template != "Campus Event - IHS Tour (VIRTUAL)") %>% # 明确转换日期格式 mutate(Start.Date = as.Date(Start.Date)) %>% ggplot(aes(x = Start.Date)) + geom_line(aes(y = Registrants, color = "Registrants")) + geom_line(aes(y = Attendance, color = "Attendance")) + geom_line(aes(y = No.Show, color = "No.Show")) + theme_classic() + annotate("rect", xmin = as.Date("2020-11-20"), xmax = as.Date("2021-01-22"), ymin = 0, ymax = 14, alpha = .09) + annotate("text", x = as.Date("2020-11-20"), y = 12, label = "No tours\nduring holiday", hjust = -1, vjust = 0.5, size = 3) + annotate("text", x = as.Date("2021-04-09"), y = 26, label = "26", hjust = .5, vjust = -.9, size = 3) + annotate("text", x = as.Date("2021-04-09"), y = 15, label = "15", hjust = .5, vjust = -.9, size = 3) + annotate("text", x = as.Date("2021-04-09"), y = 11, label = "11", hjust = .5, vjust = -.9, size = 3) + labs(x = "Date", y = "Count")+ ggtitle("IHS Tour Registrants, Attendance, and No Show") + # 替换为适配日期的坐标轴函数,同时清理了重复的breaks值 scale_x_date(limits = as.Date(c("2020-09-11","2021-04-30")), breaks = as.Date(c("2020-09-11", "2020-09-18", "2020-09-25", "2020-10-02", "2020-10-11", "2020-10-16", "2020-10-23", "2020-10-30", "2020-11-06", "2020-11-20", "2021-01-22", "2021-01-29", "2021-02-05", "2021-02-12", "2021-02-26", "2021-03-05", "2021-03-12", "2021-03-19", "2021-03-26", "2021-04-09", "2021-04-16", "2021-04-23", "2021-04-30"))) + scale_color_manual(name = "Legend", values = c("#FF8000", "#7A1F2E", "#006699")) + scale_y_continuous(limits = c(0,27), breaks = seq(0,27,1)) + theme(axis.title.y = element_text(angle = 0, vjust = .5)) + theme(legend.position = "top") + theme(axis.title.x = element_text(size=10, face = "bold"), axis.text.x = element_text(size=10, angle = 90), axis.text.y = element_text(angle = 0, size = 9), axis.title.y = element_text(angle=0, size = 10, vjust = .5, face = "bold"))
内容的提问来源于stack exchange,提问作者Stefani
相关产品推荐
相关产品推荐

