我想为分组的barplot设置动画,以便依次绘制每个系列,然后保持可见。在下面的示例图中,我希望先绘制id = 1的条形图,然后依次绘制id = 2,id = 3,id = 4的条形图。
df <- data.frame(id = factor(c(1:4)),
var1 = c(0, 20,60, 80),
var2 = c(18, 64, 91, 100),
var3 = c(8, 73, 100, 100),
var4 = c(18, 48, 67, 85))
df_melt <- melt(df, id.var = "id")
df_melt <- df_melt %>% mutate(show_time = 1, reveal_time = cumsum(show_time))
ggplot(data = df_melt, aes(x = variable, y = value, fill = id)) +
geom_bar(stat = "identity", position = "dodge")
我已经能够使用Transition_reveal生成动画线图,如下所示:https://www.datanovia.com/en/blog/gganimate-how-to-create-plots-with-beautiful-animation-in-r/
我已经尝试使用transition_reveal和transition_states(单独和组合使用)以实现我的目标,但到目前为止还没有成功。例如:transition_states(id)。
我还尝试过在数据中添加一个reveal_time列,并使用transition_reveal(reveal_time)无济于事。
我生成的所有动画都将id = 2的值绘制在id = 1的顶部而不是侧面。因此,最后一帧是具有四个条形图的条形图,而不是四组四个的条形图。
任何帮助将不胜感激-谢谢!
答案 0 :(得分:3)
其想法是指定数据存在的时间点。例如,来自let scaleOutput = 1;
let output;
let canvas;
// setup
function setup() {
// other stuff...
output = createGraphics(1000, 640);
canvas = createCanvas(1000, 640);
}
// the draw loop
function draw() {
// Clear Canvas
background(255);
output.clear();
// Set scale
output.push();
output.scale(scaleOutput);
// Draw to your output here...
output.pop();
// Show on canvas
image(output, 0, 0);
}
// Scale up graphics before exporting
function exportHighRes() {
// HighRes Export
scaleOutput = 5;
output = createGraphics(scaleOutput * 1000, scaleOutput * 640);
draw();
save(output, "filename", 'png');
// Reset Default
scaleOutput = 1;
output = createGraphics(1000, 640);
draw();
}
// Export when key is pressed
function keyReleased() {
if (key == 'e' || key == 'E') exportHighRes();
}
的条形图存在于四个不同的时间点(即分别位于1,2,3,4)中,id == 1
处于三个不同点,依此类推:
id == 2
这是它的样子:
library(tidyr)
library(dplyr)
library(gganimate)
df <- data.frame(id = factor(c(1:4)),
var1 = c(0, 20,60, 80),
var2 = c(18, 64, 91, 100),
var3 = c(8, 73, 100, 100),
var4 = c(18, 48, 67, 85))
df$show_time <- 1:4
for(i in 1:nrow(df)){
df$show_time[i] <- list(df$show_time[i][[1]]:4)
}
df <- unnest(df, show_time)
从这里我将数据重塑为建议的格式并绘制动画:
> head(df, 5)
id show_time variable value
1 1 1 var1 0
2 1 2 var1 0
3 1 3 var1 0
4 1 4 var1 0
5 2 2 var1 20
这是结果:
编辑一种方法(我确信还有其他方法)可以缓慢显示条形,而不是使其突然出现,这是在df <- gather(df, variable, value, -c(id,show_time)) # reshape
ggplot(data = df, aes(x = variable, y = value, fill = id)) +
geom_bar(stat = "identity", position = "dodge") +
transition_states(show_time, wrap = F)
函数中调整transition_length
参数,然后将transition_states
添加到动画中。
enter_fade
另外,您可以让条形图“漂移”到图中:
ggplot(data = df, aes(x = variable, y = value, fill = id)) +
geom_bar(stat = "identity", position = "dodge") +
transition_states(show_time, wrap = F, transition_length = 5) +
enter_fade()
就像我说的那样,可能有很多不同的方式来做,但这只是一个开始: