Introduction

Using data from http://download.geofabrik.de/europe/italy.html Cookbooks that aided the process of building the maps include:

https://r-spatial.org/r/2018/10/25/ggplot2-sf.html https://r-graphics.org/recipe-miscgraph-map-shapefile https://bookdown.org/robinlovelace/geocompr/adv-map.html

Libraries

library("ggplot2")
theme_set(theme_bw())
library("sf")
library("rnaturalearth")
library("rnaturalearthdata")
library(tmap)
library(maps)
library(mapdata)
library(mapview)
library(dplyr)

this .shp file was downloaded from http://download.geofabrik.de/europe/italy.html

italy_shp <- st_read("C:\\Users\\Public\\Downloads\\centro-latest-free.shp\\gis_osm_places_free_1.shp")
ggplot(italy_shp)+
geom_sf()
names(italy_shp)
str(italy_shp)
tibble(italy_shp)
mean_population <- mean(italy_shp$population)
median_population <- median(italy_shp$population)
sd_population <- min(italy_shp$population)
min_population <- max(italy_shp$population)




mean_population
median_population
sd_population
min_population
summary(italy_shp$population)
# Create bins for population
italy_shp <- italy_shp %>%
  mutate(population_bin = cut(population, breaks = c(0, 1, 500, 1000, 2000, 4000, 8000, 10000, 12000, 15000, 18000, 20000, 22000, 30000, 60000, Inf), 
                               labels = c("0", "1-500", "500-1000", "1000-2000", "2000-4000", "4000-8000", "8000-10000","10000-12000", "12000-15000","15000-18000", "18000-20000", "20000-22000", "22000-30000", "30000-60000", "60000 +")))

# Count the number of towns in each population bin
population_bins <- italy_shp %>%
  count(population_bin)

# Print distribution
print(population_bins)
library(ggplot2)

# Plot histogram of population
ggplot(italy_shp, aes(x = population)) +
  geom_histogram(bins = 30, fill = "lightblue", color = "black") +
  labs(title = "Histogram of Population",
       x = "Population",
       y = "Count") +
  theme_minimal()

# Plot bar chart of population bins
ggplot(population_bins, aes(x = population_bin, y = n, fill = population_bin)) +
  geom_bar(stat = "identity") +
  coord_flip() +
  labs(title = "Count of Towns by Population Range",
       x = "Population Range",
       y = "Count") +
  theme_light()
    axis.title.y = element_text(size = 2, face = "bold")  # Y-axis title size and style
    axis.text.y = element_text(size = 2)                # Y-axis text size
    axis.ticks.y = element_line(size = 0.2)  
ggplot(italy_shp, aes(x = population)) +
  geom_bar(fill = "lightblue", color = "black") +
  coord_flip() +
  labs(
    x = "Type of Entity",
    y = "Count",
    title = "Count of Entities with Zero Population by Type"
  ) +
  theme_minimal() +
  theme(
    axis.title.x = element_text(size = 14, face = "bold"),
    axis.title.y = element_text(size = 14, face = "bold"),
    axis.text = element_text(size = 12),
    plot.title = element_text(size = 16, face = "bold")
  ) +
  geom_text(stat = "count", aes(label = ..count..), hjust = -0.2, color = "black")

italy_shp$fclass <- as.character(italy_shp$fclass)
# Sample data with updated names
lng <- c(12.242, 11.715, 11.346, 12.050)
lat <- c(44.139, 44.340, 44.494, 44.223)
names <- c("Cesena", "Forli", "Bologna", "Imola")

# Create a data frame with the point data
points_df <- data.frame(lng, lat, names)

# Convert the data frame to an sf object
points_sdf <- st_as_sf(points_df, coords = c("lng", "lat"), crs = 4326)

# Plot the points on a map with labels
mapview(points_sdf, 
        label = points_sdf$names,  # Use updated names as labels
        legend = FALSE,            # Hide legend as it's not necessary here
        map.types = "OpenStreetMap" # Choose base map type
)

selected_fclass <- "town"

# Filter the data to include only the selected fclass values
italy_shp_mod <- italy_shp %>%
  filter(fclass == selected_fclass)

# Create a ggplot
ggplot(data = italy_shp_mod) +
  geom_sf(aes(fill = fclass), color = "black") +  # Add border color for clarity
  scale_fill_brewer(palette = "Set3", name = "Type of Entity") +  # Use a color palette
  theme_minimal() +  # Use a minimal theme for clarity
  labs(title = "Map of Italy by Type of Entity",
       subtitle = "Displaying different types of entities in Italy",
       fill = "Type of Entity") +  # Add labels and title
  theme(axis.title = element_blank(),  # Remove axis titles
        axis.text = element_blank(),   # Remove axis text
        panel.grid = element_blank(),  # Remove grid lines
        legend.position = "right")    # Position the legend
library(ggplot2)
library(viridis)
ggplot(italy_shp) + geom_sf(aes(fill = population)) +
  scale_fill_viridis() + theme()
library(leaflet)
leaflet() %>%  
 addTiles() %>%  
 addMarkers(lng = 11.715, lat = 44.340,  
            popup = "Imola")
# Create the leaflet map
leaflet() %>%  
  addTiles() %>%  # Add default OpenStreetMap tiles
  
  # Add marker for Cesena
  addMarkers(lng = 12.242, lat = 44.139, popup = "Cesena") %>%
  
  # Add marker for Forli
  addMarkers(lng = 12.050, lat = 44.223, popup = "Forli") %>%
  
  # Add marker for Bologna
  addMarkers(lng = 11.346, lat = 44.494, popup = "Bologna") %>%
  
  # Add marker for Imola
  addMarkers(lng = 11.715, lat = 44.340, popup = "Imola")

Towns displaying as points using open street map as the base map type.

LS0tDQp0aXRsZTogIk1ha2luZyBtYXBzIG9mIEl0YWx5IHdpdGggUiINCmF1dGhvcjogIkN5bnRoaWEgQW5zdGV5Ig0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOg0KLS0tDQogIDxoMT5JbnRyb2R1Y3Rpb248L2gxPg0KICBVc2luZyBkYXRhIGZyb20gaHR0cDovL2Rvd25sb2FkLmdlb2ZhYnJpay5kZS9ldXJvcGUvaXRhbHkuaHRtbA0KICBDb29rYm9va3MgdGhhdCBhaWRlZCB0aGUgcHJvY2VzcyBvZiBidWlsZGluZyB0aGUgbWFwcyBpbmNsdWRlOg0KDQpodHRwczovL3Itc3BhdGlhbC5vcmcvci8yMDE4LzEwLzI1L2dncGxvdDItc2YuaHRtbA0KaHR0cHM6Ly9yLWdyYXBoaWNzLm9yZy9yZWNpcGUtbWlzY2dyYXBoLW1hcC1zaGFwZWZpbGUNCmh0dHBzOi8vYm9va2Rvd24ub3JnL3JvYmlubG92ZWxhY2UvZ2VvY29tcHIvYWR2LW1hcC5odG1sDQoNCg0KPGgyPkxpYnJhcmllczwvaDI+DQoNCmBgYHtyfQ0KbGlicmFyeSgiZ2dwbG90MiIpDQp0aGVtZV9zZXQodGhlbWVfYncoKSkNCmxpYnJhcnkoInNmIikNCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkoInJuYXR1cmFsZWFydGgiKQ0KbGlicmFyeSgicm5hdHVyYWxlYXJ0aGRhdGEiKQ0KYGBgDQoNCg0KYGBge3J9DQpsaWJyYXJ5KHRtYXApDQpgYGANCg0KDQpgYGB7cn0NCmxpYnJhcnkobWFwcykNCmxpYnJhcnkobWFwZGF0YSkNCmxpYnJhcnkobWFwdmlldykNCmxpYnJhcnkoZHBseXIpDQpgYGANCg0KDQoNCnRoaXMgLnNocCBmaWxlIHdhcyBkb3dubG9hZGVkIGZyb20gaHR0cDovL2Rvd25sb2FkLmdlb2ZhYnJpay5kZS9ldXJvcGUvaXRhbHkuaHRtbA0KDQpgYGB7cn0NCml0YWx5X3NocCA8LSBzdF9yZWFkKCJDOlxcVXNlcnNcXFB1YmxpY1xcRG93bmxvYWRzXFxjZW50cm8tbGF0ZXN0LWZyZWUuc2hwXFxnaXNfb3NtX3BsYWNlc19mcmVlXzEuc2hwIikNCmBgYA0KDQpgYGB7cn0NCmdncGxvdChpdGFseV9zaHApKw0KZ2VvbV9zZigpDQpgYGANCmBgYHtyfQ0KbmFtZXMoaXRhbHlfc2hwKQ0Kc3RyKGl0YWx5X3NocCkNCnRpYmJsZShpdGFseV9zaHApDQpgYGANCg0KDQpgYGB7cn0NCm1lYW5fcG9wdWxhdGlvbiA8LSBtZWFuKGl0YWx5X3NocCRwb3B1bGF0aW9uKQ0KbWVkaWFuX3BvcHVsYXRpb24gPC0gbWVkaWFuKGl0YWx5X3NocCRwb3B1bGF0aW9uKQ0Kc2RfcG9wdWxhdGlvbiA8LSBtaW4oaXRhbHlfc2hwJHBvcHVsYXRpb24pDQptaW5fcG9wdWxhdGlvbiA8LSBtYXgoaXRhbHlfc2hwJHBvcHVsYXRpb24pDQoNCg0KDQoNCm1lYW5fcG9wdWxhdGlvbg0KbWVkaWFuX3BvcHVsYXRpb24NCnNkX3BvcHVsYXRpb24NCm1pbl9wb3B1bGF0aW9uDQoNCmBgYA0KDQpgYGB7cn0NCnN1bW1hcnkoaXRhbHlfc2hwJHBvcHVsYXRpb24pDQpgYGANCmBgYHtyfQ0KIyBDcmVhdGUgYmlucyBmb3IgcG9wdWxhdGlvbg0KaXRhbHlfc2hwIDwtIGl0YWx5X3NocCAlPiUNCiAgbXV0YXRlKHBvcHVsYXRpb25fYmluID0gY3V0KHBvcHVsYXRpb24sIGJyZWFrcyA9IGMoMCwgMSwgNTAwLCAxMDAwLCAyMDAwLCA0MDAwLCA4MDAwLCAxMDAwMCwgMTIwMDAsIDE1MDAwLCAxODAwMCwgMjAwMDAsIDIyMDAwLCAzMDAwMCwgNjAwMDAsIEluZiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIjAiLCAiMS01MDAiLCAiNTAwLTEwMDAiLCAiMTAwMC0yMDAwIiwgIjIwMDAtNDAwMCIsICI0MDAwLTgwMDAiLCAiODAwMC0xMDAwMCIsIjEwMDAwLTEyMDAwIiwgIjEyMDAwLTE1MDAwIiwiMTUwMDAtMTgwMDAiLCAiMTgwMDAtMjAwMDAiLCAiMjAwMDAtMjIwMDAiLCAiMjIwMDAtMzAwMDAiLCAiMzAwMDAtNjAwMDAiLCAiNjAwMDAgKyIpKSkNCg0KIyBDb3VudCB0aGUgbnVtYmVyIG9mIHRvd25zIGluIGVhY2ggcG9wdWxhdGlvbiBiaW4NCnBvcHVsYXRpb25fYmlucyA8LSBpdGFseV9zaHAgJT4lDQogIGNvdW50KHBvcHVsYXRpb25fYmluKQ0KDQojIFByaW50IGRpc3RyaWJ1dGlvbg0KcHJpbnQocG9wdWxhdGlvbl9iaW5zKQ0KYGBgDQoNCg0KDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQojIFBsb3QgaGlzdG9ncmFtIG9mIHBvcHVsYXRpb24NCmdncGxvdChpdGFseV9zaHAsIGFlcyh4ID0gcG9wdWxhdGlvbikpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDMwLCBmaWxsID0gImxpZ2h0Ymx1ZSIsIGNvbG9yID0gImJsYWNrIikgKw0KICBsYWJzKHRpdGxlID0gIkhpc3RvZ3JhbSBvZiBQb3B1bGF0aW9uIiwNCiAgICAgICB4ID0gIlBvcHVsYXRpb24iLA0KICAgICAgIHkgPSAiQ291bnQiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQojIFBsb3QgYmFyIGNoYXJ0IG9mIHBvcHVsYXRpb24gYmlucw0KZ2dwbG90KHBvcHVsYXRpb25fYmlucywgYWVzKHggPSBwb3B1bGF0aW9uX2JpbiwgeSA9IG4sIGZpbGwgPSBwb3B1bGF0aW9uX2JpbikpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsNCiAgY29vcmRfZmxpcCgpICsNCiAgbGFicyh0aXRsZSA9ICJDb3VudCBvZiBUb3ducyBieSBQb3B1bGF0aW9uIFJhbmdlIiwNCiAgICAgICB4ID0gIlBvcHVsYXRpb24gUmFuZ2UiLA0KICAgICAgIHkgPSAiQ291bnQiKSArDQogIHRoZW1lX2xpZ2h0KCkNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIsIGZhY2UgPSAiYm9sZCIpICAjIFktYXhpcyB0aXRsZSBzaXplIGFuZCBzdHlsZQ0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyKSAgICAgICAgICAgICAgICAjIFktYXhpcyB0ZXh0IHNpemUNCiAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2xpbmUoc2l6ZSA9IDAuMikgIA0KYGBgDQpgYGB7cn0NCmdncGxvdChpdGFseV9zaHAsIGFlcyh4ID0gcG9wdWxhdGlvbikpICsNCiAgZ2VvbV9iYXIoZmlsbCA9ICJsaWdodGJsdWUiLCBjb2xvciA9ICJibGFjayIpICsNCiAgY29vcmRfZmxpcCgpICsNCiAgbGFicygNCiAgICB4ID0gIlR5cGUgb2YgRW50aXR5IiwNCiAgICB5ID0gIkNvdW50IiwNCiAgICB0aXRsZSA9ICJDb3VudCBvZiBFbnRpdGllcyB3aXRoIFplcm8gUG9wdWxhdGlvbiBieSBUeXBlIg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCwgZmFjZSA9ICJib2xkIiksDQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCwgZmFjZSA9ICJib2xkIiksDQogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYsIGZhY2UgPSAiYm9sZCIpDQogICkgKw0KICBnZW9tX3RleHQoc3RhdCA9ICJjb3VudCIsIGFlcyhsYWJlbCA9IC4uY291bnQuLiksIGhqdXN0ID0gLTAuMiwgY29sb3IgPSAiYmxhY2siKQ0KYGBgDQpgYGB7cn0NCg0KaXRhbHlfc2hwJGZjbGFzcyA8LSBhcy5jaGFyYWN0ZXIoaXRhbHlfc2hwJGZjbGFzcykNCg0KYGBgDQpgYGB7cn0NCiMgU2FtcGxlIGRhdGEgd2l0aCB1cGRhdGVkIG5hbWVzDQpsbmcgPC0gYygxMi4yNDIsIDExLjcxNSwgMTEuMzQ2LCAxMi4wNTApDQpsYXQgPC0gYyg0NC4xMzksIDQ0LjM0MCwgNDQuNDk0LCA0NC4yMjMpDQpuYW1lcyA8LSBjKCJDZXNlbmEiLCAiRm9ybGkiLCAiQm9sb2duYSIsICJJbW9sYSIpDQoNCiMgQ3JlYXRlIGEgZGF0YSBmcmFtZSB3aXRoIHRoZSBwb2ludCBkYXRhDQpwb2ludHNfZGYgPC0gZGF0YS5mcmFtZShsbmcsIGxhdCwgbmFtZXMpDQoNCiMgQ29udmVydCB0aGUgZGF0YSBmcmFtZSB0byBhbiBzZiBvYmplY3QNCnBvaW50c19zZGYgPC0gc3RfYXNfc2YocG9pbnRzX2RmLCBjb29yZHMgPSBjKCJsbmciLCAibGF0IiksIGNycyA9IDQzMjYpDQoNCiMgUGxvdCB0aGUgcG9pbnRzIG9uIGEgbWFwIHdpdGggbGFiZWxzDQptYXB2aWV3KHBvaW50c19zZGYsIA0KICAgICAgICBsYWJlbCA9IHBvaW50c19zZGYkbmFtZXMsICAjIFVzZSB1cGRhdGVkIG5hbWVzIGFzIGxhYmVscw0KICAgICAgICBsZWdlbmQgPSBGQUxTRSwgICAgICAgICAgICAjIEhpZGUgbGVnZW5kIGFzIGl0J3Mgbm90IG5lY2Vzc2FyeSBoZXJlDQogICAgICAgIG1hcC50eXBlcyA9ICJPcGVuU3RyZWV0TWFwIiAjIENob29zZSBiYXNlIG1hcCB0eXBlDQopDQpgYGANCg0KYGBge3J9DQoNCnNlbGVjdGVkX2ZjbGFzcyA8LSAidG93biINCg0KIyBGaWx0ZXIgdGhlIGRhdGEgdG8gaW5jbHVkZSBvbmx5IHRoZSBzZWxlY3RlZCBmY2xhc3MgdmFsdWVzDQppdGFseV9zaHBfbW9kIDwtIGl0YWx5X3NocCAlPiUNCiAgZmlsdGVyKGZjbGFzcyA9PSBzZWxlY3RlZF9mY2xhc3MpDQoNCiMgQ3JlYXRlIGEgZ2dwbG90DQpnZ3Bsb3QoZGF0YSA9IGl0YWx5X3NocF9tb2QpICsNCiAgZ2VvbV9zZihhZXMoZmlsbCA9IGZjbGFzcyksIGNvbG9yID0gImJsYWNrIikgKyAgIyBBZGQgYm9yZGVyIGNvbG9yIGZvciBjbGFyaXR5DQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MyIsIG5hbWUgPSAiVHlwZSBvZiBFbnRpdHkiKSArICAjIFVzZSBhIGNvbG9yIHBhbGV0dGUNCiAgdGhlbWVfbWluaW1hbCgpICsgICMgVXNlIGEgbWluaW1hbCB0aGVtZSBmb3IgY2xhcml0eQ0KICBsYWJzKHRpdGxlID0gIk1hcCBvZiBJdGFseSBieSBUeXBlIG9mIEVudGl0eSIsDQogICAgICAgc3VidGl0bGUgPSAiRGlzcGxheWluZyBkaWZmZXJlbnQgdHlwZXMgb2YgZW50aXRpZXMgaW4gSXRhbHkiLA0KICAgICAgIGZpbGwgPSAiVHlwZSBvZiBFbnRpdHkiKSArICAjIEFkZCBsYWJlbHMgYW5kIHRpdGxlDQogIHRoZW1lKGF4aXMudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksICAjIFJlbW92ZSBheGlzIHRpdGxlcw0KICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X2JsYW5rKCksICAgIyBSZW1vdmUgYXhpcyB0ZXh0DQogICAgICAgIHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksICAjIFJlbW92ZSBncmlkIGxpbmVzDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpICAgICMgUG9zaXRpb24gdGhlIGxlZ2VuZA0KYGBgDQoNCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHZpcmlkaXMpDQpnZ3Bsb3QoaXRhbHlfc2hwKSArIGdlb21fc2YoYWVzKGZpbGwgPSBwb3B1bGF0aW9uKSkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArIHRoZW1lKCkNCmBgYA0KYGBge3J9DQpsaWJyYXJ5KGxlYWZsZXQpDQpsZWFmbGV0KCkgJT4lICANCiBhZGRUaWxlcygpICU+JSAgDQogYWRkTWFya2VycyhsbmcgPSAxMS43MTUsIGxhdCA9IDQ0LjM0MCwgIA0KICAgICAgICAgICAgcG9wdXAgPSAiSW1vbGEiKQ0KYGBgDQpgYGB7cn0NCiMgQ3JlYXRlIHRoZSBsZWFmbGV0IG1hcA0KbGVhZmxldCgpICU+JSAgDQogIGFkZFRpbGVzKCkgJT4lICAjIEFkZCBkZWZhdWx0IE9wZW5TdHJlZXRNYXAgdGlsZXMNCiAgDQogICMgQWRkIG1hcmtlciBmb3IgQ2VzZW5hDQogIGFkZE1hcmtlcnMobG5nID0gMTIuMjQyLCBsYXQgPSA0NC4xMzksIHBvcHVwID0gIkNlc2VuYSIpICU+JQ0KICANCiAgIyBBZGQgbWFya2VyIGZvciBGb3JsaQ0KICBhZGRNYXJrZXJzKGxuZyA9IDEyLjA1MCwgbGF0ID0gNDQuMjIzLCBwb3B1cCA9ICJGb3JsaSIpICU+JQ0KICANCiAgIyBBZGQgbWFya2VyIGZvciBCb2xvZ25hDQogIGFkZE1hcmtlcnMobG5nID0gMTEuMzQ2LCBsYXQgPSA0NC40OTQsIHBvcHVwID0gIkJvbG9nbmEiKSAlPiUNCiAgDQogICMgQWRkIG1hcmtlciBmb3IgSW1vbGENCiAgYWRkTWFya2VycyhsbmcgPSAxMS43MTUsIGxhdCA9IDQ0LjM0MCwgcG9wdXAgPSAiSW1vbGEiKQ0KYGBgDQpUb3ducyBkaXNwbGF5aW5nIGFzIHBvaW50cyB1c2luZyBvcGVuIHN0cmVldCBtYXAgYXMgdGhlIGJhc2UgbWFwIHR5cGUuDQo=