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
, но затем имеет ряд различных type
s жестко закодировано как 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
.)