
Petición de un lector: un código de ejemplo para hacer mapas de Perú con R y con Python. Estos ejemplos quedan resumidos en un solo sitio y se va a emplear un notebook desde RStudio donde tendremos bloques de R y Python en función de lo que necesitemos.
Mapa de Perú con R y ggplot2
library(tidyverse)
library(reticulate)
library(raster)
library(maptools)
# Obtenemos datos de GADM
peru_shp <- getData('GADM', country = 'Peru', level = 2)
# Convertimos a data frame para ggplot2
peru_df <- fortify(peru_shp, region = "NAME_2")
# Generamos datos aleatorios para ilustrar
distritos <- data.frame(id = unique(peru_df$id))
distritos$aleatorio <- runif(nrow(distritos), 10, 30)
# Unimos datos con el mapa
peru_plot <- left_join(peru_df, distritos, by = "id")
# Pintamos el mapa
ggplot(data = peru_plot, aes(x = long, y = lat, group = group)) +
geom_polygon(aes(fill = aleatorio)) +
scale_fill_continuous(low = "white", high = "red") +
theme_minimal()
Código conocido: obtenemos el mapa de GADM con nivel 2 (distritos). Mediante fortify (o map_data) creamos el data frame que necesita ggplot2. En este caso genero unos datos aleatorios; en vuestro caso tendríais que cruzar vuestros datos (siempre es mejor emplear una codificación INE o similar en vez del nombre). El resultado:

Mapa de Perú con Python desde notebook RStudio
Para este bloque suponemos que habéis instalado reticulate y que os funciona Python a la perfección desde RStudio.
Primero, preparamos el shapefile desde R:
# raster::shapefile(peru_shp, "C:/temp/mapas/Peru/Peru.shp", overwrite = TRUE)
Ahora, el código en Python:
import pandas as pd
import numpy as np
import geopandas as gpd
import matplotlib.pyplot as plt
# Ubicación del shapefile generado anteriormente
ub_shp = 'C:/temp/mapas/Peru/Peru.shp'
# Creación del GeoDataFrame
peru = gpd.read_file(ub_shp, encoding='utf-8')
# Generamos datos aleatorios por departamento (NAME_1)
estados = pd.DataFrame(peru.NAME_1.unique(), columns=['NAME_1'])
estados['aleatorio'] = np.random.randint(1, 20, size=len(estados))
# Cruzamos datos
peru_final = peru.merge(estados, on='NAME_1', how='left')
# Pintamos el mapa
mapa = peru_final.plot(column="aleatorio", linewidth=0.3, cmap="Reds", scheme="quantiles", k=8, alpha=0.7)
plt.title("Mapa de Perú por Departamentos")
plt.show()
Una vez tenemos el shapefile, creamos el data frame mediante geopandas y la función read_file. El proceso es análogo: se emplean datos aleatorios que posteriormente se cruzan y son los que se representan en el mapa estático de Departamentos de Perú con el que comienza esta entrada.
Comentario: los mapas son básicos estéticamente; yo os digo cómo hacer la estructura, vosotros dadle el formato final. Saludos.