如何在R中绘制分组条形图?求助解决barplot函数报错问题
问题描述
我已经在Excel里完成了分组条形图的绘制,但用R的barplot()函数尝试复刻时总是出问题——要么报错,要么得到无意义的结果。我知道问题出在传入了包含非数值列的数据框,但不知道该怎么正确处理。附上数据集、Excel效果图和我尝试的代码,请求帮忙修正代码以实现目标图表。
Excel参考效果图

数据集

尝试的代码
resp1 <- c(67, 58, 42, 47, 43, 48) resp2 <- c(33,42,58,53,57,52) question <- c("A","B","C","D","E","F") dataframe <- data.frame(question,resp1, resp2) barplot(dataframe, main="Answers",beside = TRUE,legend=TRUE, ylab="Rate %")
修正方案
barplot()无法直接处理包含字符列的数据框,必须提取其中的数值矩阵,并手动配置x轴标签、图例等参数。修正后的代码如下:
resp1 <- c(67, 58, 42, 47, 43, 48) resp2 <- c(33,42,58,53,57,52) question <- c("A","B","C","D","E","F") dataframe <- data.frame(question,resp1, resp2) # 提取数值列转为矩阵并转置,适配barplot的分组要求 plot_data <- t(as.matrix(dataframe[, -1])) # 绘制分组条形图 barplot(plot_data, main = "Answers", beside = TRUE, ylab = "Rate %", names.arg = dataframe$question, # 设置x轴标签为A-F col = c("#1f77b4", "#ff7f0e"), # 配置两组条形的颜色,贴近Excel效果 ylim = c(0, 100)) # y轴范围设为0-100,匹配百分比数据 # 添加图例 legend("topright", legend = c("resp1", "resp2"), fill = c("#1f77b4", "#ff7f0e"), bty = "n") # 去掉图例边框,更简洁
重点说明
- 数据格式调整:用
dataframe[, -1]剔除非数值的question列,转成矩阵后再转置(t())——因为barplot()默认按行生成分组,转置后才能让每个question对应一组两个条形。 - 参数优化:
names.arg直接指定x轴标签为数据中的A-F,替代默认的序号;col自定义颜色,更贴近Excel的视觉呈现;ylim固定y轴范围,避免因数据波动导致的显示偏差;- 单独调用
legend()可以灵活控制图例位置和样式,解决默认图例可能出现的排版问题。
内容的提问来源于stack exchange,提问作者verapuah
相关产品推荐
相关产品推荐

