Нарисуйте гистограмму за строкой, используя R - PullRequest
1 голос
/ 08 апреля 2020

У меня есть этот фрейм данных

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]), кажется, в порядке, но я не знаю, что я делаю неправильно ...

1 Ответ

1 голос
/ 08 апреля 2020

Как следует из сообщения об ошибке, 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

Результат

enter image description here

Без for l oop Вы можете использовать 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)
...