Esta dashboard pretende ser um exercício de recolha, tratamento e visualização de dados, utilizando software open-source (R software
).
Esta App utiliza os seguintes packages: shiny
, sf
, leaflet
, dplyr
, ggplot2
, plotly
, units
, rmarkdown
.
A informação sobre as ciclovias foi recolhida através do portal de geodados da Câmara Municipal de Lisboa, que mantém esta base de dados actualizada com regularidade.
última actualização: 08.Fevereiro.2024
O ano de construção e tipologias foram depois acertadas, tal como desrito no código-fonte. São também apresentadas ciclovias que deixaram de existir ou que foram corrigidas, tais como:
Este site foi desenvolvido por Rosa Félix, investigadora na área da mobilidade ciclável no U-Shift lab, do CERIS, no Instituto Superior Técnico - Universidade de Lisboa.
Falta alguma ciclovia? Há um troço mal classificado? A ciclovia não foi construída naquele ano?
Deixa os teus comentários em https://github.com/U-Shift/RedeCiclavel-Lisboa/issues
Obrigada!
knitr::opts_chunk$set(echo = TRUE)
library(rmarkdown)
library(tidyverse)
library(sf)
library(mapview)
library(units)
library(cartography)
Download da informação geoffererenciada a partir do servidor da CML: https://services.arcgis.com/1dSrzEWVQn5kHHyK/arcgis/rest/services/Ciclovias/FeatureServer/0/query?outFields=*&where=1%3D1&f=geojson
CicloviasAnteriores = readRDS("CicloviasAnos/CicloviasAnos.Rds")
Ciclovias2023 = st_read("https://services.arcgis.com/1dSrzEWVQn5kHHyK/arcgis/rest/services/Ciclovias/FeatureServer/0/query?outFields=*&where=1%3D1&f=geojson")
length(unique(Ciclovias2023$OBJECTID)) #892
length(unique(Ciclovias2023$COD_SIG)) #864
Adicionar campo de ID único
, enquanto a BD oficial não tiver um.
# ver primeiro as que já tínhamos
Ciclovias2023 = Ciclovias2023 |> select(COD_SIG, DESIGNACAO, TIPOLOGIA, NIVEL_SEGREGACAO, ANO, Shape__Length, geometry)
Ciclovias2023$IDunico = paste(Ciclovias2023$COD_SIG, round(Ciclovias2023$Shape__Length), sep = "_" )
Ciclovias2023 = Ciclovias2023[,c(7,2:5)]
table(duplicated(Ciclovias2023$IDunico)) #0
Agora temos um campo único para cada segmento.
Adicionar as novas que não estavam na shp anterior de Dez 2022.
#filtrar só últimos anos
Ciclovias2023 = Ciclovias2023 %>% filter(ANO == 2023)
# atenção que há umas que vêm da CML que não têm ano atribuído!
#exportar e abrir no sig
st_write(Ciclovias2023, "data/Ciclovias2023_dez_cml.gpkg", delete_dsn = TRUE)
Ciclovias2023_semdata = st_read("https://services.arcgis.com/1dSrzEWVQn5kHHyK/arcgis/rest/services/Ciclovias/FeatureServer/0/query?outFields=*&where=1%3D1&f=geojson")
Ciclovias2023_semdata = Ciclovias2023_semdata |> filter(ANO == "Sem dados")
#exportar e abrir no sig
st_write(Ciclovias2023_semdata, "data/Ciclovias2023_semdata_dez_cml.gpkg", delete_dsn = TRUE)
mapview(Ciclovias2023_semdata)
Neste caso removeu-se um troço de ciclovia na Rua Francisco Gentil Martins (que já existia anteriormente), e adicionou-se o troço da Rua da Prata. Atualizou-se a ciclovia da Av Berna / Praça de Espanha, que passou a ter nova configuração.
Ciclovias2023_new = st_read("data/Ciclovias2023_dez_corrigido.gpkg")
AvBerna23 = st_read("data/avberna_2023.gpkg", layer = "avberna_2023")
Ciclovias2023_new = rbind(Ciclovias2023_new|> select(-NIVEL_SEGREGACAO), AvBerna23 |> select(-AnoT, -lenght))
# Rua da Prata em dúvida quanto à sua categoria
Ciclovias2023_new$TIPOLOGIA[Ciclovias2023_new$DESIGNACAO=="Rua da Prata"] = "Nao dedicada"
# por acgora fica equivalente a uma bici+30, e não um percurso ciclopedonal (tipo trilho)
Ciclovias2023_outrasanteriores = st_read("data/outras_anteriores23.gpkg")
# duplicar para os anos seguintes
# 1. Doca Pesca (desde 2019)
Ciclovias2023_outrasanteriores_1_20 = Ciclovias2023_outrasanteriores %>% filter(DESIGNACAO == "Doca Pesca") |> mutate(AnoT = 2020)
Ciclovias2023_outrasanteriores_1_21 = Ciclovias2023_outrasanteriores %>% filter(DESIGNACAO == "Doca Pesca") |> mutate(AnoT = 2021)
Ciclovias2023_outrasanteriores_1_22 = Ciclovias2023_outrasanteriores %>% filter(DESIGNACAO == "Doca Pesca") |> mutate(AnoT = 2022)
Ciclovias2023_outrasanteriores_1_23 = Ciclovias2023_outrasanteriores %>% filter(DESIGNACAO == "Doca Pesca") |> mutate(AnoT = 2023)
Ciclovias2023_outrasanteriores = rbind(Ciclovias2023_outrasanteriores, Ciclovias2023_outrasanteriores_1_20,
Ciclovias2023_outrasanteriores_1_21, Ciclovias2023_outrasanteriores_1_22,
Ciclovias2023_outrasanteriores_1_23)
# 2. Estrada do Barcal (desde 2021)
Ciclovias2023_outrasanteriores_2_22 = Ciclovias2023_outrasanteriores %>% filter(DESIGNACAO == "Estrada do Barcal") |> mutate(AnoT = 2022)
Ciclovias2023_outrasanteriores_2_23 = Ciclovias2023_outrasanteriores %>% filter(DESIGNACAO == "Estrada do Barcal") |> mutate(AnoT = 2023)
Ciclovias2023_outrasanteriores = rbind(Ciclovias2023_outrasanteriores, Ciclovias2023_outrasanteriores_2_22,
Ciclovias2023_outrasanteriores_2_23)
# 3. Fim da Rua Pinheiro Chagas (desde 2017)
Ciclovias2023_outrasanteriores_3_18 = Ciclovias2023_outrasanteriores %>% filter(DESIGNACAO == "Rua Pinheiro Chagas") |> mutate(AnoT = 2018)
Ciclovias2023_outrasanteriores_3_19 = Ciclovias2023_outrasanteriores %>% filter(DESIGNACAO == "Rua Pinheiro Chagas") |> mutate(AnoT = 2019)
Ciclovias2023_outrasanteriores_3_20 = Ciclovias2023_outrasanteriores %>% filter(DESIGNACAO == "Rua Pinheiro Chagas") |> mutate(AnoT = 2020)
Ciclovias2023_outrasanteriores_3_21 = Ciclovias2023_outrasanteriores %>% filter(DESIGNACAO == "Rua Pinheiro Chagas") |> mutate(AnoT = 2021)
Ciclovias2023_outrasanteriores_3_22 = Ciclovias2023_outrasanteriores %>% filter(DESIGNACAO == "Rua Pinheiro Chagas") |> mutate(AnoT = 2022)
Ciclovias2023_outrasanteriores_3_23 = Ciclovias2023_outrasanteriores %>% filter(DESIGNACAO == "Rua Pinheiro Chagas") |> mutate(AnoT = 2023)
Ciclovias2023_outrasanteriores = rbind(Ciclovias2023_outrasanteriores, Ciclovias2023_outrasanteriores_3_18,
Ciclovias2023_outrasanteriores_3_19, Ciclovias2023_outrasanteriores_3_20,
Ciclovias2023_outrasanteriores_3_21, Ciclovias2023_outrasanteriores_3_22,
Ciclovias2023_outrasanteriores_3_23)
# 4. Convesão de troço nas Docas de Alcântara (desde 2009)
# mapview(Ciclovias2020T |> filter(AnoT == 2020, DESIGNACAO == "Troço da Frente Ribeirinha"), zcol = "TIPOLOGIA")
Ciclovias2023_outrasanteriores_4_09 = Ciclovias2020T |> filter(AnoT == 2020, DESIGNACAO == "Troço da Frente Ribeirinha")
Ciclovias2023_outrasanteriores_4_09$TIPOLOGIA[Ciclovias2023_outrasanteriores_4_09$IDunico == "4004"] = "Percurso Ciclo-pedonal"
# mapview(Ciclovias2023_outrasanteriores_4_09, zcol = "TIPOLOGIA")
st_geometry(Ciclovias2023_outrasanteriores_4_09) = "geom"
Ciclovias2023_outrasanteriores_4_09 = Ciclovias2023_outrasanteriores_4_09 |> select(dput(names(Ciclovias2023_outrasanteriores_3_23))) |>
mutate(AnoT = 2009)
Ciclovias2023_outrasanteriores_4_10 = Ciclovias2023_outrasanteriores_4_09 |> mutate(AnoT = 2010)
Ciclovias2023_outrasanteriores_4_11 = Ciclovias2023_outrasanteriores_4_09 |> mutate(AnoT = 2011)
Ciclovias2023_outrasanteriores_4_12 = Ciclovias2023_outrasanteriores_4_09 |> mutate(AnoT = 2012)
Ciclovias2023_outrasanteriores_4_13 = Ciclovias2023_outrasanteriores_4_09 |> mutate(AnoT = 2013)
Ciclovias2023_outrasanteriores_4_14 = Ciclovias2023_outrasanteriores_4_09 |> mutate(AnoT = 2014)
Ciclovias2023_outrasanteriores_4_15 = Ciclovias2023_outrasanteriores_4_09 |> mutate(AnoT = 2015)
Ciclovias2023_outrasanteriores_4_16 = Ciclovias2023_outrasanteriores_4_09 |> mutate(AnoT = 2016)
Ciclovias2023_outrasanteriores_4_17 = Ciclovias2023_outrasanteriores_4_09 |> mutate(AnoT = 2017)
Ciclovias2023_outrasanteriores_4_18 = Ciclovias2023_outrasanteriores_4_09 |> mutate(AnoT = 2018)
Ciclovias2023_outrasanteriores_4_19 = Ciclovias2023_outrasanteriores_4_09 |> mutate(AnoT = 2019)
Ciclovias2023_outrasanteriores_4_20 = Ciclovias2023_outrasanteriores_4_09 |> mutate(AnoT = 2020)
Ciclovias2023_outrasanteriores_4_21 = Ciclovias2023_outrasanteriores_4_09 |> mutate(AnoT = 2021)
Ciclovias2023_outrasanteriores_4_22 = Ciclovias2023_outrasanteriores_4_09 |> mutate(AnoT = 2022)
Ciclovias2023_outrasanteriores_4_23 = Ciclovias2023_outrasanteriores_4_09 |> mutate(AnoT = 2023)
Ciclovias2023_outrasanteriores = rbind(Ciclovias2023_outrasanteriores, Ciclovias2023_outrasanteriores_4_09, Ciclovias2023_outrasanteriores_4_10,
Ciclovias2023_outrasanteriores_4_11, Ciclovias2023_outrasanteriores_4_12, Ciclovias2023_outrasanteriores_4_13,
Ciclovias2023_outrasanteriores_4_14, Ciclovias2023_outrasanteriores_4_15, Ciclovias2023_outrasanteriores_4_16,
Ciclovias2023_outrasanteriores_4_17, Ciclovias2023_outrasanteriores_4_18, Ciclovias2023_outrasanteriores_4_19,
Ciclovias2023_outrasanteriores_4_20, Ciclovias2023_outrasanteriores_4_21, Ciclovias2023_outrasanteriores_4_22,
Ciclovias2023_outrasanteriores_4_23)
CicloviasAnteriores = CicloviasAnteriores |> filter(!(DESIGNACAO == "Troço da Frente Ribeirinha")) # remover versão anterior
# 5. Conversão de troço na Estrada da Circunvalação, Parque Campismo (desde 2022)
# mapview(CicloviasAnteriores |> filter(AnoT == 2022, DESIGNACAO == "Estrada da Circunvalação"), zcol = "TIPOLOGIA")
Ciclovias2023_outrasanteriores_5_22 = Ciclovias2023_outrasanteriores |> filter(AnoT %in% c(2021, 2022), DESIGNACAO == "Estrada da Circunvalação")
Ciclovias2023_outrasanteriores_5_22 = Ciclovias2023_outrasanteriores_5_22 |>
mutate(id = seq(1:nrow(Ciclovias2023_outrasanteriores_5_22))) |>
filter(TIPOLOGIA != "30+Bici") |>
filter(!id %in% c(5,7)) |>
select(-id) |>
mutate(AnoT = 2022)
# mapview(Ciclovias2023_outrasanteriores_5_22, zcol = "TIPOLOGIA")
Ciclovias2023_outrasanteriores_5_23 = Ciclovias2023_outrasanteriores_5_22 |> mutate(AnoT = 2023)
Ciclovias2023_outrasanteriores = rbind(Ciclovias2023_outrasanteriores, Ciclovias2023_outrasanteriores_5_22,
Ciclovias2023_outrasanteriores_5_23)
CicloviasAnteriores = CicloviasAnteriores |> filter(!(DESIGNACAO == "Estrada da Circunvalação")) # remover versão anterior
# limpar
rm(Ciclovias2023_outrasanteriores_1_20, Ciclovias2023_outrasanteriores_1_21, Ciclovias2023_outrasanteriores_1_22, Ciclovias2023_outrasanteriores_1_23,
Ciclovias2023_outrasanteriores_2_22, Ciclovias2023_outrasanteriores_2_23, Ciclovias2023_outrasanteriores_3_18, Ciclovias2023_outrasanteriores_3_19,
Ciclovias2023_outrasanteriores_3_20, Ciclovias2023_outrasanteriores_3_21, Ciclovias2023_outrasanteriores_3_22, Ciclovias2023_outrasanteriores_3_23,
Ciclovias2023_outrasanteriores_4_09, Ciclovias2023_outrasanteriores_4_10, Ciclovias2023_outrasanteriores_4_11, Ciclovias2023_outrasanteriores_4_12,
Ciclovias2023_outrasanteriores_4_13, Ciclovias2023_outrasanteriores_4_14, Ciclovias2023_outrasanteriores_4_15, Ciclovias2023_outrasanteriores_4_16,
Ciclovias2023_outrasanteriores_4_17, Ciclovias2023_outrasanteriores_4_18, Ciclovias2023_outrasanteriores_4_19, Ciclovias2023_outrasanteriores_4_20,
Ciclovias2023_outrasanteriores_4_21, Ciclovias2023_outrasanteriores_4_22, Ciclovias2023_outrasanteriores_4_23, Ciclovias2023_outrasanteriores_5_22,
Ciclovias2023_outrasanteriores_5_23)
# Juntar 2023 novamente
Ciclovias2023_new = Ciclovias2023_new |> select(DESIGNACAO, TIPOLOGIA, geom) |>
mutate(ANO = 2023, AnoT = 2023, lenght = st_length(geom) %>% units::set_units(km))
# # rename sf column
# st_geometry(Ciclovias2023_new) = "geom"
Ciclovias2023_outrasanteriores = Ciclovias2023_outrasanteriores |>
mutate(lenght = st_length(geom) %>% units::set_units(km))
Ciclovias2023_new = rbind(Ciclovias2023_new, Ciclovias2023_outrasanteriores)
Em dedicadas (uni e bi-direccionais, pistas cicláveis) e não-dedicadas (30+bici, zona de coexistência), e percursos em coexistência com o peão (ciclo-pedonal)
table(Ciclovias2023_new$TIPOLOGIA)
Ciclovias2023_new$TIPOLOGIA[Ciclovias2023_new$TIPOLOGIA=="Percurso Ciclopedonal"] = "Percurso Ciclo-pedonal"
Ciclovias2023_new$TIPOLOGIA[Ciclovias2023_new$TIPOLOGIA=="Pista Ciclavel Bidirecional"] = "Ciclovia dedicada"
Ciclovias2023_new$TIPOLOGIA[Ciclovias2023_new$TIPOLOGIA=="Pista Ciclável Bidirecional"] = "Ciclovia dedicada"
Ciclovias2023_new$TIPOLOGIA[Ciclovias2023_new$TIPOLOGIA=="Pista Ciclável Unidirecional"] = "Ciclovia dedicada"
Ciclovias2023_new$TIPOLOGIA[Ciclovias2023_new$TIPOLOGIA=="Pista ciclável (ciclovia)"] = "Ciclovia dedicada"
Ciclovias2023_new$TIPOLOGIA[Ciclovias2023_new$TIPOLOGIA=="Contrassentido"] = "Ciclovia dedicada"
Ciclovias2023_new$TIPOLOGIA[Ciclovias2023_new$TIPOLOGIA=="Faixa Ciclável"] = "Ciclovia dedicada"
Ciclovias2023_new$TIPOLOGIA[Ciclovias2023_new$TIPOLOGIA=="30+Bici"] = "Nao dedicada"
Ciclovias2023_new$TIPOLOGIA[Ciclovias2023_new$TIPOLOGIA=="Zona de Coexistência"] = "Nao dedicada"
#factor tipologia
Ciclovias2023_new$TIPOLOGIA = factor(Ciclovias2023_new$TIPOLOGIA)
#prolongar vida ultimos anos
CicloviasAnteriores_23 = CicloviasAnteriores %>% filter(AnoT == 2022) %>% mutate(AnoT = 2023)
CicloviasAnteriores = rbind(CicloviasAnteriores, CicloviasAnteriores_23)
#juntar
Ciclovias = bind_rows(CicloviasAnteriores, Ciclovias2023_new)
#remover duplicados
Ciclovias = distinct(Ciclovias)
#recalcular geometria
# Ciclovias$lenght = st_length(Ciclovias) %>% units::set_units(km)
sum(Ciclovias$lenght)
# calma, há segmentos que foram destruídos entretanto
Todas as ciclovias que existem ou existiram no server da CML
mapview::mapview(Ciclovias, zcol="TIPOLOGIA", lwd=1.5, hide=F, legend=T)
# remover anterior Av Berna em 2023
Ciclovias = Ciclovias %>% filter(!(DESIGNACAO == "Avenida de Berna" & AnoT == 2023)) # Av berna todas
Ciclovias = Ciclovias %>% filter(!(DESIGNACAO == "Praça Espanha" & AnoT == 2023 & ANO == 2021)) # Pç espanha ligacao
#as novas configurações da Pc Espanha já vinham no ficheiro avberna_2023
cic23=Ciclovias[Ciclovias$AnoT==2023,]
# greens3 = cartography::carto.pal(pal1 = "green.pal", 3)
# greens3 = rev(greens3)
greens3 = c("#197230", "#5A9C50", "#B2D6A3")
mapview(cic23, zcol="TIPOLOGIA", color = greens3, lwd=1.5, hide=F, legend=T)
#Adicionar campo com extensão da rede acumulada
CicloviasKM = Ciclovias %>% select(AnoT, lenght, TIPOLOGIA) %>% st_drop_geometry()
CicloviasKMnull = data.frame(TIPOLOGIA= c("Nao dedicada", "Nao dedicada"),
lenght=0, AnoT = c(2001,2002),stringsAsFactors=FALSE)
CicloviasKMnull$lenght = CicloviasKMnull$lenght %>% units::set_units(km)
CicloviasKM = rbind(CicloviasKM,CicloviasKMnull)
CicloviasKM = CicloviasKM %>% group_by(AnoT, TIPOLOGIA) %>% summarise(lenght = sum(lenght, na.rm=TRUE)) %>% ungroup()
CicloviasKM$Kms <- paste(round(CicloviasKM$lenght,digits = 0),"km", sep=" ")
Porque senão ficava muito lento
CicloviasAnos = Ciclovias %>%
group_by(DESIGNACAO,TIPOLOGIA,AnoT,ANO) %>% summarise() %>% ungroup()
CicloviasAnos$lenght = st_length(CicloviasAnos) %>% units::set_units(km)
sum(CicloviasAnos$lenght[CicloviasAnos$AnoT==2023]) #extensão da rede actual
Na pasta da app
saveRDS(CicloviasAnos, "CicloviasAnos/CicloviasAnos.Rds")
saveRDS(CicloviasKM, "CicloviasAnos/CicloviasKM.Rds")
st_write(Ciclovias, "data/Ciclovias_dez2023_CORRECT.gpkg", delete_dsn = TRUE)
knitr::opts_chunk$set(echo = TRUE)
library(tidyverse)
library(sf)
library(animation)
#Limites de Lisboa
LisboaLimite = st_read("data/Lisboa_limite.gpkg")
LisboaLimite = LisboaLimite[,c(3,5)] %>% st_transform(LisboaLimite, crs = 4326)
attr(LisboaLimite, "sf_column") = "geometry"
colnames(LisboaLimite)[colnames(LisboaLimite)=="geom"] <- "geometry"
# LisboaLimite2 = st_read("data/LisboaLimite.shp")
# st_write(LisboaLimite2, "data/LisboaLimite.shp", append = F)
CICLOVIAS = readRDS("CicloviasAnos/CicloviasAnos.Rds")
vazios <-data.frame(DESIGNACAO = as.character(NA),
TIPOLOGIA = as.character(NA),
AnoT = as.integer(c(2002,2004,2006,2007,2015)))
vazios$ANO <-vazios$AnoT
vazios$geom<-st_sfc(st_multilinestring())
vazios<-st_sf(vazios, crs=4326)
vazios$lenght = units::set_units(0, km)
CICLOVIASgif = rbind(CICLOVIAS, vazios)
CICLOVIASredux = CICLOVIAS %>% filter(TIPOLOGIA!="Percurso Ciclo-pedonal") %>% group_by(TIPOLOGIA, AnoT) %>% summarise()
CICLOVIASgif = CICLOVIASgif %>% filter(TIPOLOGIA!="Percurso Ciclo-pedonal") %>% group_by(TIPOLOGIA, ANO) %>% summarise()
CicloviasKMredux = CicloviasKM %>% filter(TIPOLOGIA!="Percurso Ciclo-pedonal") %>% group_by(AnoT) %>% summarise(comprimento=sum(lenght))
CicloviasKMredux$Kms <- paste(round(CicloviasKMredux$comprimento,digits = 0),"km", sep=" ")
# Defenir estilo de mapa
mapTheme <- function(base_size = 12) {
theme(
text = element_text( color = "black"),
plot.title = element_text(size = 18,colour = "black"),
plot.subtitle=element_text(face="italic"),
plot.caption=element_text(hjust=0),
axis.ticks = element_blank(),
# panel.background = element_blank(), #transparente
panel.background = element_rect(fill = "white"),
#panel.grid.major = element_line("grey80", size = 0.1),
panel.grid.major = element_line(color = "transparent"),
strip.text = element_text(size=14,face = "bold"),
axis.title = element_blank(),
axis.text = element_blank(),
axis.title.x = element_blank(),
axis.title.y = element_blank(),
panel.grid.minor = element_blank(),
strip.background = element_rect(fill = "grey80", color = "white"),
plot.background = element_blank(),
legend.background = element_blank(),
legend.title = element_text(colour = "black", face = "italic"),
legend.text = element_text(colour = "black", face = "italic"))
}
#preparar a função
listaAnos = seq(1:23)+2000
RedeCiclavelLxkm <- function(Year){
slideano = ggplot()+
mapTheme()+
#mapa base
geom_sf(LisboaLimite, mapping = aes(), color = NA) +
#rede existente no ano anterior
geom_sf(data=subset(CICLOVIASredux,TIPOLOGIA=="Nao dedicada" & AnoT==Year),
aes(fill =AnoT),color="grey80",size=1, show.legend=F) +
geom_sf(data=subset(CICLOVIASredux,TIPOLOGIA=="Ciclovia dedicada" & AnoT==Year),
aes(fill =AnoT),color="grey65",size=0.9, show.legend=F) +
#novas ciclovias naquele ano
geom_sf(data=subset(CICLOVIASgif,TIPOLOGIA=="Nao dedicada" & ANO==Year),aes(),
color="#AFD4A0",size=1.1,show.legend=F) + #lty=88 ou 11 para tracejado
geom_sf(data=subset(CICLOVIASgif,TIPOLOGIA=="Ciclovia dedicada" & ANO==Year),aes(),
color="#1A7832",size=1.1,show.legend=F) +
#aplicar o estilo com o ano em cima
facet_wrap(~AnoT, nrow=1)+
#adicionar o contador de km
geom_text(data=subset(CicloviasKMredux,AnoT==Year),
aes(x=-9.1,y=38.692,label=Kms), size=6,inherit.aes=FALSE)
#gravar cada imagem
ggsave(slideano, filename=paste0("GIF/2023/",Year,"km.png"),
units="cm", width=18, height=18, dpi=300)
}
Para guardar cada imagem em separado
listaAnos %>% map_df(RedeCiclavelLxkm)
Duplicar o último frame para ficar parado mais tempo no final.
E depois usar um gifmaker.me com 0.6 seg de intervalo, por exemplo.
library(magick)
imgs <- list.files("GIF/2023/", full.names = TRUE)
img_list <- lapply(imgs, image_read)
## join the images together
img_joined <- image_join(img_list)
img_joined = image_scale(img_joined, "700x700")
## animate at 2 frames per second
img_animated <- image_animate(img_joined, fps = 2)
## view animated image
img_animated
## save to disk
image_write(image = img_animated,
path = "GIF/RedeCiclavelLisboa2023.gif")
#theme para facets, com Ano mais pequeno
mapThemeFacets <- function(base_size = 12) {
theme(
text = element_text( color = "black"),
plot.title = element_text(size = 18,colour = "black"),
plot.subtitle=element_text(face="italic"),
plot.caption=element_text(hjust=0),
axis.ticks = element_blank(),
panel.background = element_blank(),
#panel.grid.major = element_line("grey80", size = 0.1),
panel.grid.major = element_line(color = "transparent"),
strip.text = element_text(size=10,face = "bold"),
axis.title = element_blank(),
axis.text = element_blank(),
axis.title.x = element_blank(),
axis.title.y = element_blank(),
panel.grid.minor = element_blank(),
strip.background = element_rect(fill = "grey80", color = "white"),
plot.background = element_blank(),
legend.background = element_blank(),
legend.title = element_text(colour = "black", face = "italic"),
legend.text = element_text(colour = "black", face = "italic"))
}
#imagens em facet, em tons de cinza
ggplot()+
geom_sf(data=LisboaLimite, aes(),color = NA)+
# geom_sf(data=CICLOVIASredux,aes(fill =AnoT),color="grey70",size=1,alpha=0.2,show.legend=F) +
geom_sf(data=filter(CICLOVIASgif,ANO==2001),aes(),color="black",size=1.1,show.legend=F) +
geom_sf(data=filter(CICLOVIASgif,ANO==2003),aes(),color="black",size=1.1,show.legend=F) +
geom_sf(data=filter(CICLOVIASgif,ANO==2005),aes(),color="black",size=1.1,show.legend=F) +
geom_sf(data=filter(CICLOVIASgif,ANO==2008),aes(),color="black",size=1.1,show.legend=F) +
geom_sf(data=filter(CICLOVIASgif,ANO==2009),aes(),color="black",size=1.1,show.legend=F) +
geom_sf(data=filter(CICLOVIASgif,ANO==2010),aes(),color="black",size=1.1,show.legend=F) +
geom_sf(data=filter(CICLOVIASgif,ANO==2011),aes(),color="black",size=1.1,show.legend=F) +
geom_sf(data=filter(CICLOVIASgif,ANO==2012),aes(),color="black",size=1.1,show.legend=F) +
geom_sf(data=filter(CICLOVIASgif,ANO==2013),aes(),color="black",size=1.1,show.legend=F) +
geom_sf(data=filter(CICLOVIASgif,ANO==2014),aes(),color="black",size=1.1,show.legend=F) +
geom_sf(data=filter(CICLOVIASgif,ANO==2016),aes(),color="black",size=1.1,show.legend=F) +
geom_sf(data=filter(CICLOVIASgif,ANO==2017),aes(),color="black",size=1.1,show.legend=F) +
geom_sf(data=filter(CICLOVIASgif,ANO==2018),aes(),color="black",size=1.1,show.legend=F) +
geom_sf(data=filter(CICLOVIASgif,ANO==2019),aes(),color="black",size=1.1,show.legend=F) +
geom_sf(data=filter(CICLOVIASgif,ANO==2020),aes(),color="black",size=1.1,show.legend=F) +
facet_wrap(~AnoT, nrow=4)+ geom_text(data=CicloviasKMredux,aes(x=-9.1,y=38.692,label=Kms), inherit.aes=FALSE) + mapThemeFacets()
ggplot()+
geom_sf(data=LisboaLimite, aes(),color = NA)+
geom_sf(data=filter(CICLOVIASgif),aes(),color="black",size=1.1,show.legend=F) +
facet_wrap(~ANO, nrow=4)+
geom_text(data=CicloviasKMredux,aes(x=-9.1,y=38.692,label=Kms), inherit.aes=FALSE)+
mapThemeFacets()