因子化数据两列后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
相关产品推荐
相关产品推荐

