Extensão da rede

Evolução da rede ciclável em Lisboa


Extensão das ciclovias por ano


A informação disponibilizada neste site não deve ser encarada como fonte de informação oficial

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.

Dados

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:

  • Campo Grande - Telheiras, anterior à construção do Estádio de Alvalade
  • Bici+BUS na Avenida da Liberdade, antes de passarem paras as laterais
  • Braço de Prata - Matinha, reformulação do traçado
  • Avenida Almirante Reis, reformulação do traçado
  • Avenida de Berna, reformulação do traçado

Créditos

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.

Algo está errado?

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)

Importação dos dados

Importar packages R

library(tidyverse)
library(sf)
library(mapview)
library(units)
library(cartography)

Importar rede ciclável

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.

Corrigir dados

Adicionar as novas que não estavam na shp anterior de Dez 2022.

Remover os que estão a mais

#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)

Verificar as que não têm ano

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)

Importar novamente o shp atualizado

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)

Incluir as anteriores que não tinham data ou não estavam no da CML

  1. Doca Pesca (desde 2019)
  2. Estrada do Barcal (desde 2021)
  3. Fim da Rua Pinheiro Chagas (desde 2017)
  4. Convesão de troço nas Docas de Alcântara (desde 2009)
  5. Conversão de troço na Estrada da Circunvalação, Parque Campismo (desde 2022)
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)

Reclassificar ciclovias

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)

Juntar novamente com as anteriores

#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

Ver num mapa

Todas as ciclovias que existem ou existiram no server da CML

mapview::mapview(Ciclovias, zcol="TIPOLOGIA", lwd=1.5, hide=F, legend=T)

Remover ciclovias que desapareceram entretanto

# 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

Confirmar mapa actual

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 contador de km

#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=" ")

Agrupar features

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

Guardar ficheiros

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)

Importar os dados

Importar shapefile de Lisboa

#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)

Importar dados das ciclovias já processados

CICLOVIAS = readRDS("CicloviasAnos/CicloviasAnos.Rds")

Processar os dados

criar elementos vazios nos anos em que nao aconteceu nada

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)

Tornar os dados mais leves

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=" ")

Criar as imagens

Definir o estilo dos mapas

# 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"))
}

Função para gravar uma imagem para cada ano

#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)
}
    

Correr a função

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.

Ou gravar logo como gif

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")
  

Em teste…

#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() 

Repositório de código aberto



Contribui para melhorar este site.
Se detectares erros indica aqui :)