2017-05-08 1 views
1

각 차트에 두 개의 그림이있는 5 개의 레이더 차트를 만들려고합니다. 따라서 내 데이터 프레임의 두 행이 하나의 레이더 차트를 구성합니다.R - 각 차트에 두 개의 그림이있는 레이더 차트 행렬을 만드는 방법.

예시적인 데이터 프레임 :

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) 
}) 

당신이 모든 행은 각 레이더 차트에 플롯되고 볼 수 있듯이

.

enter image description here

내 실제 데이터 프레임은 20 행의 일곱 개 변수를 갖는다.

추가 정보가 필요하면 알려주십시오. 어떤 도움을 주셔서 감사합니다.

+0

이 프레젠테이션에서는 데이터에 누락 된 열이 하나있는 것처럼 보입니다.이 열은 주어진 레이더 차트의 첫 번째 데이터 집합인지 두 번째 데이터 집합인지를 정의합니다. 예를 들어,'DF $ type = rep (1 : 2, times = 5)'(실제 데이터에 필요에 따라 조정). 이렇게하면'name '을 먼저 그룹화/반복 할 수 있고 그 안에'type'을 쉽게 반복 할 수 있습니다. – r2evans

+0

의견을 보내 주셔서 감사합니다. 내가 사용하고있는'laply' 함수에서'name'을 통해 반복하고'type'을 반복하는 방법에 대한 대답을 제공해 주시겠습니까? – Dre

답변

0

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) 
}) 

(.. barplots 여기에 쓸모가 있지만, 데모 특히 귀하의 예제에서, 당신은 가능성이 by 전에 par(mfrow=c(1,5))을 넣어 것)

이 가져 반쯤 거기. 이 숫자는 name으로 그룹화되지만, type의 숫자는 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.)