2017-01-16 3 views
2

내가 ggplot 2.2.0 및 http://www.cookbook-r.com/Graphs/Facets_(ggplot2)/에 따르면 R 버전 3.3.2 W64ggplot2 - 나는

를 사용하는 조회 테이블로 다른 dataframe를 사용하여 패싯 레이블 텍스트를 변경할 수 있습니다 어떻게 패싯 레이블을 제공하는 함수를 지정할 수 있습니다. 나는 연구의 환자 데이터를 플롯 :

image of plotted patient data

나는 ID와 데이터와 dataframe를 가지고 있고, 나는 몇 가지 일반 정보 (나이, 성별)

patmeta <- data.frame(
"pat_id"=c(66, 103, 219, 64, 62, 111, 232), 
"gender"=c("f","f","f", "m","f", "f", "f"), 
"age"=c(56, 32, 73, 58,37,33,52)) 
를 포함하는 두 번째 dataframe이

나는 글로벌 라벨러 기능을 정의 내 pat_id을위한 특별 한 (pat_id_fac는 pat_id과 동일하지만, 인자로, pat_id 숫자입니다)

PatIdLabeller <- function(id) { 
    res <- sprintf("Pat %s (%i y, %s)", id, 
       subset(patmeta, pat_id == id)$age, 
       subset(patmeta, pat_id == id)$gender) 
    return(res) 
} 

globalLabeller <- labeller(
    pat_id_fac = PatIdLabeller, 
    pat_id = PatIdLabeller, 
    .default = label_both 
) 
,536,913,632 10

PatIdLabeller 함수를 테스트하면 원하는 결과를 얻을 수 있습니다 (하위 집합을 사용하는 것이 가장 우아한 방법은 아닙니다).

> PatIdLabeller('103') 
[1] "Pat 103 (32 y, f)" 

는 그러나 ggplot에서이를 사용하여 ID가 ​​올바른지,하지만 당신은 그림에서 보는 바와 같이 나이와 성별은 모두 같은 (patmeta의 마지막 행)에 대한 것입니다. 내 qdat의 부분 집합은 다른 질문에 대한 답변에서

structure(list(pat_id = c(103L, 103L, 103L, 64L, 64L, 64L, 66L, 
66L, 66L, 219L, 219L, 219L, 62L, 62L, 62L, 111L, 111L, 111L, 
232L, 232L, 232L), pat_id_fac = structure(c(4L, 4L, 4L, 2L, 2L, 
2L, 3L, 3L, 3L, 6L, 6L, 6L, 1L, 1L, 1L, 5L, 5L, 5L, 7L, 7L, 7L 
), .Label = c("62", "64", "66", "103", "111", "219", "232"), 
class = c("ordered", "factor")), 
Activity = structure(c(9L, 3L, 9L, 2L, 9L, 9L, 9L, 
2L, 2L, 3L, 8L, 4L, 2L, 2L, 2L, 4L, 4L, 7L, 2L, 2L, 9L), .Label = c("", 
"Anderes", "Essen", "Hausarbeit", "Hobbies", "Körperpflege", 
"Liegen", "Medienkonsum", "Sozialer Kontakt"), class = "factor")), 
.Names = c("pat_id", "pat_id_fac", "Activity"), row.names = c(1L, 2L, 3L, 
128L, 129L, 130L, 199L, 200L, 201L, 217L, 218L, 219L, 343L, 344L, 345L, 
397L, 398L, 399L, 451L, 452L, 453L), class = "data.frame") 


g.bar.activities <- 
    ggplot(data=qdat, aes(x=Activity)) + 
    geom_bar() + 
    facet_wrap(~ pat_id_fac, labeller= globalLabeller) 

을 따르고

, 나는 내가 문자 벡터를 정의 할 수 있습니다 알고 있지만, 내가 게으른 오전이 더 우아한 내 patmeta을 재사용하고 싶으면, 연구 참여자 명단이 꽤 길어지고 시간이 지남에 따라 발전하기 때문입니다. 작은 테스트 데이터와

t <- data.frame("pat_id"=c(103, 103, 103, 219, 219, 219), 
"Activity" = c("sleep", "sleep", "eat", "eat", "eat", "sleep")) 
patmeta <- data.frame("pat_id"=c(103, 219), 
"gender"=c("m","f"), "age"=c(32,52)) 

ggplot(data=t, aes(x=Activity)) + geom_bar() + 
facet_wrap(~pat_id, labeller=globalLabeller) 

은 내가 정확히 원하는 것을 얻을 설정합니다. 나는 그 차이를 보지 못했다.

+0

'qdat'없이 재생산 할 수 없습니다. – Axeman

+0

다음을 읽어보십시오 : [위대한 R 재현 가능한 예제를 만드는 방법] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example/5963610) – Jaap

+0

나는 dput - 원래 qdat 데이터 프레임의 서브 세트의 출력 –

답변

1

부분 집합이 제대로 ==가들에 전달되는 id '모두의 길이를 따라 벡터로 행동하려고하기 때문에 가능성이 작동하지 않은 것 같습니다. 즉,이에 patmeta의 각 pat_id을 확인입니다 그것이 pat_id과 일치하는지 확인하십시오. 정렬의 차이점은 그 중 하나만 일치하는 것입니다. pat_id.

PatIdLabeller(c(103, 66)) 

character(0) 제공하고이 경고 :

pat_id에서

== ID : 이상 길이 개체가 아니라 당신이 다음 중 하나를 시도하는 경우

당신은 행동에서 볼 수 있습니다 더 짧은 객체 길이의 배수

행이 반환되지 않고 R이 elem을 반복해야하므로 ==

ggplot(data=head(qdat), aes(x=Activity)) + 
    geom_bar() + 
    facet_wrap(~ pat_id, labeller= globalLabeller) 

의 행군이 다시 중복 연령/성별과 음모, 그리고 pat_id에서이 경고

을 제공 == ID : 더 이상 객체 길이가 짧은 객체 길이의 배수가 아닌

(위와 동일). 심지어 작은 데이터 세트와 노트의

, 당신의 행 순서를 반대로하면 새 patmeta, 당신은 재미

오류 코드를 실행 (219 (103) 전에되도록) (X [I] ...) 알 입력

라벨러 빈 character() (상기와 같이 복귀되기 때문에).

나는 표지와 경험을 많이 (이 답변을 탐구하는 좋은 기회였다)이없는, 그러나 이것은 dplyr에서 left_join를 사용하기보다는 ==를 사용하려고 시도에 의해 작동합니다.

myLabeller <- function(x){ 
    lapply(x,function(y){ 
    toLabel <- 
     data.frame(pat_id = y) %>% 
     left_join(patmeta) 

    paste0("Pat ", toLabel$pat_id 
      , " (", toLabel$age, "y, " 
      , toLabel$gender, ")") 
    }) 
} 

사용

을 제공합니다

ggplot(data=qdat, aes(x=Activity)) + geom_bar() + 
    facet_wrap(~pat_id, labeller=myLabeller) + 
    theme(axis.text.x = element_text(angle = 45, hjust = 1)) 

enter image description here

또 다른 옵션은 실제로 직접 사용하고자하는 라벨을 라벨러 단계를 건너 뛰고 바로 생성하는 것입니다. 여기에 메타 데이터를 환자 데이터와 병합 (dplyrdplyr에서 left_join) 한 다음 원하는 형식/스타일 (여기서는 dplyrpaste0에서 mutate 사용)을 사용하여 열을 생성하기 만하면됩니다.

forPlotting <- 
    qdat %>% 
    left_join(patmeta) %>% 
    mutate(forFacet = paste0("Pat ", pat_id 
          , " (", age, "y, " 
          , gender, ")")) 

나서 사용 플로팅 데이터 및 시팅에 대한 새로운 칼럼있다.

ggplot(forPlotting, aes(x=Activity)) + 
    geom_bar() + 
    facet_wrap(~forFacet) + 
    theme(axis.text.x = element_text(angle = 45, hjust = 1)) 

은면 이제 알파벳 순으로 정렬되어

enter image description here

메모를 제공하지만, 명시 적으로 분류 수준 요소로 열을 설정하여 필요에 따라 그것을 만들 때 조정할 수 있습니다.

+0

예,이 작동합니다. 그리고 나를 위해 추가 컬럼을 유지하는 것은 문제가되지 않습니다. 하지만 이는 해결 방법과 비슷하며 직선적 인 버전은 labeller 함수를 사용하는 것입니다. 왜 아직도 작동하지 않는지 궁금합니다. 어떤 생각? –

+0

나는 labeller 문제를 직접 해결하기 위해 내 생각을 다시 한 번 살펴보고 업데이트했습니다. 저는 여전히 일반적으로 레이블로 사용하기 위해 기둥을 만드는 것에 의지 할 것입니다. 그러나 그것은 labellers에 대한 저의 경험 부족 때문일 수 있습니다. –