For plotting animation see https://github.com/thomasp85/gganimate and https://www.datanovia.com/en/blog/gganimate-how-to-create-plots-with-beautiful-animation-in-r/

mypath <- "C://Users//np83zg//OneDrive - Aalborg Universitet//Skrivebord//kommunedata//data"
setwd(mypath)
library(data.table)
library(tmap)
library(sf)
## Linking to GEOS 3.8.0, GDAL 3.0.4, PROJ 6.3.1
mydata <- as.data.table(read.table("bef_tab1.txt"))
setkey(mydata,residence,year)
mydata[,N_t:=sum(n),by=.(year)]
mydata[,s_t:=100*n/N_t]
mydata[,ds_t:=s_t-s_t[1],by=.(residence)]
mydata[,index:=-ds_t[length(ds_t)],by=.(residence)]
T <-  length(table(mydata$year))
setkey(mydata,index,year)
mydata[,id:=rep(1:98,each=T)]


library(ggplot2)
library(gganimate)
## Warning: package 'gganimate' was built under R version 4.0.3
theme_set(theme_bw())

p <- ggplot(
  mydata, 
  aes(x =id, y=ds_t, colour = as.factor(residence))
  ) +
  geom_point(show.legend = FALSE, alpha = 0.7) +
  scale_color_viridis_d() +
  scale_size(range = c(2, 12)) +
  labs(x = "Municipality ID", y = "Change in pop. share relative to year 1987") +
  transition_time(year) +
  labs(title = "Year: {frame_time}") +
  shadow_mark(alpha = 0.3, size = 0.5)

setwd("C://Users//np83zg//OneDrive - Aalborg Universitet//Skrivebord//kommunedata//scripts")
anim_save("p.gif",p)

cities <- c(101,461,751,851)
foo <- mydata[!residence%in%cities,]

p <- ggplot(
  foo, 
  aes(x =id, y=ds_t, colour = as.factor(residence))
  ) +
  geom_point(show.legend = FALSE, alpha = 0.7) +
  scale_color_viridis_d() +
  scale_size(range = c(2, 12)) +
  labs(x = "Municipality ID", y = "Change in pop. share relative to year 1987") + 
  transition_time(year) +
  labs(title = "Year: {frame_time}") +
  shadow_mark(alpha = 0.3, size = 0.5)
setwd("C://Users//np83zg//OneDrive - Aalborg Universitet//Skrivebord//kommunedata//scripts")
anim_save("p2.gif",p)