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

如何修改R代码实现视频同款多国年均降水量动态图?

问题

我希望基于逐年降雨数据生成五个国家年均降水量的动态图,目前使用gganimate和ggplot2包绘制,但效果不满意,想要做出视频45秒处的动态图效果。现有代码如下:

install.packages("gganimate")
library(gganimate)
install.packages("gifsski") # 注意拼写错误:应为gifski
install.packages("av")
install.packages("dplyr")
install.packages("rio")
library(dplyr)

data <- rio::import ("/Users/VATAN/Desktop/a/data.xlsx")

str(data)

# Plot and animate
p =  
  ggplot(data, aes(x= factor(Year), y=precipatation, group=Party, colour=Party)) +
  geom_line(size=2, show.legend = FALSE) +
  scale_color_manual(values=c("#ff9933", "#006400")) +
  scale_x_discrete(position = "top") +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
  labs(title = 'Lok Sabha Election : % of seats won', 
        x = NULL, y = NULL) +
  geom_text(aes(label=scales::percent(Perc_Seats, accuracy = 1),
                vjust= -2), show.legend = FALSE) +
  theme(plot.title = element_text(hjust = 0.5)) +
  geom_dl(aes(label=Party), method="last.points") +
  transition_reveal(Year) +
  coord_cartesian(clip = 'off') + 
  ease_aes('cubic-in-out')

animate(p, fps = 10, width = 800, height = 400)
anim_save("election.gif")

请问应如何修改代码以实现目标效果?

解决方案

你的现有代码是针对选举数据编写的,需要完全适配降雨数据逻辑,同时调整动画参数匹配目标效果,具体修改如下:

1. 修正数据与变量映射

  • 将原代码中选举相关的Party变量,替换为降雨数据中的国家分组列(假设列名为Country)
  • 修正降水量变量名拼写错误:precipatation → precipitation
  • 将Year转为数值型,避免离散轴导致的动画卡顿问题
  • 移除百分比格式(降雨数据为绝对值,无需百分比转换)

2. 调整图层与视觉样式

  • 将x轴改回底部(符合常规图表阅读习惯),使用连续型年份轴
  • 扩展颜色映射到5个国家,选择区分度高的配色
  • 修改geom_text显示降水量数值,而非选举席位百分比
  • 保留geom_dl实现国家标签跟随线条末端的效果

3. 优化动画逻辑

  • 调整transition_reveal参数,确保线条平滑逐步绘制
  • 提升动画帧率与时长,增强流畅度;若需视频格式,切换至av渲染器

修改后的完整代码

# 安装并加载所需包
install.packages(c("gganimate", "gifski", "av", "dplyr", "rio", "directlabels"))
library(gganimate)
library(dplyr)
library(rio)
library(directlabels)

# 导入数据
data <- rio::import("/Users/VATAN/Desktop/a/data.xlsx")

# 数据预处理:确保年份为数值型,修正变量名
data <- data %>%
  mutate(Year = as.numeric(Year),
         precipitation = as.numeric(precipitation)) # 修正拼写后的降水量列

# 绘制动态图
p <- ggplot(data, aes(x = Year, y = precipitation, group = Country, colour = Country)) +
  # 绘制线条,设置合适宽度
  geom_line(size = 1.2, show.legend = FALSE) +
  # 为5个国家设置区分度高的颜色
  scale_color_manual(values = c("#E63946", "#1D3557", "#457B9D", "#A8DADC", "#F1FAEE")) +
  # x轴设为连续型,放在底部
  scale_x_continuous(position = "bottom") +
  # y轴显示原始降水量数值,按需设置刻度
  scale_y_continuous(breaks = seq(0, max(data$precipitation, na.rm = TRUE), 500)) +
  # 修改标题与轴标签
  labs(title = "五个国家年均降水量变化趋势",
       x = "年份", y = "年均降水量(mm)") +
  # 显示每个数据点的降水量数值,调整位置避免遮挡
  geom_text(aes(label = round(precipitation, 1)),
            vjust = -0.5, size = 3.5, show.legend = FALSE) +
  # 主题调整:标题居中,背景简洁
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5, size = 14, face = "bold"),
        axis.title = element_text(size = 12)) +
  # 国家标签跟随线条末端
  geom_dl(aes(label = Country), method = "last.points", size = 4) +
  # 动画逻辑:按年份逐步展示线条
  transition_reveal(Year) +
  # 允许标签超出绘图区域不被裁剪
  coord_cartesian(clip = 'off') +
  # 动画缓动效果,让线条绘制更自然
  ease_aes('linear')

# 生成动画:如果要视频格式,用renderer = av_renderer()
animate(p, fps = 15, width = 900, height = 500, duration = 10, renderer = gifski_renderer())
# 保存动画,gif或视频格式
anim_save("precipitation_trend.gif")
# 如果要保存视频:anim_save("precipitation_trend.mp4", renderer = av_renderer())

关键说明

  • 确保你的降雨数据包含Year(年份)、Country(国家)、precipitation(年均降水量)三列,若列名不同,需对应修改代码中的变量名
  • 颜色值可根据需求自行替换,保证5个国家颜色区分明显
  • 调整duration参数控制动画总时长,fps控制流畅度,数值越高动画越流畅

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 19:23:22