如何解决ggplot2报错:data必须是dataframe或可被fortify()转换的对象
错误原因分析
你遇到的核心问题是变量覆盖导致数据类型不匹配:
- 第二行读取CSV后,
Project1Data是包含Breakfast和Employment列的数据框 - 第三行代码
Project1Data = ordered(Project1Data$Breakfast, ...)把Project1Data重新赋值成了一个有序因子向量,不再是数据框结构 ggplot()的第一个参数必须是数据框(或可转换为数据框的对象),向量无法满足fortify()的处理要求,因此触发报错
修复方案
不要覆盖原始数据框,而是修改数据框内的目标列,或新增有序因子列:
方案1:直接修改原列(推荐)
library(tidyverse) Project1Data <- read.csv("D:/Project1Data.csv") # 仅将Breakfast列转为有序因子,保留数据框结构 Project1Data$Breakfast <- ordered(Project1Data$Breakfast, levels = c(0,1,2,3,4,5,6,7)) ggplot(Project1Data, aes(x=Breakfast)) + geom_bar(aes(fill=Employment))
方案2:新增有序因子列
如果不想修改原列,可新增一列存储有序因子:
library(tidyverse) Project1Data <- read.csv("D:/Project1Data.csv") # 新增Breakfast_ordered列存储有序因子 Project1Data$Breakfast_ordered <- ordered(Project1Data$Breakfast, levels = c(0,1,2,3,4,5,6,7)) # ggplot使用新列作为x轴 ggplot(Project1Data, aes(x=Breakfast_ordered)) + geom_bar(aes(fill=Employment))
为什么朋友的代码能运行?
大概率是朋友的代码没有覆盖整个数据框:
- 他可能写的是
Project1Data$Breakfast <- ordered(...)(赋值给列,而非覆盖整个数据框) - 或者他运行代码时,
Project1Data变量仍保留着之前的数据框状态(比如未重新执行覆盖变量的代码)
内容的提问来源于stack exchange,提问作者Gia
相关产品推荐
相关产品推荐

