首页 > 解决方案 > 使用 R 逐行绘制条形图

问题描述

我有这个数据框

names    var1    var2    var3    var4   ...   var51
name1   33.87   31.52   18.73   13.71   ...    0.17
name2   36.18   25.07   19.85   16.33   ...    0.21
name3   34.29   22.68   20.37   12.09   ...    0.36
...       ...     ...     ...     ...   ...     ...
name19  46.98   20.42   14.54   15.77   ...    0.18

我需要使用 R 逐行绘制一个新的条形图。

我试过这个:

for (i in df$names)
        barplot(height = df[names == i,],
                beside = TRUE,
                main = i,
                ylim = c(0,100),
                names = colnames(df[,c(2:53)]),
                las = 1,
                col = "lightblue")

但我得到这个错误:

Error in barplot.default(height = df[names == i,], beside = TRUE, main = p[1, 1], ylim = c(0,  : 
  'height' must be a vector or a matrix

过滤器 (df[names == i]) 似乎很好,但我不知道我在做什么错......

标签: rdataframefor-looprowbar-chart

解决方案


正如错误消息所示,barplot想要一个matrix.

op <- par(mfrow=c(1, 3))  ## set par
for (i in dat$names) {
  barplot(height = as.matrix(dat[dat$names == i,-1]),
          beside = TRUE,
          main = i,
          ylim = c(0,100),
          # names = colnames(dat[,-1]),
          las = 1,
          col = "lightblue")
}
par(op)  ## reset par

结果

在此处输入图像描述

没有for循环,您可以使用by

op <- par(mfrow=c(1, 3))  ## set par
by(dat, dat$names, function(x) 
  barplot(as.matrix(x[-1]), beside=TRUE, ylim=c(0, 100), las=1, 
          col="lightblue", main=x[1]
  ))
par(op)  ## reset par

数据

dat <- read.table(text="names    var1    var2    var3    var4      var51
name1   33.87   31.52   18.73   13.71       0.17
name2   36.18   25.07   19.85   16.33       0.21
name3   34.29   22.68   20.37   12.09       0.36", header=TRUE)

推荐阅读