[R-sig-Geo] dynamic (interactive) representation of several GPS trajectories
Mathieu Basille
basille.web at ase-research.org
Fri Feb 20 22:39:30 CET 2015
In addition to Roman's suggestion, I tweaked the function 'plot.ltraj' to
successfully implement a non-interactive version of what (I think) you
want, that is a video (for an interactive version of it, keep reading and
see below, but there would be only one individual unfortunately). Among a
few other things, the function now allows to plot all (selected)
individuals on the same plot (argument 'by = "none"), which is relevant for
your purpose. It also allow you to modify point/line graphical settings.
The modified function is available in the package "hab":
http://ase-research.org/basille/hab
(probably better to install the one from GitHub directly)
Keep in mind that this is not a package as stable as adehabitatLT. I do my
best, but use at your own risks! ;)
Now, if you would like to export a video, you could use the modified
'plot.ltraj' to do essentially the following steps:
* prepare a time sequence
* use this sequence to loop over the whole ltraj, subset the relevant time
period, and plot it
* export as PNG at each step
* use ffmpeg to convert it in mp4 video
The resulting video looks like this:
http://ase-research.org/basille/pres/Basille_FLREC_2014/video/wost.mp4
or that:
http://ase-research.org/basille/pres/Basille_FLREC_2014/video/wost-dark.mp4
with different graphical parameters. In details (but you'll have to adjust
it to your own data), it goes like this ['wlt' is the ltraj object]:
## ================================================ ##
## Load 'hab' and 'lubridate' (for time management)
library(hab)
library(lubridate)
## Prepare the sequence (tseq12 every 12 hours)
tseq12 <- seq(ymd("20090301"), ymd("20111231"), by = 3600*12)
length(tseq12)
## Prepare the graphical parameters with the complete plot
library(RColorBrewer)
wcol <- brewer.pal(8, "Dark2")
names(wcol) <- burst(wlt)
par(mar = c(0, 0, 0, 0), bg = "#3b3f43")
plot(wlt, by = "none", axes = FALSE, ppar = list(pch = 20, col = wcol),
lpar = list(col = wcol, lwd = 3), spoldf = wMapc, spoldfpar = list(col =
"#ecececff", border = NA), final = FALSE)
text(x = 0, y = 3000000, label = paste(month(tseq12[1], label = TRUE),
year(tseq12[1]), sep = "\n"), cex = 3, col = "#ecececff")
## And plot windows of 5 days in a loop
library(Cairo)
for (i in 1:length(tseq12)) {
CairoPNG(filename = paste0("img/wost", sprintf("%05d", i),
".png"), bg = "#fdfbf4ff", width = 1000, height = 1000)
par(mar = c(0, 0, 0, 0), bg = "#fdfbf4ff")
plot(subset(wlt, date >= tseq12[i] & date < tseq12[i] + 3600 *
24 * 5), by = "none", axes = FALSE, ppar = list(pch = 20,
col = wcol, cex = 4), lpar = list(col = wcol, lwd = 12),
spoldf = wMapc, spoldfpar = list(col = "white", border =
"#a6a6a6ff", lwd = 3),
final = FALSE, xlim = range(coordinates(wostsub)[, "x"]),
ylim = range(coordinates(wostsub)[, "y"]))
text(x = 0, y = 3e+06, label = paste(month(tseq12[i], label = TRUE),
year(tseq12[i]), sep = "\n"), cex = 6, col = "#a6a6a6ff")
dev.off()
}
## Finally convert to a video with ffmpeg
## https://trac.ffmpeg.org/wiki/Create%20a%20video%20slideshow%20from%20images
system("ffmpeg -r 0.3 -framerate 30 -i img/wost%05d.png -c:v libx264
-pix_fmt yuv420p video/wost.mp4")
## ================================================ ##
Looks quite complicated, but I promise it's not that difficult!
Now for the interactive version: I also tweaked 'trajdyn' quite a bit: it
allows to display only a given number of steps, increment by a given number
of steps, change point/line graphical parameters, etc. *But* it doesn't
allow to display several bursts/individuals at once, just as 'plot.ltraj'
now does... This is a strong limitation to what you want to achieve, and
I'm afraid that implementing it (which would be interesting, but I did not
have that in mind yet) would be a tremendous work.
Hope this helps,
Mathieu.
Le 20/02/2015 05:43, Gabriele Cozzi a écrit :
> Dear list,
>
> I have relocation data for about 20 individuals (ID) for a total of about
> 70K rows organised in the following data frame:
> timevar <-as.numeric(Timestamp); SB is categorical with 2 levels, the other
> variables are self-explanatory I think
>
> ID Date Time Timestamp Lon Lat
> Alti SB timevar
> D 2013-01-01 18:40:00 2013-01-01 18:40:00 21.85803 -26.99953 917 0 1500
> D 2013-01-01 18:55:00 2013-01-01 18:55:00 21.85877 -27.00000 921 0 2400
> D 2013-01-01 19:10:00 2013-01-01 19:10:00 21.85907 -27.00015 925 0 3300
> A 2013-01-01 19:27:00 2013-01-01 19:27:00 21.85875 -27.00142 922 1 4320
> A 2013-01-02 06:40:00 2013-01-02 06:40:00 21.85872 -27.00142 919 1 44700
> A 2013-01-02 06:55:00 2013-01-02 06:55:00 21.86060 -27.00090 916 0 45600
> .. ............... ........... ......................
> ........ ......... .... .. ......
>
> What I would like to do is to create an animated plot where I can see how
> the various individuals move in relationship to each other.
>
> The gvisMotionChart() function from the googleVis package does what I need
> on a small subset of my data but it crashes if I try to do the same on the
> entire data set.
>
> A reproducible example for two individuals:
> x <- rnorm(40, 21, 0.5)
> y <- rnorm(40, -27, 0.5)
> ID <- rep(c("A","B"), each=20)
> Alt <- floor(rnorm(40, 900, 10))
> tvar <- 1:40
> tvarA <- sample(tvar,20)
> tvarB <- setdiff(tvar, tvarA)
>
> DF <- data.frame(ID,x,y,Alt,tvar = c(tvarA,tvarB))
> DF <- DF[order(DF$ID,DF$tvar),]
>
> library(googleVis)
> plot(gvisMotionChart(DF, idvar="ID", timevar= "tvar"))
>
>
> An alternative along the lines of what I want would be the
> trajdyn{adehabitatLT}, even if it does not allow dynamic movements of more
> than one individual at the time, which is unfortunate in my case.
>
> Any suggestion regarding alternative packages/functions is highly
> appreciated.
>
> Thanks in advance,
> Gabriele
>
>
--
~$ whoami
Mathieu Basille
http://ase-research.org/basille
~$ locate --details
University of Florida \\
Fort Lauderdale Research and Education Center
(+1) 954-577-6314
~$ fortune
« Le tout est de tout dire, et je manque de mots
Et je manque de temps, et je manque d'audace. »
-- Paul Éluard
--
~$ whoami
Mathieu Basille
http://ase-research.org/basille
~$ locate --details
University of Florida \\
Fort Lauderdale Research and Education Center
(+1) 954-577-6314
~$ fortune
« Le tout est de tout dire, et je manque de mots
Et je manque de temps, et je manque d'audace. »
-- Paul Éluard
More information about the R-sig-Geo
mailing list