R - Как составить матрицу радиолокационных карт, каждая из которых имеет два графика.

Я пытаюсь создать 5 радиолокационных карт, каждый из которых имеет два графика. Таким образом, каждые две строки из моего фрейма данных составляют одну радиолокационную карту.

Пример кадра данных:

DF 

name     A   B   C   D   E

name1    1   2   3   4   5
name1    3   2   3   5   4
name2    3   5   4   5   5
name2    2   1   5   1   5
name3    1   3   2   4   1
name3    5   4   1   2   2
name4    1   2   3   4   5
name4    5   4   3   2   1
name5    1   2   3   4   5
name5    5   4   3   2   1

df фрейм данных состоит из двух разных фреймов данных. Ряды c(1,3,5,7,9) один кадр данных и строки c(2,4,6,8,10) другой кадр данных. Я поместил их в один фрейм данных, потому что подумал, что будет проще достичь моей конечной цели - двух графиков в одной радиолокационной карте, но если есть более простой и эффективный метод, пожалуйста, дайте мне знать.

Я хотел бы, чтобы строки 1 и 2 были одной диаграммой, строки 3 и 4 - одной диаграммой, строки 5 и 6 - одной диаграммой, строки 7 и 8 - одной диаграммой, а строки 9 и 10 - одной диаграммой.

Что я сейчас делаю:

library(fsmb)
library(plyr)
library(dplyr)

colors_border <- c( rgb(0.2,0.5,0.5,0.9), rgb(0.8,0.2,0.5,0.9))
colors_in <- c( rgb(0.2,0.5,0.5,0.4), rgb(0.8,0.2,0.5,0.4))

par(mar=c(1,1,1,1))
layout(matrix(1:5, ncol = 5, nrow = 1, byrow = T))

laply(c(1,3,5,7,9), function(x){
  radarchart(rbind(rep(5,5), rep(1,5), df[c(1,2,3,4,5,6,7,8,9,10),-1]), 
         axistype=1 , 
         pcol=colors_border, 
         pfcol=colors_in,
         title = df$name[x],
         plwd=3, 
         plty=1,
         cglcol="grey", 
         cglty=1, 
         axislabcol="grey", 
         caxislabels=seq(1,5,1), 
         cglwd=0.8,
         vlcex=0.8)
})

Как вы можете видеть, каждая строка строится на каждой радиолокационной карте.

введите описание изображения здесь

Мой фактический фрейм данных имеет 20 строк и семь переменных.

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация. Любая помощь приветствуется.

1 ответ

Решение

Вам не нужно использовать lapply,

txt <- "name     A   B   C   D   E
name1    1   2   3   4   5
name1    3   2   3   5   4
name2    3   5   4   5   5
name2    2   1   5   1   5
name3    1   3   2   4   1
name3    5   4   1   2   2
name4    1   2   3   4   5
name4    5   4   3   2   1
name5    1   2   3   4   5
name5    5   4   3   2   1"
df <- read.table(text = txt, header = TRUE)
df$type <- rep(1:2, times = 5)

Пытаться:

by(df, df$name, function(x) {
  barplot(as.matrix(x[1,2:6,drop = FALSE]), col = x$type[1])
  barplot(as.matrix(x[2,2:6,drop = FALSE]), col = x$type[2], add=TRUE)
})

(Барплоты здесь бесполезны, но демонстрация. Особенно в вашем примере, вы, вероятно, поставили бы par(mfrow=c(1,5)) перед by.)

Это становится на полпути там. Это группирует по name, но затем имеет ряд различных types жестко закодировано как 2. Если это гарантировано, то все в порядке, но если у вас есть переменные числа typeс, то вы можете пойти на один уровень глубже:

by(df, df$name, function(x) {
  by(x, x$type, function(y) {
    barplot(as.matrix(y[,2:6,drop = FALSE]), col = y$type[1], add = y$type[1] != 1)
  })
})

Если вы хотите, вы можете сделать это так с lapplyс тем же результатом (хотя я думаю, что он более многословен):

lapply(unique(df$name), function(nm) {
  x <- subset(df, name == nm)
  barplot(as.matrix(x[1,2:6,drop = FALSE]), col = x$type[1])
  barplot(as.matrix(x[2,2:6,drop = FALSE]), col = x$type[2], add=TRUE)
})

(Точно так же вы можете вкладывать lapply призывает для type.)

Другие вопросы по тегам