Datos

Ubicación de las estaciones meteorológicas del Servicio Meteorológico Nacional disponibles en: www.smn.gob.ar/descarga-de-datos. Pero parsear ese archivo para usarlo en R es una cosa que se hace solo una vez en la vida por lo que vamos a usar los datos guardados en un repo, limpios y listos para usar. Porque la realidad es que no se han agregado estaciones nuevas.

estaciones <- fread("https://raw.githubusercontent.com/eliocamp/r-clima/fffb3fa596bc73afeeaa2a6296804da436e82fd3/datos/estaciones_smn.csv") %>% 
  .[provincia != "ANTARTIDA"] # Para hacer un mapa mas chiquito sin la Antartida

estaciones %>% 
  head(10) %>% 
  knitr::kable()
nombre provincia lon lat altura numero numeroOACI region
AZUL AERO BUENOS AIRES -59.53 -36.50 147 87641 SAZA CENTRO
BAHIA BLANCA AERO BUENOS AIRES -62.10 -38.44 83 87750 SAZB CENTRO
BENITO JUAREZ AERO BUENOS AIRES -59.47 -37.43 207 87649 SAZJ CENTRO
BOLIVAR AERO BUENOS AIRES -61.40 -36.12 94 87640 SAZI CENTRO
CAMPO DE MAYO AERO BUENOS AIRES -58.40 -34.32 26 87570 SADO CENTRO
CORONEL PRINGLES AERO BUENOS AIRES -61.20 -38.10 247 87683 SABP CENTRO
CORONEL SUAREZ AERO BUENOS AIRES -61.53 -37.26 233 87637 SAZC CENTRO
DOLORES AERO BUENOS AIRES -57.44 -36.21 9 87648 SAZD CENTRO
EL PALOMAR AERO BUENOS AIRES -58.36 -34.36 12 87571 SADP CENTRO
EZEIZA AERO BUENOS AIRES -58.32 -34.49 20 87576 SAEZ CENTRO
mapa <- rnaturalearth::ne_states(c("Argentina", "Falkland Islands"), returnclass = "sf")

Primer intento

El mapa que sigue cumple con la consigna de hoy pero no es particularmente interesante graficar solo la ubicación de las estaciones. Seguro nos da una idea de la inhomogeneidad de la ubicación de las estaciones que depende en gran medida de donde vive la gente en Argentina.

ggplot(estaciones, aes(lon, lat)) +
  geom_sf(data = mapa, inherit.aes = FALSE, fill = "grey98") +
  geom_point(size = 1, color = "darkorange", alpha = 0.5) +
  labs(x = NULL, y = NULL,
       title = "Ubicación de las estaciones meteorológicas  \noficiales en Argentina",
       caption = "Fuente: Servicio Meteorológico Nacional") +
  theme_minimal(base_size = 8,
                base_family = "Roboto Condensed Light") +
  theme(plot.title.position = "plot")

Calculemos entonces la distancia de cada estación a su vecina más cercana. Cómo estamos trabajando con latitudes y longitudes en un globo, la distancia euclidia no es suficiente. Es decir, 13º de distancia al norte de Argentina no equivale a la misma distancia en kilómetros en el sur de la Patagonia. Necesitamos tener en cuenta esto y para eso la libreria geodist funciona barbaro.

dist <- geodist(estaciones[, c("lon", "lat")],  measure = "geodesic") 

colnames(dist) <- estaciones$numeroOACI
rownames(dist) <- estaciones$numeroOACI

dist <- reshape2::melt(dist, value.name = "distancia") %>% 
  setDT() %>% 
  setnames(c("Var1", "Var2"), c("numeroOACI", "vecina")) %>% 
  .[numeroOACI != vecina] %>% 
  .[, .SD[distancia == min(distancia)], by = .(numeroOACI)]

estaciones <- estaciones[dist, on = .NATURAL]

Segundo intento

Para sorpresa de nadie, muchas de las estaciones en la Patagonia estan aisladas del resto, particularmente en la zona central donde la densidad de población es bajisima.

estaciones %>% 
  ggplot(aes(lon, lat)) +
  geom_sf(data = mapa, inherit.aes = FALSE, fill = "grey98") +
  geom_point(aes(color = distancia/1000), size = 1, alpha = 1) +
  geom_point(data = estaciones[distancia > 200*1000], shape = 21) +
  scale_color_viridis_c(breaks = seq(0, 300, 25), 
                        guide = guide_colorsteps(barwidth = 0.5,
                                                 barheight = 15),
                        direction = 1) +
  labs(x = NULL, y = NULL, color = "[km]",
       title = "Distancia a la estación meteorológica más cercana",
       subtitle = "8 estaciones están a más de 200 km de la vecina más cercana",
       caption = "Fuente: Servicio Meteorológico Nacional") +
  theme_minimal(base_size = 8,
                base_family = "Roboto Condensed Light") +
  theme(plot.title.position = "plot",
        plot.title = element_text(face = "bold"))

#ggsave("day1.png", device = png, type = "cairo", bg = "white", width = 10, height = 18, units = "cm", dpi = 150)
LS0tCnRpdGxlOiAnRMOtYSAxOiBQdW50b3MnCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpCgpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZGF0YS50YWJsZSkKbGlicmFyeShnZW9kaXN0KQpgYGAKCiMjIERhdG9zCgpVYmljYWNpw7NuIGRlIGxhcyBlc3RhY2lvbmVzIG1ldGVvcm9sw7NnaWNhcyBkZWwgU2VydmljaW8gTWV0ZW9yb2zDs2dpY28gTmFjaW9uYWwgZGlzcG9uaWJsZXMgZW46IFt3d3cuc21uLmdvYi5hci9kZXNjYXJnYS1kZS1kYXRvc10oaHR0cHM6Ly93d3cuc21uLmdvYi5hci9kZXNjYXJnYS1kZS1kYXRvcykuIFBlcm8gcGFyc2VhciBlc2UgYXJjaGl2byBwYXJhIHVzYXJsbyBlbiBSIGVzIHVuYSBjb3NhIHF1ZSBzZSBoYWNlIHNvbG8gdW5hIHZleiBlbiBsYSB2aWRhIHBvciBsbyBxdWUgdmFtb3MgYSB1c2FyIGxvcyBkYXRvcyBndWFyZGFkb3MgZW4gdW4gcmVwbywgbGltcGlvcyB5IGxpc3RvcyBwYXJhIHVzYXIuIFBvcnF1ZSBsYSByZWFsaWRhZCBlcyBxdWUgbm8gc2UgaGFuIGFncmVnYWRvIGVzdGFjaW9uZXMgbnVldmFzLiAKCmBgYHtyfQplc3RhY2lvbmVzIDwtIGZyZWFkKCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZWxpb2NhbXAvci1jbGltYS9mZmZiM2ZhNTk2YmM3M2FmZWVhYTJhNjI5NjgwNGRhNDM2ZTgyZmQzL2RhdG9zL2VzdGFjaW9uZXNfc21uLmNzdiIpICU+JSAKICAuW3Byb3ZpbmNpYSAhPSAiQU5UQVJUSURBIl0gIyBQYXJhIGhhY2VyIHVuIG1hcGEgbWFzIGNoaXF1aXRvIHNpbiBsYSBBbnRhcnRpZGEKCmVzdGFjaW9uZXMgJT4lIAogIGhlYWQoMTApICU+JSAKICBrbml0cjo6a2FibGUoKQoKbWFwYSA8LSBybmF0dXJhbGVhcnRoOjpuZV9zdGF0ZXMoYygiQXJnZW50aW5hIiwgIkZhbGtsYW5kIElzbGFuZHMiKSwgcmV0dXJuY2xhc3MgPSAic2YiKQpgYGAKCiMjIFByaW1lciBpbnRlbnRvCgpFbCBtYXBhIHF1ZSBzaWd1ZSBjdW1wbGUgY29uIGxhIGNvbnNpZ25hIGRlIGhveSBwZXJvIG5vIGVzIHBhcnRpY3VsYXJtZW50ZSBpbnRlcmVzYW50ZSBncmFmaWNhciBzb2xvIGxhIHViaWNhY2nDs24gZGUgbGFzIGVzdGFjaW9uZXMuIFNlZ3VybyBub3MgZGEgdW5hIGlkZWEgZGUgbGEgaW5ob21vZ2VuZWlkYWQgZGUgbGEgdWJpY2FjacOzbiBkZSBsYXMgZXN0YWNpb25lcyBxdWUgZGVwZW5kZSBlbiBncmFuIG1lZGlkYSBkZSAqZG9uZGUgdml2ZSBsYSBnZW50ZSBlbiBBcmdlbnRpbmEqLiAKCmBgYHtyfQpnZ3Bsb3QoZXN0YWNpb25lcywgYWVzKGxvbiwgbGF0KSkgKwogIGdlb21fc2YoZGF0YSA9IG1hcGEsIGluaGVyaXQuYWVzID0gRkFMU0UsIGZpbGwgPSAiZ3JleTk4IikgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDEsIGNvbG9yID0gImRhcmtvcmFuZ2UiLCBhbHBoYSA9IDAuNSkgKwogIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMLAogICAgICAgdGl0bGUgPSAiVWJpY2FjacOzbiBkZSBsYXMgZXN0YWNpb25lcyBtZXRlb3JvbMOzZ2ljYXMgIFxub2ZpY2lhbGVzIGVuIEFyZ2VudGluYSIsCiAgICAgICBjYXB0aW9uID0gIkZ1ZW50ZTogU2VydmljaW8gTWV0ZW9yb2zDs2dpY28gTmFjaW9uYWwiKSArCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSA4LAogICAgICAgICAgICAgICAgYmFzZV9mYW1pbHkgPSAiUm9ib3RvIENvbmRlbnNlZCBMaWdodCIpICsKICB0aGVtZShwbG90LnRpdGxlLnBvc2l0aW9uID0gInBsb3QiKQpgYGAKCkNhbGN1bGVtb3MgZW50b25jZXMgbGEgZGlzdGFuY2lhIGRlIGNhZGEgZXN0YWNpw7NuIGEgc3UgdmVjaW5hIG3DoXMgY2VyY2FuYS4gQ8OzbW8gZXN0YW1vcyB0cmFiYWphbmRvIGNvbiBsYXRpdHVkZXMgeSBsb25naXR1ZGVzIGVuIHVuIGdsb2JvLCBsYSBkaXN0YW5jaWEgZXVjbGlkaWEgbm8gZXMgc3VmaWNpZW50ZS4gRXMgZGVjaXIsIDEzwrogZGUgZGlzdGFuY2lhIGFsIG5vcnRlIGRlIEFyZ2VudGluYSBubyBlcXVpdmFsZSBhIGxhIG1pc21hIGRpc3RhbmNpYSBlbiBraWzDs21ldHJvcyBlbiBlbCBzdXIgZGUgbGEgUGF0YWdvbmlhLiBOZWNlc2l0YW1vcyB0ZW5lciBlbiBjdWVudGEgZXN0byB5IHBhcmEgZXNvIGxhIGxpYnJlcmlhIGBnZW9kaXN0YCBmdW5jaW9uYSBiYXJiYXJvLgoKYGBge3J9CgpkaXN0IDwtIGdlb2Rpc3QoZXN0YWNpb25lc1ssIGMoImxvbiIsICJsYXQiKV0sICBtZWFzdXJlID0gImdlb2Rlc2ljIikgCgpjb2xuYW1lcyhkaXN0KSA8LSBlc3RhY2lvbmVzJG51bWVyb09BQ0kKcm93bmFtZXMoZGlzdCkgPC0gZXN0YWNpb25lcyRudW1lcm9PQUNJCgpkaXN0IDwtIHJlc2hhcGUyOjptZWx0KGRpc3QsIHZhbHVlLm5hbWUgPSAiZGlzdGFuY2lhIikgJT4lIAogIHNldERUKCkgJT4lIAogIHNldG5hbWVzKGMoIlZhcjEiLCAiVmFyMiIpLCBjKCJudW1lcm9PQUNJIiwgInZlY2luYSIpKSAlPiUgCiAgLltudW1lcm9PQUNJICE9IHZlY2luYV0gJT4lIAogIC5bLCAuU0RbZGlzdGFuY2lhID09IG1pbihkaXN0YW5jaWEpXSwgYnkgPSAuKG51bWVyb09BQ0kpXQoKZXN0YWNpb25lcyA8LSBlc3RhY2lvbmVzW2Rpc3QsIG9uID0gLk5BVFVSQUxdCmBgYAoKIyMgU2VndW5kbyBpbnRlbnRvCgpQYXJhIHNvcnByZXNhIGRlIG5hZGllLCBtdWNoYXMgZGUgbGFzIGVzdGFjaW9uZXMgZW4gbGEgUGF0YWdvbmlhIGVzdGFuIGFpc2xhZGFzIGRlbCByZXN0bywgcGFydGljdWxhcm1lbnRlIGVuIGxhIHpvbmEgY2VudHJhbCBkb25kZSBsYSBkZW5zaWRhZCBkZSBwb2JsYWNpw7NuIGVzIGJhamlzaW1hLiAKCmBgYHtyfQplc3RhY2lvbmVzICU+JSAKICBnZ3Bsb3QoYWVzKGxvbiwgbGF0KSkgKwogIGdlb21fc2YoZGF0YSA9IG1hcGEsIGluaGVyaXQuYWVzID0gRkFMU0UsIGZpbGwgPSAiZ3JleTk4IikgKwogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gZGlzdGFuY2lhLzEwMDApLCBzaXplID0gMSwgYWxwaGEgPSAxKSArCiAgZ2VvbV9wb2ludChkYXRhID0gZXN0YWNpb25lc1tkaXN0YW5jaWEgPiAyMDAqMTAwMF0sIHNoYXBlID0gMjEpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzX2MoYnJlYWtzID0gc2VxKDAsIDMwMCwgMjUpLCAKICAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcnN0ZXBzKGJhcndpZHRoID0gMC41LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFyaGVpZ2h0ID0gMTUpLAogICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAxKSArCiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwsIGNvbG9yID0gIltrbV0iLAogICAgICAgdGl0bGUgPSAiRGlzdGFuY2lhIGEgbGEgZXN0YWNpw7NuIG1ldGVvcm9sw7NnaWNhIG3DoXMgY2VyY2FuYSIsCiAgICAgICBzdWJ0aXRsZSA9ICI4IGVzdGFjaW9uZXMgZXN0w6FuIGEgbcOhcyBkZSAyMDAga20gZGUgbGEgdmVjaW5hIG3DoXMgY2VyY2FuYSIsCiAgICAgICBjYXB0aW9uID0gIkZ1ZW50ZTogU2VydmljaW8gTWV0ZW9yb2zDs2dpY28gTmFjaW9uYWwiKSArCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSA4LAogICAgICAgICAgICAgICAgYmFzZV9mYW1pbHkgPSAiUm9ib3RvIENvbmRlbnNlZCBMaWdodCIpICsKICB0aGVtZShwbG90LnRpdGxlLnBvc2l0aW9uID0gInBsb3QiLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIikpCgojZ2dzYXZlKCJkYXkxLnBuZyIsIGRldmljZSA9IHBuZywgdHlwZSA9ICJjYWlybyIsIGJnID0gIndoaXRlIiwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gMTgsIHVuaXRzID0gImNtIiwgZHBpID0gMTUwKQpgYGAKCg==