如何对堆积的条形图进行动画处理? [英] How to gganimate a stacked bar graph?

查看:119
本文介绍了如何对堆积的条形图进行动画处理?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在四个堆叠的条形图之间进行转换.输出不完全符合我的预期,我无法弄清楚这是我的代码中的错误还是gganimate R程序包中的错误.

I am trying to make a transition between four stacked bar graphs. The output is not quite what I expected and I haven't been able to figure if it's an error in my code or if it's a bug in gganimate R package.

这是我使用的数据框:

df <- structure(list(name = c("variable", "variable", "variable", "variable",    
    "variable", "variable", "variable", "variable", "variable", "variable", 
    "variable", "variable", "variable"), groups = structure(c(3L, 
    3L, 3L, 3L, 2L, 2L, 2L, 1L, 1L, 1L, 4L, 4L, 4L), .Label = c("group 1", 
    "group 2", "group 3", "group 4"), class = "factor"), score = structure(c(4L, 
    3L, 2L, 1L, 3L, 2L, 1L, 3L, 2L, 1L, 3L, 2L, 1L), .Label = c("4", 
    "3", "2", "1"), class = c("ordered", "factor")), percentage = c(8, 
    38, 38, 16, 17.1428571428571, 40, 42.8571428571429, 40, 20, 40, 
    5, 65, 30), percentage2 = c("8%", "38%", "38%", "16%", "17.1%", 
    "40%", "42.9%", "40%", "20%", "40%", "5%", "65%", "30%"), label = c(0.04, 
    0.27, 0.65, 0.92, 0.0857142857142857, 0.371428571428571, 0.785714285714286, 
    0.2, 0.5, 0.8, 0.025, 0.375, 0.85)), row.names = c(NA, -13L), class = "data.frame")

当我制作仅一个组变量的一个阶段的堆叠条形图时,我得到这个:

When I make a stacked bar graph of just one stage of the groups variable, I get e.g. this:

library(ggplot2)
library(dplyr)

ggplot(filter(df, groups == "group 3"),
       aes(x = name, y = percentage, fill = score)) +
    geom_bar(stat = "identity", position = "fill", width = 0.8) +
    geom_text(aes(y = label, label = percentage2), color = "grey25") +
    coord_flip() +
    scale_fill_manual(values=c("darkgreen", "lightgreen", "yellow", "red"), 
                      guide = guide_legend(reverse = TRUE), drop=FALSE) 

但是当我尝试添加四个不同小组赛段的gganimate动画时,我得到了:

But When I try to add a gganimate animation of the four different group stages I get this:

library(gganimate)

ggplot(df, aes(x = name, y = percentage, fill = score)) +
    geom_bar(stat = "identity", position = "fill", width = 0.8) + 
    geom_text(aes(y = label, label = percentage2), color = "grey25") +
    coord_flip() +
    scale_fill_manual(values = c("darkgreen", "lightgreen", "yellow", "red"), 
                      guide= guide_legend(reverse = TRUE), drop = FALSE) + 
    transition_states(groups, transition_length = 2, state_length =  1)

似乎将所有组的所有百分比(条形长度)同时添加到动画中.我希望在四个不同组的堆叠条形图之间进行过渡,而没有空隙.如何获得此动画以在条之间无间隙地进行过渡?

It seems to add all the percentages (bar lengths) of all the groups to the animation at the same time. I want a transition between the stacked bar graphs of the four different groups without the gaps. How can I get this animation to make a transition between the bars without gaps?

推荐答案

当然可以,但是在当前版本的gganimate中,您需要编辑数据框.

Definitely possible, but in the current version of gganimate you need to edit your data frame.

g <- ggplot(df, aes(x = name, y = c, fill = score, group = score)) +
    geom_col(position = "identity", width = 0.8) +
    coord_flip() +
    labs(title = "{closest_state}") +
    geom_label(aes(y = c, label = percentage2)) +
    scale_fill_manual(values = c("darkgreen", "lightgreen", "yellow", "red"), 
                      guide= guide_legend(reverse = TRUE), drop = FALSE) +
    transition_states(groups, transition_length = 2, state_length = 1)
animate(g, nframes = 100)

数据

df$c <- ave(df$percentage, df$group, FUN=cumsum)
df <- df[order(df$groups, df$score, df$c), ]

df
       name  groups score percentage percentage2      label         c
10 variable group 1     4   40.00000         40% 0.80000000 100.00000
9  variable group 1     3   20.00000         20% 0.50000000  60.00000
8  variable group 1     2   40.00000         40% 0.20000000  40.00000
7  variable group 2     4   42.85714       42.9% 0.78571429 100.00000
6  variable group 2     3   40.00000         40% 0.37142857  57.14286
5  variable group 2     2   17.14286       17.1% 0.08571429  17.14286
4  variable group 3     4   16.00000         16% 0.92000000 100.00000
3  variable group 3     3   38.00000         38% 0.65000000  84.00000
2  variable group 3     2   38.00000         38% 0.27000000  46.00000
1  variable group 3     1    8.00000          8% 0.04000000   8.00000
13 variable group 4     4   30.00000         30% 0.85000000 100.00000
12 variable group 4     3   65.00000         65% 0.37500000  70.00000
11 variable group 4     2    5.00000          5% 0.02500000   5.00000

=======================

========================

为什么?在gganimate版本"0.9.9.9999"中,动画情节不会分组&;正确堆叠(如您正确指出的错误).这就是为什么您需要

Why? In gganimate version "0.9.9.9999" the animated plot will not group & stack correctly (a bug, as you pointed out correctly). This is why you need to

  1. 功能工程师杆的位置(变量c)
  2. c的降序排列条形(以便较大的条不会与较小的条重叠)
  1. Feature engineer the position of the bar (variable c)
  2. Order the bars by descending size of c (so that the bigger ones don't overlap the smaller ones)

真正有用的是:将代码分解为基本内容,而仅保留重要内容:

What was really helpful: to break down the code to the bare bones and just keep the important stuff:

g <- ggplot(df, aes(x = "", y = c, fill = score, group = score)) +
    geom_col(position = "identity") +
    labs(title = "{closest_state}") +
    transition_states(groups, transition_length = 2, state_length = 1)
    animate(g, nframes = 10)

这比原始代码要容易得多.显然,问题出在y =(例如c,百分比),group =(例如分数,组)和position =(例如stack,dodge,dodge2,identity,充满).

This was much easier to work with than the original code. There it became clear that the problem lies somewhere in the interplay of y = (e.g., c, percentage), group = (e.g., score, groups), and position = (e.g., stack, dodge, dodge2, identity, fill).

如果您有任何疑问,请随时向我发送消息.

If you have any questions please do not hesitate to shoot me a message.

这篇关于如何对堆积的条形图进行动画处理?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆