如何对堆积的条形图进行动画处理?

时间:2018-10-16 08:18:58

标签: r ggplot2 gganimate

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

这是我使用的数据框:

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

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

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) 

enter image description here

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

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)

enter image description here

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

1 个答案:

答案 0 :(得分:2)

1

绝对有可能,但是在当前版本的 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="CatchpaRegistrationpage.aspx.cs" Inherits="Employee_CatchpaRegistrationpage" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <div> <asp:ScriptManager ID="SM1" runat="server"> </asp:ScriptManager> <table style="border: solid 1px black; padding: 20px; position: relative; top: 50px;" align="center"> <tr> <td>EmailID : </td> <td> <asp:TextBox ID="txtEmailID" runat="server" Width="200px"></asp:TextBox> </td> </tr> <tr> <td>Password : </td> <td> <asp:TextBox ID="txtPassword" runat="server" TextMode="Password" Width="200px"></asp:TextBox> </td> </tr> <tr> <td>Confirm Password : </td> <td> <asp:TextBox ID="txtConfirmPassword" runat="server" TextMode="Password" Width="200px"></asp:TextBox> </td> </tr> <tr> <td>Enter Below Code : </td> <td> <asp:TextBox ID="txtCaptcha" runat="server" Width="200px"></asp:TextBox> </td> </tr> <tr> <td></td> <td valign="middle"> <asp:UpdatePanel ID="UP1" runat="server"> <ContentTemplate> <table> <tr> <td style="height: 50px; width: 100px;"> <asp:Image ID="imgCaptcha" runat="server" /> </td> <td valign="middle"> <asp:Button ID="btnRefresh" runat="server" Text="Refresh" OnClick="btnRefresh_Click" /> </td> </tr> </table> </ContentTemplate> </asp:UpdatePanel> </td> </tr> <tr> <td colspan="2" align="center"> <asp:Button ID="btnRegiser" runat="server" Text="Register" OnClick="btnRegister_Click" /> </td> </tr> </table> </div> </form> </body> </html> using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Text; public partial class Employee_CatchpaRegistrationpage : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { FillCapctha(); } } void FillCapctha() { try { Random random = new Random(); string combination = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; StringBuilder captcha = new StringBuilder(); for (int i = 0; i < 6; i++) { captcha.Append(combination[random.Next(combination.Length)]); Session["captcha"] = captcha.ToString(); imgCaptcha.ImageUrl = "CatchpaRegistrationpage.aspx?" + DateTime.Now.Ticks.ToString(); } } catch { throw; } } protected void btnRefresh_Click(object sender, EventArgs e) { FillCapctha(); } protected void btnRegister_Click(object sender, EventArgs e) { if (Session["captcha"].ToString() != txtCaptcha.Text) { Response.Write("Invalid Captcha Code"); } else { Response.Write("Valid Captcha Code"); } FillCapctha(); } } 中,您需要编辑数据框。

代码

gganimate

数据

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中,动画情节将无法正确分组和堆叠(如您正确指出的那样,是一个错误)。这就是为什么您需要

  1. 功能工程师栏的位置(变量"0.9.9.9999"
  2. c的降序排列条形(以使较大的条形与较小的条形重叠)

真正有帮助的是:将代码分解为空,只保留重要内容:

c

这比原始代码要容易得多。显然,问题出在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) (例如c,百分比),y =(例如分数,组)和group =(例如堆栈,道奇,道奇2,身份,填充)。

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