我正在尝试在四个堆叠的条形图之间进行转换。输出不完全符合我的预期,我无法弄清楚这是我的代码中的错误还是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)
但是当我尝试添加四个不同小组阶段的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)
似乎所有组的所有百分比(条长)都同时添加到动画中。我希望在四个不同组的堆叠条形图之间进行过渡,而没有空隙。如何获得此动画以在条之间无间隙地过渡?
答案 0 :(得分:2)
绝对有可能,但是在当前版本的 <%@ 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
中,动画情节将无法正确分组和堆叠(如您正确指出的那样,是一个错误)。这就是为什么您需要
"0.9.9.9999"
)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,身份,填充)。
如果您有任何疑问,请随时向我发送消息。