2017-01-03 9 views
2

gganimateggplotというアニメーション円グラフを作成するときに問題があります。部分グラフではなく、部分グラフを得る方法

普通のパイを毎年持っていたいが、私の出力はまったく違う。

あなたは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") 

Anが、これは出力され

enter image description here

あなたは問題について考えていますか?前もって感謝します!と幸せな新年!

+0

あなたは私の全体のコードを再現することができます。私は 'mtcars'を使ってデータを作成しました。 –

+0

私の英語は良くないかもしれませんが、私の質問では、最初のプロットの解決策を求めています。 2つ目は、1つのレベルでどのように動作するかを示すことです...自分の仕事に何が問題なのか分かりません。あなたは、このグラフとデータを使って自分が何をしているのか、それらがどのように形作られるのか分かりません。しかし、当然、あなたは永遠に食べることを知っています –

+0

申し訳ありません@エスベルト私は実際にそれを最初に理解していませんでした - 私の英語は完璧でもないのでかもしれません。私はすべてを知っているふりをしていません、私はあなたを助けてくれる人を増やすように導くだけです。あなたの質問を選んだとき、私はあなたには1年しか表示しない2番目のプロットに問題があると思っていました。いい、私はそのsecondeのものを再現できなかったので、私は最初のコメントを残しました。それがあなたに無礼に聞こえるかどうか心からお詫び申し上げます。 – HubertL

答えて

3

ggplotコードでは、すべての行のセクションがdfになっている単一の積み上げ棒グラフが作成されます。 coord_polarでは、これはデータフレーム内の各行にウェッジが付いた単一の円グラフになります。次にgg_animateを使用すると、各フレームには特定のレベルのYに対応するくさびだけが含まれます。だからこそ、あなたは毎回完全な円グラフのセクションしか得ていないのです。

Yの各レベルのフルパイが必要な場合は、各レベルの個別の円グラフをYに作成し、それらのパイをGIFに結合することをお勧めします。ここであなたの実際のデータに似ています(私は願って)いくつかの偽のデータを持つ例です: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

パイは、上記すべて同じサイズです。私はアニメーションが、一瞬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") 

enter image description here

:しかし、あなたはまた、Yearthis SO answerから適応コード)の各レベルの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

私はそれを書くために前に何をしているのか少し知る必要があると思います...しかし、もちろん、あなたはすべてを知っています... –

関連する問題