gpt4 book ai didi

r - gganimate 0.9.9.9 中的累积图

转载 作者:行者123 更新时间:2023-12-03 19:32:46 28 4
gpt4 key购买 nike

我找不到以前发布的足以回答这个问题的问题。在之前的帖子中,已接受的答案使用 shadow_mark 来保持先前渲染的图层持久化。

How to keep previous layers of data while doing animation in R gganimate?

Keep points in gganimate

在散点图中显示输出时,这是一个不错的解决方法,但它不是累积测量值,并且在尝试执行(例如,堆叠条形图)时会失败。

考虑以下数据。我想建立一个累积堆积条形图,在我的 df 中使用一个过渡状态。

df <- data.frame(t = c(2000, 2000, 2001, 2001, 2002, 2002), 
f = c("y", "n", "y", "n", "y", "n"),
x = c("a", "a", "b", "c", "a", "c"),
y = c(2,3,5,1,4,8))
> df
t f x y
1 2000 y a 2
2 2000 n a 3
3 2001 y b 5
4 2001 n c 1
5 2002 y a 4
6 2002 n c 8

我想显示 2000 年的数据,在下一层我想添加 2001 年的数据作为与上一层的累积数据。同样,对于下一层,我想将 2002 年的数据添加为 2000 年和 2001 年的累积数据。

这说明了为什么 shadow_mark 不是累积数据的解决方案:
ggplot(df, aes(x=x, y=y, fill=f)) +
geom_col() + labs(x=NULL, y=NULL, fill=NULL, title="{closest_state}") +
transition_states(t, transition_length = 2, state_length = 1) +
shadow_mark() + enter_fade() + exit_shrink() + ease_aes('sine-in-out') + theme_bw()

shadow_mark

添加对 shadow_mark 的调用不会达到累积图的预期结果。 “a”的累计总数应为 9。

对于 c(2000),可以将数据子集划分为 3 个不同的 df's。 , c(2000,2001) , 和 c(2000,2001,2002) ,然后在创建新的状态列后 rbind ,但这似乎是一种非常hacky的方法。

是否有一种更简洁的方式来使用 gganimate 中内置的工具来显示累积数据?

最佳答案

您可以在数据中创建一个新列,其中包含每年的加法结果并直接绘制该列。在下面的代码中,我们使用 cumsum 执行此操作。功能。我们也使用 complete确保有一个 t f 的每个组合的行, 和 x (在这些添加的行中设置 y=0)。如果我们不这样做,当 t 的某些组合缺少某些年份(f 值)时,累积总和将不正确。和 x .所有数据转换都是通过 dplyr 即时完成的。管道:

library(tidyverse)
library(gganimate)

ggplot(df %>%
complete(t, nesting(f, x), fill=list(y=0)) %>%
arrange(t) %>%
group_by(x,f) %>%
mutate(y_cum = cumsum(y)),
aes(x=x, y=y_cum, fill=f)) +
geom_col() +
labs(x=NULL, y=NULL, fill=NULL, title="{closest_state}") +
transition_states(t, transition_length = 2, state_length = 1) +
enter_fade() + ease_aes('sine-in-out') +
theme_bw() +
scale_y_continuous(breaks=0:10)

enter image description here

关于r - gganimate 0.9.9.9 中的累积图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52864445/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com