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

如何用R将Scatter3D绘制的3D图导出为自定义旋转GIF动画?

用R生成plot3D绘制的3D图旋转GIF动画

问题背景

已通过plot3D包绘制带拟合曲面的3D散点图,也能借助plot3Drgl实现鼠标交互旋转,但需要生成可自定义旋转角度、速度的连续旋转GIF动画。

实现方案

可以通过生成不同视角的静态图像,再合成GIF的方式实现,核心用到plot3D(绘制3D图)和magick(合成GIF)包,步骤如下:

  1. 准备数据与拟合模型(复用原有代码并修正变量引用问题)
  2. 定义旋转角度序列,控制旋转范围与步长
  3. 循环绘制每个视角的图像并保存为临时文件
  4. 读取所有静态图合成GIF,自定义速度与循环次数

完整代码

# 加载所需包
library(plot3D)
library(magick)

# 1. 准备数据与拟合模型
Dati <- data.frame(
  "% Ampiezza" = c(100, 100, 100, 100, 50, 25, 25),
  "% frequenza" = c(25, 50, 75, 100, 25, 25, 50),
  "stima quantità applicata" = c(18.12631579, 27.83157895, 42.37894737, 51.57894737, 13.27157895, 8.147368421, 12.58947368)
)

x <- Dati$`% Ampiezza`
y <- Dati$`% frequenza`
z <- Dati$`stima quantità applicata`

# 拟合线性模型
fit <- lm(z ~ x + y)

# 生成拟合曲面的网格数据
grid.lines = 26
x.pred <- seq(min(x), max(x), length.out = grid.lines)
y.pred <- seq(min(y), max(y), length.out = grid.lines)
xy <- expand.grid(x = x.pred, y = y.pred)
z.pred <- matrix(predict(fit, newdata = xy), 
                 nrow = grid.lines, ncol = grid.lines)
fitpoints <- predict(fit)

# 2. 定义旋转角度序列(控制旋转范围与步长)
# theta从0到350度,步长10度:步长越小,旋转越平滑
theta_seq <- seq(0, 350, by = 10)
img_paths <- character(length(theta_seq))

# 3. 循环绘制并保存每个视角的图像
for (i in seq_along(theta_seq)) {
  theta_val <- theta_seq[i]
  img_path <- paste0("temp_plot_", i, ".png")
  img_paths[i] <- img_path
  
  # 绘制图像并保存为PNG
  png(img_path, width = 800, height = 600, res = 100)
  scatter3D(x, y, z, pch = 18, cex = 2, 
            theta = theta_val, phi = 20, ticktype = "detailed",
            xlab = "% Ampiezza", ylab = "% Frequenza", zlab = "Quantità reale",  
            surf = list(x = x.pred, y = y.pred, z = z.pred,  
                        facets = NA, fit = fitpoints), main = "Titolo")
  dev.off()
}

# 4. 合成GIF并保存
# 读取所有临时图像
img_list <- lapply(img_paths, image_read)
# 拼接图像序列
img_joined <- image_join(img_list)
# 设置动画参数:delay为帧间隔(1/100秒,数值越小速度越快),loop=0表示无限循环
img_animated <- image_animate(img_joined, delay = 50, loop = 0)
# 保存GIF文件
image_write(img_animated, "3d_rotation.gif")

# 可选:删除临时PNG文件
file.remove(img_paths)

自定义参数说明

  • 旋转速度:调整theta_seq的by参数(步长越小,每帧角度变化越小,动画越平滑但速度变慢),或修改image_animate的delay参数(数值越小,帧间隔越短,速度越快)
  • 旋转方向/范围:修改theta_seq的起始、结束值,比如seq(90, 270, by=5)实现局部范围旋转;若要实现上下旋转,可定义phi_seq替代固定的phi=20
  • 图像清晰度:调整png()函数的width、height和res参数,提升输出GIF的分辨率

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 09:57:54