我有一个数据框,其中每一行都包含有关某个时间点8点坐标的信息:
时间x1 y1 x2 y2 x3 y3 ... x8 y8
例如,行可能如下所示:
myData <- data.frame(time=0.1,x1=-7.79,y1=7.32,x2=-3.86,y2=-1.62,x3=-1.35,y3=-4.61,x4=-6.24,y4=-9.89,x5=-6.40,y5=2.00,x6=4.02,y6=4.77,x7=-1.42,y7=9.89,x8=6.59,y8=-8.02)
我遇到的问题是ggplot只接受每个轴的1个列名。此外,我想使用gganimate动画点的运动,这就是我想使用ggplot的原因。我怎么能这样做?
我设法通过使用标准R plot()方法为每个时间点绘制一个绘图来动画数据并重新绘制它,但这不允许我保存动画或进一步使用它。
答案 0 :(得分:1)
我只是习惯了tidyr
和管道操作员,所以我很感激任何改进这个答案的建议:
首先需要重塑数据(如@Heroka建议的那样),然后分割轴和点(它们混合在x1,y8名称中),这样你就会得到一个形状合适的数据框,你可以传递给ggplot:
gather(myData, "coord", "value", -time) %>%
separate(coord, sep = 1, into = c("axis", "val2")) %>%
spread(key = axis, value = value) %>%
ggplot(aes(x = x, y = y)) + geom_point()
我不熟悉gganimate
,但我很确定你可以在这里找到自己的路径......
编辑:
如果您将最后一行代码更改为:
,则可以识别每个点ggplot(aes(x = x, y = y, color = val2)) + geom_point()
编辑2:
按照@Sitbu的建议,我改变了第一行代码
答案 1 :(得分:1)
这建立在PavoDive的答案之上,只是添加动画部分的完成方式。
我定义了一个更大的数据集,以便实际存在一些动画:
set.seed(1544)
myData <- data.frame(seq(0, 1, by = 0.1),
matrix(runif(11*8*2, -10, 10), nrow = 11))
names(myData) <- c("time", paste0(c("x", "y"), rep(1:8, each = 2)))
然后我使用PavoDive的代码转换为长格式:
library(tidyr)
library(magrittr)
long_data <-
gather(myData, "coord", "value", -time) %>%
separate(coord, sep = 1, into = c("axis", "val2")) %>%
spread(key = axis, value = value)
使用gg_animate()
幸运的是相当简单。您所要做的就是添加框架美学:
p <- ggplot(long_data, aes(x = x, y = y, frame = time)) + geom_point()
gg_animate(p, "animation.gif")
如果您使用的是RStudio,则可以省略gg_animate()
中的文件名,以在RStudio的情节窗格中显示该情节。