2017-01-03 9 views
2

gganimateggplot으로 애니메이션 원형 차트를 수행 할 때 문제가 있습니다.gganimate를 사용하여 부분적인 차트가 아닌 전체 원형 차트를 얻는 방법

저는 매년 정상적인 파이를 갖고 싶지만 제 산출물은 완전히 다릅니다.

당신은 mtcars 사용하여 코드의 예를 볼 수 있습니다 다음 frame는 하나의 레벨을 가질 때

![enter image description here

그것은 잘 작동 :

library(ggplot2) 
library(gganimate) 


#Some Data 

df<-aggregate(mtcars$mpg, list(mtcars$cyl,mtcars$carb), sum) 
colnames(df)<-c("X","Y","Z") 

bp<- ggplot(df, aes(x="", y=Z, fill=X, frame=Y))+ 
geom_bar(width = 1, stat = "identity") + coord_polar("y", start=0) 

gganimate(pie, "output.gif") 

이 출력입니다

enter image description here

문제에 대한 아이디어가 있습니까? 미리 감사드립니다! 그리고 새해 복 많이 받아!

+0

당신은 내 모든 코드를 재현 할 수 있습니다. 나는'mtcars'를 사용하여 데이터를 생성했습니다. –

+0

어쩌면 내 영어가 좋지 않지만 내 질문에 나는 두 번째가 아니라 첫 번째 줄거리의 해결책을 요구한다. 두 번째는 한 수준에서 작동하는 방식 만 보여주는 것입니다 ... 내 작업에 어떤 문제가 있는지 알 수 없습니다. 당신은이 그래프와 데이터로 내가 무엇을하고 있는지, 그리고 그들이 어떻게 형성 될지를 모른다.그러나 당연히, 당신은 영원히 알고 있습니다 –

+0

미안 해요 @ 에베르토 저는 처음에는 그것을 이해하지 못했습니다. 아마도 영어가 완벽하지 않기 때문일 수도 있습니다. 나는 모든 것을 가장하는 척하지 않는다. 나는 너를 돕는 사람들을 더 많이 안내하도록 노력하고있다 : 내가 너의 질문을 심사했을 때, 나는 첫 해가 단지 1 년만을 보여주는 두 번째 줄거리에 문제가 있다고 생각했다. 좋은, 그리고 그 seconde 하나를 재현 할 수 없기 때문에, 나는 단지 첫 코멘트를 남겼습니다. 그게 너에게 무례한 소리가 나면 진심으로 사과한다. – HubertL

답변

3

ggplot 코드는 모든 행에 대한 섹션이 df 인 단일 스택 막대 차트를 만듭니다. coord_polar을 사용하면 데이터 프레임의 각 행에 대해 쐐기가있는 단일 원형 차트가됩니다. 그런 다음 gg_animate을 사용하면 각 프레임에는 주어진 레벨 인 Y에 해당하는 쐐기 만 포함됩니다. 그래서 매번 전체 원형 차트의 일부분 만 얻게됩니다.

Y의 각 레벨에 대해 전체 원형을 원하면 각 레벨에 대해 Y의 별도 파이 차트를 만든 다음 해당 파이를 GIF에 결합하는 것이 좋습니다. 여기에 귀하의 실제 데이터와 유사하다 (I 희망) 일부 가짜 데이터 예제가 다음 GIF에서

library(animation) 

# Fake data 
set.seed(40) 
df = data.frame(Year = rep(2010:2015, 3), 
       disease = rep(c("Cardiovascular","Neoplasms","Others"), each=6), 
       count=c(sapply(c(1,1.5,2), function(i) cumsum(c(1000*i, sample((-200*i):(200*i),5)))))) 

saveGIF({ 
    for (i in unique(df$Year)) { 
    p = ggplot(df[df$Year==i,], aes(x="", y=count, fill=disease, frame=Year))+ 
     geom_bar(width = 1, stat = "identity") + 
     facet_grid(~Year) + 
     coord_polar("y", start=0) 
    print(p) 
    } 
}, movie.name="test1.gif") 

enter image description here

파이는 위의 모든 같은 크기입니다.

enter image description here

나는 잠시 editorialize 경우

library(dplyr) 

df = df %>% group_by(Year) %>% 
    mutate(cp1 = c(0, head(cumsum(count), -1)), 
     cp2 = cumsum(count)) 

saveGIF({ 
    for (i in unique(df$Year)) { 
    p = ggplot(df %>% filter(Year==i), aes(fill=disease)) + 
     geom_rect(aes(xmin=0, xmax=max(cp2), ymin=cp1, ymax=cp2)) + 
     facet_grid(~Year) + 
     coord_polar("y", start=0) + 
     scale_x_continuous(limits=c(0,max(df$cp2))) 
    print(p) 
    } 
}, movie.name="test2.gif") 
, 애니메이션, 비록 :하지만 당신은 또한 ( this SO answer에서 적응 코드) Year의 각 수준에 대한 count의 합을 기준으로 파이의 크기를 변경할 수 있습니다 (그러나 파이 차트는 붕괴되지 않습니다. 그래서 많은 양의 원형 차트를 애니 메이팅하면 상해에 대한 모욕이 생깁니다) 데이터는 평범한 오래된 정적 선 그래프로 이해하기가 더 쉬울 것입니다.

ggplot(df, aes(x=Year, y=count, colour=disease)) + 
    geom_line() + geom_point() + 
    scale_y_continuous(limits=c(0, max(df$count))) 

enter image description here

아니면이 : 예를 들어

ggplot(df, aes(x=Year, y=count, colour=disease)) + 
    geom_line() + geom_point(show.legend=FALSE) + 
    geom_line(data=df %>% group_by(Year) %>% mutate(count=sum(count)), 
      aes(x=Year, y=count, colour="All"), lwd=1) + 
    scale_y_continuous(limits=c(0, df %>% group_by(Year) %>% 
           summarise(count=sum(count)) %>% max(.$count))) + 
    scale_colour_manual(values=c("black", hcl(seq(15,275,length=4)[1:3],100,65))) 

enter image description here

+0

감사! 아주 좋아. 그리고 당신의 추천에 감사드립니다. 그러나 나는 원하는 것을 위해 애니메이션 원형 차트가 필요합니다. 내가 걱정하는 유일한 것은 애니메이션 패키지에 관한 것입니다. 나는 gganimate와 직접하고 싶습니다. 그러나 해결책을 가져 주셔서 감사합니다. –

+1

나는 파이 차트를한데 모아 부상에 대한 모욕을 더하는 데 동의한다. – HubertL

+0

나는 그걸 쓰기 위해 내가하고있는 일에 대해 조금 더 알아야한다고 생각한다.하지만 물론 너는 모든 것을 알고있다. ... –