You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用gganimate实现geom柱状条按得票率同步移动到目标值

柱状图同步动画实现方案

问题原因

你当前使用的transition_states(SWING)会将每个SWING取值作为独立状态依次切换,无法实现所有柱状条同步运动。要实现所有柱状条从0值同步移动到对应目标摇摆百分比的效果,可参考以下修改方案:

完整可运行代码

library(ggplot2)
library(dplyr)
library(gganimate)
theme_set(theme_bw())  

BHAGWANPUR <- structure(list(STATE = c("UTTARAKHAND", "UTTARAKHAND", "UTTARAKHAND"), 
                             DISTRICT = c("HARDWAR", "HARDWAR", "HARDWAR"), 
                             AC = c("BHAGWANPUR", "BHAGWANPUR", "BHAGWANPUR"), 
                             PARTY = structure(1:3, .Label = c("INC", "BJP", "BSP"), class = "factor"), 
                             VOTES = c(44882L, 42369L, 4069L), 
                             DELTA_VOTES = c(14835L, 31719L, -32759L), 
                             VOTE_PERCENTAGE = c(48.2, 45.5, 4.4), 
                             SWING = c(9.9, 31.9, -42.5), 
                             X.CHANGE = c(49.4, 297.8, -89), 
                             BASE_SHARE = c(38.2, 13.6, 4.4), 
                             mpg_type = c("ABOVE", "ABOVE", "BELOW")), 
                        row.names = c(NA, -3L), class = "data.frame")
BHAGWANPUR$PARTY <- factor(BHAGWANPUR$PARTY,levels=BHAGWANPUR$PARTY)

# 构造过渡数据集:初始状态(SWING=0)+ 最终状态(原始SWING值)
anim_data <- bind_rows(
  BHAGWANPUR %>% mutate(SWING = 0, time = 0),
  BHAGWANPUR %>% mutate(time = 1)
)

# 绘制动画图
draw <- ggplot(anim_data, aes(x=PARTY, y=SWING, label=SWING)) + 
  geom_bar(stat='identity', width=.5,aes(fill=PARTY)) +
  geom_text(aes(label=round(SWING,1),vjust="center"),position = position_stack(vjust = 0.5))+
  scale_fill_manual(values=c("#00BFFF","#F98C1F","#22409A"))+
  labs(subtitle="Vote swing among parties 2012 to 2017", 
       title= "Bhagwanpur,Uttarakhand") + 
  coord_flip()+  
  theme(axis.title.x=element_blank(),axis.title.y=element_blank(),
        panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
        panel.background = element_blank(), axis.line = element_line(colour = "black"))+
  # 按时间维度同步过渡
  transition_time(time) +
  ease_aes('sine-in-out')

animate(draw, renderer = gifski_renderer(), nframes = 100, fps = 20)

核心修改说明

  • 新增虚拟时间字段time,分别对应所有柱状条的初始状态(SWING=0,time=0)和最终状态(真实SWING值,time=1)
  • 替换原有的transition_states为transition_time(time),保证所有柱状条随时间同步完成从0到目标值的过渡
  • 调整animate的帧数和帧率参数,可根据需要调整动画流畅度

内容的提问来源于stack exchange,提问作者DSR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 04:06:03