I've done some maps in GNU R.
Here's a (cropped) choropleth map I did for a discussion thread about legislative representation in Europe:
https://lemmy.today/pictrs/image/b6f28602-ab94-4901-b5e1-158061624c75.png

source
if (!require("pacman")) install.packages("pacman")
pacman::p_load_gh(c("ropenscilabs/rnaturalearth",
"ropenscilabs/rnaturalearthdata",
"ropenscilabs/rnaturalearthhires"))
pacman::p_load(
countrycode,
dplyr,
ggplot2,
readr,
rvest,
tmap,
tmaptools,
viridis
)
page <- read_html("https://en.wikipedia.org/w/index.php?title=List_of_legislatures_by_number_of_members&oldid=1010580360")
df <- html_table(html_node(page, xpath = "/html/body/div[3]/div[3]/div[5]/div[1]/table"))
df$per_capita <- df$"Population/\nLower house seats" %>% parse_number()
df$name <- df$Country
europe <- df %>% mutate(continent = countrycode(Country, origin = "country.name", destination = "continent")) %>% filter(continent == "Europe")
shapes <- ne_countries(scale = "medium")
shapes_merged <- sp::merge(shapes, europe, by.x = "name", all.x = TRUE, by.y = "name")
map <- tm_shape(shapes_merged, projection = "epsg:3035", bbox = bb(c(-8, 34.5000, 43, 72))) +
tm_fill(col = "per_capita", palette = plasma(256), title = "persons", legend.reverse = TRUE) +
tm_borders(col = "black") +
tm_scale_bar() +
tm_layout(bg.color = "#e6f7fe", outer.margins = 0, legend.outside = TRUE,
legend.outside.position = "bottom",
legend.position = c(0,.9),
main.title = "Persons per Lower House Legislative Seat",
attr.outside = TRUE)
tmap_save(map, width = 1920, height = 1080, dpi = 96, "map.png")
And if so, what would you tell someone who is contemplating such a thing with no prior practical experience of such systems?
Depends pretty much entirely on what it is that you want to do and what software you're using.