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

因子化数据两列后ggplot堆叠图数据错位,求问题排查指导

问题原因与修正方案

问题根源

你对Stage列做因子化时犯了一个常见错误:仅指定了labels参数,未设置levels。

R默认会将原始Stage的取值按字母顺序生成因子水平(即A, E, L, P),再用你传入的labels = c('E', 'L', 'P', 'A')依次替换这些水平。这相当于把原始的A映射成E、E映射成L、L映射成P、P映射成A,直接打乱了数据与标签的对应关系,导致绘图时数据错位。

修正方案

正确的做法是同时指定levels和labels,让因子水平与原始数据的取值一一对应(若标签与原始值一致,可简化为仅指定levels):

方法1:明确指定levels与labels

food <- food |> 
  mutate(Foods = factor(Foods, levels = sort(unique(Foods)))) |> 
  mutate(Stage = factor(Stage, levels = c('E', 'L', 'P', 'A'), labels = c('E', 'L', 'P', 'A')))

方法2:简化版(labels与原始值一致时)

food <- food |> 
  mutate(Foods = factor(Foods, levels = sort(unique(Foods)))) |> 
  mutate(Stage = factor(Stage, levels = c('E', 'L', 'P', 'A')))

方法3:用forcats包更直观调整顺序

library(forcats)
food <- food |> 
  mutate(Foods = fct_relevel(Foods, sort(unique(Foods)))) |> 
  mutate(Stage = fct_relevel(Stage, 'E', 'L', 'P', 'A'))

执行上述任意一种修正后,再运行绘图代码,数据就能正确对应堆叠顺序了:

food |> ggplot(aes(Foods, Mean, fill = Stage)) + geom_bar(stat = 'identity', position = 'stack')

内容的提问来源于stack exchange,提问作者Vinod

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 05:40:08