gganimate:如何使堆叠条形图从 x 轴平滑向上增长
gganimate: How to make stacked bar chart grow smoothly upwards from x-axis
我在设置堆叠静态图的动画时遇到问题。 (见下方动画)
动画以不稳定的方式从左向右移动,而不是每个条从 x 轴向上增长。堆叠的部分也不是很顺利地生长在一起,我似乎无法解决。
我需要在我的代码中更改什么,以便随着动画图沿 x 轴过渡,各个条形向上增长?我还想让堆叠的条形图变得更平滑,这样堆叠的条形图部分就不会 "thrown" 彼此重叠。
这怎么可能?
这篇文章中最上面的 gif 是我要找的,但我不明白他的代码与我的代码有何不同之处:ideal animation
这是我的代表:
#Static df
library(dplyr)
#>
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#> filter, lag
#> The following objects are masked from 'package:base':
#>
#> intersect, setdiff, setequal, union
year <- as.numeric(c(1996:2015,
1996:2015,
1996:2015))
c <- c(39, 40, 67, 80, 30, 140, 90, 23, 100, 123,
140, 160, 100, 89, 173, 200, 32, 90, 100, 211,
1, 2, 1, 13, 3, 3, 30, 1, 3, 3,
1, 1, 20, 2, 1, 10, 1, 2, 1, 1,
1, 3, 1, 2, 1, 3, 1, 3, 6, 1,
1, 30, 1, 1, 8, 9, 1, 32, 1, 1)
cat <- as.character(c("out", "out", "out", "out", "out", "out", "out", "out", "out", "out",
"out", "out", "out", "out", "out", "out", "out", "out", "out", "out",
"in", "in", "in", "in", "in", "out", "in", "in", "in", "in",
"in", "in", "in", "in", "in", "in", "in", "in", "in", "in",
"other", "other", "other", "other", "other", "other", "other", "other", "other", "other",
"other", "other", "other", "other", "other", "other", "other", "other", "other", "other"))
cat <- as.factor(cat)
static_df_test <- data.frame(year, c, cat) %>%
select(year, cat, c) %>%
arrange(year, cat)
#Static plot
library(ggplot2)
(static_plot <- ggplot(static_df_test) +
geom_bar(data = static_df_test, stat="identity", position ="stack",
aes(x = year, y = c, fill = cat)) +
scale_x_continuous(breaks = seq(1996, 2015, 1),
expand = c(0.003, 0.003),
labels = c(1996, 97, 98, 99, 2000,
"01", "02", "03", "04", "05", "06",
"07", "08", "09", 10, 11, 12, 13, 14, 15)) +
scale_y_continuous(breaks = seq(0, 250, 25),
expand = c(0,0),
limits = c(0,250)) +
labs(x = "year", y = "c")
)
#Animated plot
library(gganimate)
library(ggplot2)
ani <- (static_plot) +
transition_time(as.integer(year)) +
enter_grow() + shadow_mark(past = TRUE)
animate(ani, fps = 8, 50, duration = 15,
width = 1500, height = 750, renderer = gifski_renderer())
现在,条形图通过从前一个条形图向右移动来过渡。在此处查看当前动画:
提前感谢您的帮助!
可能有更正确的方法来执行此操作,但可以通过更改构建初始静态图的方式并使用 transition_layers()
和 enter_drift()
来实现。
请注意,为了简化示例,我只包括 1996-2000 年。要制作所有年份的动画,只需复制并粘贴 geom_bar()
部分并更改要过滤的年份。
#Static plot
library(ggplot2)
(static_plot <- ggplot(static_df_test) +
geom_bar(data = static_df_test %>% filter(year == 1996), stat="identity", position ="stack",
aes(x = year, y = c, fill = cat)) +
geom_bar(data = static_df_test %>% filter(year == 1997), stat="identity", position ="stack",
aes(x = year, y = c, fill = cat)) +
geom_bar(data = static_df_test %>% filter(year == 1998), stat="identity", position ="stack",
aes(x = year, y = c, fill = cat)) +
geom_bar(data = static_df_test %>% filter(year == 1999), stat="identity", position ="stack",
aes(x = year, y = c, fill = cat)) +
geom_bar(data = static_df_test %>% filter(year == 2000), stat="identity", position ="stack",
aes(x = year, y = c, fill = cat)) +
scale_x_continuous(breaks = seq(1996, 2015, 1),
expand = c(0.003, 0.003),
labels = c(1996, 97, 98, 99, 2000,
"01", "02", "03", "04", "05", "06",
"07", "08", "09", 10, 11, 12, 13, 14, 15)) +
scale_y_continuous(breaks = seq(0, 250, 25),
expand = c(0,0),
limits = c(0,250)) +
labs(x = "year", y = "c")
)
#Animated plot
library(gganimate)
library(ggplot2)
ani <- (static_plot) +
transition_layers(layer_length = 1, transition_length = 2) +
enter_drift(x_mod = 0, y_mod = -max(static_df_test$c))
animate(ani, fps = 10, duration = 10,
width = 600, height = 500, renderer = gifski_renderer())
通过将每个基于年份的条放在其自己的图层上,我们可以使用 transition_layers()
使它们一一出现,同时保留所有旧图层。我们使用 enter_drift()
为每个条设置动画,就好像它从图表下方向上漂移一样。
动画输出在这里:
link
有一个更简单的解决方案。将您的“年”变量视为一个因素而不是数字。这将使条形平滑地向上生长,就像你想要的那样。
基本上将以下代码块用于您的静态绘图代码,它会起作用:
static_plot <- ggplot(static_df_test) +
geom_bar(data = static_df_test, stat="identity", position ="stack",
aes(x = as.factor(year), y = c, fill = cat)) +
scale_y_continuous(breaks = seq(0, 250, 25),
expand = c(0,0),
limits = c(0,250)) +
labs(x = "year", y = "c")
我知道我有点晚了,但我希望它能有所帮助。
我在设置堆叠静态图的动画时遇到问题。 (见下方动画)
动画以不稳定的方式从左向右移动,而不是每个条从 x 轴向上增长。堆叠的部分也不是很顺利地生长在一起,我似乎无法解决。
我需要在我的代码中更改什么,以便随着动画图沿 x 轴过渡,各个条形向上增长?我还想让堆叠的条形图变得更平滑,这样堆叠的条形图部分就不会 "thrown" 彼此重叠。
这怎么可能?
这篇文章中最上面的 gif 是我要找的,但我不明白他的代码与我的代码有何不同之处:ideal animation
这是我的代表:
#Static df
library(dplyr)
#>
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#> filter, lag
#> The following objects are masked from 'package:base':
#>
#> intersect, setdiff, setequal, union
year <- as.numeric(c(1996:2015,
1996:2015,
1996:2015))
c <- c(39, 40, 67, 80, 30, 140, 90, 23, 100, 123,
140, 160, 100, 89, 173, 200, 32, 90, 100, 211,
1, 2, 1, 13, 3, 3, 30, 1, 3, 3,
1, 1, 20, 2, 1, 10, 1, 2, 1, 1,
1, 3, 1, 2, 1, 3, 1, 3, 6, 1,
1, 30, 1, 1, 8, 9, 1, 32, 1, 1)
cat <- as.character(c("out", "out", "out", "out", "out", "out", "out", "out", "out", "out",
"out", "out", "out", "out", "out", "out", "out", "out", "out", "out",
"in", "in", "in", "in", "in", "out", "in", "in", "in", "in",
"in", "in", "in", "in", "in", "in", "in", "in", "in", "in",
"other", "other", "other", "other", "other", "other", "other", "other", "other", "other",
"other", "other", "other", "other", "other", "other", "other", "other", "other", "other"))
cat <- as.factor(cat)
static_df_test <- data.frame(year, c, cat) %>%
select(year, cat, c) %>%
arrange(year, cat)
#Static plot
library(ggplot2)
(static_plot <- ggplot(static_df_test) +
geom_bar(data = static_df_test, stat="identity", position ="stack",
aes(x = year, y = c, fill = cat)) +
scale_x_continuous(breaks = seq(1996, 2015, 1),
expand = c(0.003, 0.003),
labels = c(1996, 97, 98, 99, 2000,
"01", "02", "03", "04", "05", "06",
"07", "08", "09", 10, 11, 12, 13, 14, 15)) +
scale_y_continuous(breaks = seq(0, 250, 25),
expand = c(0,0),
limits = c(0,250)) +
labs(x = "year", y = "c")
)
#Animated plot
library(gganimate)
library(ggplot2)
ani <- (static_plot) +
transition_time(as.integer(year)) +
enter_grow() + shadow_mark(past = TRUE)
animate(ani, fps = 8, 50, duration = 15,
width = 1500, height = 750, renderer = gifski_renderer())
现在,条形图通过从前一个条形图向右移动来过渡。在此处查看当前动画:
提前感谢您的帮助!
可能有更正确的方法来执行此操作,但可以通过更改构建初始静态图的方式并使用 transition_layers()
和 enter_drift()
来实现。
请注意,为了简化示例,我只包括 1996-2000 年。要制作所有年份的动画,只需复制并粘贴 geom_bar()
部分并更改要过滤的年份。
#Static plot
library(ggplot2)
(static_plot <- ggplot(static_df_test) +
geom_bar(data = static_df_test %>% filter(year == 1996), stat="identity", position ="stack",
aes(x = year, y = c, fill = cat)) +
geom_bar(data = static_df_test %>% filter(year == 1997), stat="identity", position ="stack",
aes(x = year, y = c, fill = cat)) +
geom_bar(data = static_df_test %>% filter(year == 1998), stat="identity", position ="stack",
aes(x = year, y = c, fill = cat)) +
geom_bar(data = static_df_test %>% filter(year == 1999), stat="identity", position ="stack",
aes(x = year, y = c, fill = cat)) +
geom_bar(data = static_df_test %>% filter(year == 2000), stat="identity", position ="stack",
aes(x = year, y = c, fill = cat)) +
scale_x_continuous(breaks = seq(1996, 2015, 1),
expand = c(0.003, 0.003),
labels = c(1996, 97, 98, 99, 2000,
"01", "02", "03", "04", "05", "06",
"07", "08", "09", 10, 11, 12, 13, 14, 15)) +
scale_y_continuous(breaks = seq(0, 250, 25),
expand = c(0,0),
limits = c(0,250)) +
labs(x = "year", y = "c")
)
#Animated plot
library(gganimate)
library(ggplot2)
ani <- (static_plot) +
transition_layers(layer_length = 1, transition_length = 2) +
enter_drift(x_mod = 0, y_mod = -max(static_df_test$c))
animate(ani, fps = 10, duration = 10,
width = 600, height = 500, renderer = gifski_renderer())
通过将每个基于年份的条放在其自己的图层上,我们可以使用 transition_layers()
使它们一一出现,同时保留所有旧图层。我们使用 enter_drift()
为每个条设置动画,就好像它从图表下方向上漂移一样。
动画输出在这里: link
有一个更简单的解决方案。将您的“年”变量视为一个因素而不是数字。这将使条形平滑地向上生长,就像你想要的那样。
基本上将以下代码块用于您的静态绘图代码,它会起作用:
static_plot <- ggplot(static_df_test) +
geom_bar(data = static_df_test, stat="identity", position ="stack",
aes(x = as.factor(year), y = c, fill = cat)) +
scale_y_continuous(breaks = seq(0, 250, 25),
expand = c(0,0),
limits = c(0,250)) +
labs(x = "year", y = "c")
我知道我有点晚了,但我希望它能有所帮助。