在R语言中如何将多列数据映射到X轴绘制柱状图?
解决ggplot多列数据绘制柱状图的问题
问题根源
你用VeryActiveMinutes:SedentaryMinutes的写法是错误的——这种冒号语法在数值列里会被解释成生成序列(只取第一行的两个值生成区间),而非选择多列。而且ggplot的x美学映射需要的是单个分类变量,不是多列数值,这就是报错提示"Aesthetics must be either length 1 or the same as the data"的核心原因。
另外你提到无需绘制Y轴,但实际上柱状图需要Y轴展示每类活动的分钟数,你可能是想直接用列的数值作为柱子高度,这时候应该用geom_col()(用于展示已有数值),而非默认做计数统计的geom_bar()。
解决方案:将宽格式数据转成长格式
ggplot对长格式数据更友好,先把你的4列活动分钟数转换成「活动类型(分类)」和「分钟数(数值)」两列:
步骤1:安装并加载tidyr包(未安装过的话)
install.packages("tidyr") library(tidyr)
步骤2:转换数据格式
# 把指定的4列转成长格式 activity_long <- activity %>% pivot_longer( cols = VeryActiveMinutes:SedentaryMinutes, # 选择要转换的目标列 names_to = "activity_type", # 生成的分类列名称 values_to = "minutes" # 生成的数值列名称 )
步骤3:绘制柱状图
library(ggplot2) ggplot(data = activity_long) + geom_col(mapping = aes(x = activity_type, y = minutes)) + # 如果不需要显示Y轴标签,可添加这一行 theme(axis.title.y = element_blank())
补充:展示活动时长的平均值
如果你想展示每类活动的平均时长(而非每个观测值单独成柱),可以用stat_summary():
ggplot(data = activity_long) + stat_summary( mapping = aes(x = activity_type, y = minutes), fun = mean, geom = "col" )
内容的提问来源于stack exchange,提问作者Rory Hargaden
相关产品推荐
相关产品推荐

