You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 07:04:51