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

如何在R中绘制分组条形图?求助解决barplot函数报错问题

问题描述

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

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")  # 去掉图例边框,更简洁

重点说明

  1. 数据格式调整:用dataframe[, -1]剔除非数值的question列,转成矩阵后再转置(t())——因为barplot()默认按行生成分组,转置后才能让每个question对应一组两个条形。
  2. 参数优化:
    • names.arg直接指定x轴标签为数据中的A-F,替代默认的序号;
    • col自定义颜色,更贴近Excel的视觉呈现;
    • ylim固定y轴范围,避免因数据波动导致的显示偏差;
    • 单独调用legend()可以灵活控制图例位置和样式,解决默认图例可能出现的排版问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 11:18:10