I created a GIF animation with gifski
package in R
.
Here is the input and output data (sorry I do not know if it can be shared via online storage service).
https://drive.google.com/drive/folders/1Zj2tXBKrfNfM3ezi4hKF8He4CVYImT4L?usp=sharing
这是用于估算的原始地图。
在估算(测试)中,你可以看到一个圈子被定在底线上的固定红色点,在移动蓝点之间距离过远的地方,其面积(半径)。
这一圈子的信息在<代码>circle_df.rds上作了分类,其中仅包含13秒钟,而存储在<代码>gps.rds上的蓝点信息则包含大约700秒钟。 我所希望的结果是,在<代码>circle_df上的这些圈子,只有在时间框架涉及<代码>circle_df所储存的时间时,才能显示,不过,目前的估算从开始到数据框架结束时,圈子的大小就不断显现。 例如,在<代码>circle_df上的第一和第二圈,时间是11:41和11:31:14,因此,圈子不应在时间之间展示,而是在目前的估算中出现。
这里是一个可再生的例子:
## Google maps API
register_google(key="YOURKEY", write=TRUE)
## Extract satellite image from google maps
map <- ggmap(get_googlemap(center=cor, zoom=18, maptype="satellite"))
## Plot map
p <- map +
geom_point(data=gps, aes(x=lon, y=lat),
color="blue", size=2, shape=10) +
geom_point(data=sensor, aes(x=lon, y=lat),
color="red", fill="white", size=3.4, shape=21) +
# Add labels at the center of each point
geom_text(data=sensor, aes(x=lon, y=lat, label=ID),
color="red", fontface="bold", size=2.4, vjust=0.24) +
## Circle from sensor
geom_circle(data=circle_df, aes(x0=lon, y0=lat,
color=signal, r=as.numeric(distance_deg)),
fill=NA, alpha=0.6, linewidth=0.8) +
scale_color_gradient(low="dodgerblue", high="red",
name=expression("Signal Intensity
(-100 to 0)"),
# breaks=seq(-100, 0, by=10), limits=c(-100,0),
guide = guide_colorbar(title.theme=element_text(color="white", size=10),
label.theme = element_text(color = "white", size=10),
barwidth=1, barheight = 5, nbin = 10)) +
## Theme
theme(axis.title.x=element_blank(),
axis.text.x = element_blank(),
axis.title.y=element_blank(),
axis.text.y = element_blank(),
axis.ticks = element_blank(),
rect = element_blank(),
legend.position=c(0.9,0.14),
plot.margin = unit(c(0, 0, 0, 0), "cm")) +
## Animation
## Variable to animate
transition_time(time) +
## Title
ggtitle( Time:, {frame_time} ,
subtitle = Frame {frame} of {nframes} ) # +
## Add slider
# slider::slidify(gps$time, time_range=range(gps$time))
## Animate
## Number of frames
frame <- as.integer((max(gps$time) - min(gps$time)) * 60)
## Plot
anime <- animate(p, nframes=frame, fps=round(frame/20))
# Change x in frame/x based on duration of animation (x)
## Save
anim_save("test.gif", anime) ; anime