【问题标题】:How to get complete, rather than partial, pie charts using gganimate如何使用 gganimate 获得完整的而不是部分的饼图
【发布时间】:2017-05-18 03:35:12
【问题描述】:

在使用gganimateggplot 制作动画饼图时遇到问题。

我想每年都吃正常的馅饼,但我的产量完全不同。

您可以查看使用mtcars的代码示例:

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

这是输出:

frame 只有一层时效果很好:

【问题讨论】:

  • 你可以复制我的整个代码。我使用mtcars 创建数据。
  • 也许我的英语不好,但在我的问题中,我要求解决第一个情节,而不是第二个情节。第二个是只展示它如何与一个级别一起工作......我不知道你对我的工作有什么问题。你不知道我在用这些图表和数据做什么,以及它们将如何被格式化。但当然,你什么都知道
  • 对不起@Essberto 我一开始实际上并没有理解它 - 可能是因为我的英语也不完美。我不会假装什么都知道,我只是想引导你让更多的人帮助你:当我筛选你的问题时,我认为你对只显示一年的第二个情节有问题,而第一个看起来很很好,因为我无法复制第二个,所以我只留下了我的第一条评论。如果这对你来说听起来很粗鲁,我深表歉意。

标签: r animation ggplot2 pie-chart gganimate


【解决方案1】:

ggplot 代码创建一个堆叠条形图,其中df 中的每一行都有一个部分。使用coord_polar,这将成为一个饼图,数据框中的每一行都有一个楔形。然后当您使用gg_animate 时,每个帧仅包含与Y 的给定级别对应的楔形。这就是为什么您每次只能获得完整饼图的一部分。

如果您想要为Y 的每个级别创建一个完整的饼图,那么一种选择是为Y 的每个级别创建一个单独的饼图,然后将这些饼图组合成一个 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")

上面 GIF 中的馅饼都是一样大小的。但是您也可以根据Year 的每个级别的count 的总和来更改馅饼的大小(代码改编自this SO answer):

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

如果我可以编辑一下,虽然动画很酷(但饼图并不酷,所以可能动画一堆饼图只会增加侮辱伤害),数据可能会更容易理解一个简单的旧静态线图。例如:

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

或者这样:

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

【讨论】:

  • 谢谢!很不错。谢谢你的推荐,但我需要动画饼图来满足我的需求。我唯一担心的是动画包。我想直接用gganimate来做。但是感谢您的解决方案。
  • 我同意制作一堆饼图只会雪上加霜
  • 我认为你需要多了解我在做什么才能写这篇文章......但是当然,你什么都知道......
  • 对不起@Essberto,我只能猜测你没有写什么。饼图不是我的小菜
猜你喜欢
  • 2019-03-23
  • 2012-09-17
  • 2018-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多