R语言ggplot绘制堆叠条形图出现显示异常问题求助
R ggplot2堆叠条形图异常问题修复方案
三个异常的核心诱因:
- y轴数值挤压、填充占比显示错误:
minutes列在构造时被定义为字符型(所有数值加了双引号),R无法将其识别为连续数值做柱高映射,仅按离散文本处理,最终出现高度错乱、占比失真的问题。 - 横轴星期乱序:R对文本类分类变量默认按字母顺序排序,不会自动识别星期的时间先后逻辑,因此会出现不符合日常认知的乱序。
修复步骤
- 加载ggplot2包(运行绘图代码前需先加载包,否则会报错)
- 数据类型修正:将
minutes列从字符型转换为数值型,让ggplot可以正确识别数值大小映射柱高 - 分类顺序修正:将
weekday列转换为有序因子,手动指定星期的排列顺序,固定横轴展示逻辑 - 执行原有绘图代码即可得到正确的堆叠条形图
完整修正后代码
# 加载绘图包 library(ggplot2) # 原始数据构造 activity <- c("mean_fairly_active", "mean_fairly_active", "mean_fairly_active", "mean_fairly_active", "mean_fairly_active", "mean_fairly_active", "mean_fairly_active", "mean_lightly_active", "mean_lightly_active", "mean_lightly_active", "mean_lightly_active", "mean_lightly_active", "mean_lightly_active", "mean_lightly_active", "mean_very_active", "mean_very_active", "mean_very_active", "mean_very_active", "mean_very_active", "mean_very_active", "mean_very_active", "mean_sedentary", "mean_sedentary", "mean_sedentary", "mean_sedentary", "mean_sedentary", "mean_sedentary", "mean_sedentary") minutes <- c("14.3", "13.1", "12.0", "12.1", "15.2", "14.5", "14.0", "197", "190", "185", "204", "207", "174", "192", "23.0", "20.8", "19.4", "20.1", "21.9", "20.0", "23.1", "1007", "989", "962", "1000", "964", "990", "1028") weekday <- c("Sun", "Mon", "Tues", "Wed", "Thurs", "Fri", "Sat", "Sun", "Mon", "Tues", "Wed", "Thurs", "Fri", "Sat", "Sun", "Mon", "Tues", "Wed", "Thurs", "Fri", "Sat", "Sun", "Mon", "Tues", "Wed", "Thurs", "Fri", "Sat") merged_means <- data.frame (activity, minutes, weekday) # 数据修复逻辑 # 1. 转换分钟列为数值类型 merged_means$minutes <- as.numeric(merged_means$minutes) # 2. 固定星期横轴的排序 merged_means$weekday <- factor(merged_means$weekday, levels = c("Sun", "Mon", "Tues", "Wed", "Thurs", "Fri", "Sat")) # 绘图 ggplot(merged_means, aes(x=weekday, y=minutes, fill=activity)) + geom_bar(stat = "identity")
可选优化:如果需要调整填充色块的堆叠顺序,可以将
activity列也转换为有序因子,按你需要的层次指定levels即可,比如按活动强度从低到高设置为c("mean_sedentary", "mean_lightly_active", "mean_fairly_active", "mean_very_active"),展示逻辑会更清晰。
内容的提问来源于stack exchange,提问作者AndreaGH
相关产品推荐
相关产品推荐

