如何在R中将离散格式的Year、Hour列转为连续数据以解决绘图报错
解决ggplot报错"Error: Discrete value supplied to continuous scale"的问题
你的YEAR(格式如"2001/02")和HOUR(格式如"01-02")列都是字符型离散值,但geom_line、geom_histogram这类图层默认要求x轴是连续数值型,这就是报错的核心原因。以下是针对性的修正方案:
一、处理Year列并修复绘图代码
先把字符型年份转换成连续数值,提供两种常用处理方式:
# 方法1:提取年份前4位转数值(适用于"2001/02"代表2001年的场景) review_data$YEAR_NUM <- as.numeric(substr(review_data$YEAR, 1, 4)) # 方法2:转成学年中间值(适用于"2001/02"代表2001-2002学年的场景) review_data$YEAR_NUM <- apply(strsplit(review_data$YEAR, "/"), 1, function(x) { mean(as.numeric(x) + 2000) # 若后两位"02"代表2002,可根据实际数据调整 })
修正后的绘图代码(修复原代码的y轴逻辑错误,补充geom_line分组设置):
ggplot(review_data, aes(x = YEAR_NUM, colour = CAUSE)) + geom_point() + geom_line(aes(group = CAUSE)) + # 按CAUSE分组,避免不同类别点乱连 labs(title = "Incidents", subtitle = "By year and cause", x = "Year", y = "Incident Count") + # 原y轴设为"Cause"逻辑错误,改为事件数量 scale_colour_brewer(palette = "Dark2", name = "Cause Type") + # 保留图例标签更清晰 theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
二、处理Hour列并修复绘图代码
先把时段字符串转成连续数值:
# 方法1:提取时段起始小时转数值 review_data$HOUR_START <- as.numeric(substr(review_data$HOUR, 1, 2)) # 方法2:转成时段中间值(如"01-02"转为1.5) review_data$HOUR_MID <- apply(strsplit(review_data$HOUR, "-"), 1, function(x) { mean(as.numeric(x)) })
修正后的绘图代码(修复原代码语法错误,适配fill参数的离散要求):
ggplot(review_data, aes(x = HOUR_MID, fill = as.factor(NUMBER))) + geom_histogram(binwidth = 1, colour = "black") + scale_fill_brewer(palette = "Dark2", name = "Number Category") + theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1)) + labs(title = "Number per hour", x = "Hour of Day")
说明:原代码中
ggplot(review_data) = mapping = aes(...)是语法错误,必须改成ggplot(review_data, aes(...))的形式;如果NUMBER是连续数值,需用as.factor()转成离散因子,才能适配scale_fill_brewer。
内容的提问来源于stack exchange,提问作者ecm1710
相关产品推荐
相关产品推荐

