2012-02-02 5 views
11

동일한보기로 250 개의 플롯을 생성해야합니다. 설정ggplot2를 사용하여 루프에서 플롯 만들기

내 예를 들어 데이터 :

df <- data.frame(name = c("john","alex","mike","dennis","alex"), 
      expenses = c("10","12","15","8","2"), 
      type = c("food","rent","rent","food","food")) 

나는 하나의 플롯의 모든 이름에 대한 비용과 바 플롯을하고 싶습니다.

selected.name <- "alex" 
df1 <- subset(df, name == selected.name) 
ggplot(data = df1, aes(type, expenses)) + geom_bar() 

지금 나는 안양에있는 모든 이름에 대해 동일한 플롯을 나타내는 루프를 사용하려면 :처럼 "알렉스"에 대한 플롯은 볼 것이다. 위의 플롯 코드를 소스 파일로 실행하는 for 루프를 사용하려고했습니다. 그러나 모든 이름의 그래프를 그릴 수 있도록 name 변수를 소스 파일에 전달할 수는 없습니다. 이제 for 루프에서 하나의 그래프 만 가져옵니다.

+0

질문을 좀 더 자세히 지정해주십시오. 1 그래프로 1 창만 얻는 것이 문제입니까? 'x11()'이 해결책이 될 수 있습니다. 만약 pdf를 저장하고 싶다면'pdf (file)'print (ggplot (...)'dev.off()'를 사용하십시오 .... – Seb

+0

안녕, Seb, 답장을 보내 주셔서 감사합니다. 나는 df에있는 모든 다른 이름에 대해 alex라는 이름으로 만든 플롯 이름에 수동으로 입력 할 필요없이. 실제 데이터에는 250 개의 이름이 있기 때문에.이 도움이 되길 바란다. – jeroen81

+1

@Seb, 대신 ggsave를 사용한다. pdf(). –

답변

15

귀하의 orignal 질문에 답변하십시오. 하나의 파일에 함께 Adam.pdf 등 그런 다음 고양이 pdftk (PDF 도구 키트)를 사용할 수있다라는 PDF 파일의 큰 숫자와 끝까지 이런 식으로

doPlot = function(sel_name) { 
    dum = subset(df, name == sel_name) 
    ggobj = ggplot(data = dum, aes(type, expenses)) + geom_bar() 
    print(ggobj) 
    ggsave(sprintf("%s.pdf", sel_name)) 
} 
lapply(unique(df$name), doPlot) 

이 사용하는 표준 R을 수행하려면 문서. 나는 여전히 더 나은 솔루션을 선호한다. 패싯 또는 다른 유형의 플롯.

파셋을 사용하는 것이 더 좋지 않습니까? 귀하의 예를 감안할 때 코드는 다음과 같습니다 다음과 같은 줄거리로 연결

ggplot(data = df, aes(type, expenses)) + 
    geom_bar() + facet_wrap(~name) 

가 :

enter image description here

어쩌면 250 명과 이상의 변수의 경우,이 문제가 될 수 있습니다. 그럼에도 불구하고 나는 패싯을 보았습니다.

+0

폴 감사합니다.이 기능은 좋은 기능입니다. 플롯을 비교하는 데 편리합니다. 250 개의 이름과 12 개의 비용 변수가 있습니다. 매우 복잡한 음모가 생성됩니다. 직원 당 모든 종류의 KPI를 생성하는보고 도구를 만들고 있는데,이 보고서에서는 비교하지 않습니다. 라텍스/R 스웨터로 생성 된 보고서 – jeroen81

+1

별도의 pdf에 개별 플롯으로 솔루션을 추가했습니다. 내 대답에 파일. –

+0

폴 감사합니다. 지금 당장은 완벽하게 작동합니다. 나는 나의 필요에 따라 기능을 더 능숙하게 사용할 수있다. – jeroen81

1

동료는 방금 함수에서 부분 집합을 사용하는 것이 매우 나쁜 생각이라고 지적했습니다. 자세한 내용은 ?subset()을 참조하십시오. 그래서 나는 Paul Hiemstra의 anwser를 적응시키고 부분 집합을 대체했다.

doPlot = function(sel_name) { 
    dum <- df[df$name == sel_name,] 
    ggobj = ggplot(data = dum, aes(type, expenses)) + geom_bar() 
    print(ggobj) 
    ggsave(sprintf("%s.pdf", sel_name)) 
} 
lapply(unique(df$name), doPlot) 
+0

+1! 큰 포인트. 서브 세트 shoul – marbel

관련 문제