Phoenician colonization

R-bloggers 2025-09-17

[This article was first published on r.iresmi.net, and kindly contributed to R-bloggers]. (You can report issue about the content on this page here)
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

A photo of a Bronze statuette (725-625 BC) representing the Phoenician goddess Astarte

Figura de Astarté – Museo Arqueológico de Sevilla, Public domain, via Wikimedia Commons

I was reading Phoenician colonization from its origin to the 7th century BC (Manzano-Agugliaro et al. 2025) and thought it was an interesting dataset, but alas: it is split in four tables, behind a javascript redirect (wtf Taylor & Francis?) and with DMS coordinates (including typos and special characters)… So not easily reusable.

Let’s go build an accessible dataset.

Config

library(readr)library(purrr)library(dplyr)library(stringr)library(ggplot2)library(forcats)library(janitor)library(sf)library(rnaturalearth)library(glue)library(parzer)library(leaflet)sf_use_s2(FALSE)knitr::knit_hooks$set(crop = knitr::hook_pdfcrop)

Data

We need to manually download the CSVs (parts 1, 2, 3 and 4) because there is an antiscraping mechanism… Then a little cleaning and coordinates parsing with the very nice {parzer} package let us build a spatial object with {sf}.

sources = list(  c_10_bce = "data_raw/T0001-10.1080_17445647.2025.2528876.csv",  c_09_bce = "data_raw/T0002-10.1080_17445647.2025.2528876.csv",  c_08_bce = "data_raw/T0003-10.1080_17445647.2025.2528876.csv",  c_07_bce = "data_raw/T0004-10.1080_17445647.2025.2528876.csv")phoenician <- sources |>   imap(\(f, c) { read_csv(f) |>         mutate(century_start_bce = parse_number(c))}) |>   list_rbind() |>   clean_names() |>   mutate(lon = parse_lon(str_replace(longitude_e, "−", "-")),         lat = parse_lat(str_replace(latitude_n, ",", "."))) |>   st_as_sf(coords = c("lon", "lat"), crs = "EPSG:4326")

Maps

The resulting layer, mapped on a Natural Earth background, seems good.

world <- ne_countries() |>   st_intersection(phoenician |>                     st_bbox() |>                     st_as_sfc() |>                     st_buffer(4, joinStyle = "MITRE", mitreLimit = 10))phoenician |>   ggplot() +  geom_sf(data = world) +  geom_sf(aes(color = fct_rev(as_factor(century_start_bce)))) +  theme_void() +  labs(title = "Phoenician colonies",       subtitle = "10th c. BCE - 7th c. BCE",       color = "from\n(century BCE)",       caption = glue("data doi:10.1080/17445647.2025.2528876                      https://r.iresmi.net/ {Sys.Date()}")) +  theme_minimal() +  theme(plot.caption = element_text(size = 6),        plot.background = element_rect(fill = "white"))
A map of Phoenician colonies between 10 BCE and 7 BCE from the Levantine area to the Atlantic
Figure 1: Phoenician colonies

You want more interactivity? Using {leaflet}…

phoenician |>   leaflet() |>   addTiles(attribution = r"(           <a href="https://r.iresmi.net/">r.iresmi.net</a>.           data: Manzano-Agugliaro et al. 2025. doi:10.1080/17445647.2025.2528876;           map: <a href="https://www.openstreetmap.org/copyright/">OpenStreetMap</a>)") |>   addCircleMarkers(popup = ~ glue("<b>{settlement}</b><br /><br />                                  from {century_start_bce}th c. BCE \\                                  {if_else(!is.na(centuries_of_subsequent_permanence),                                   paste0('<br />to ', centuries_of_subsequent_permanence), '')}"),                   clusterOptions = markerClusterOptions())
{"x":{"options":{"crs":{"crsClass":"L.CRS.EPSG3857","code":null,"proj4def":null,"projectedBounds":null,"options":{}}},"calls":[{"method":"addTiles","args":["https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",null,null,{"minZoom":0,"maxZoom":18,"tileSize":256,"subdomains":"abc","errorTileUrl":"","tms":false,"noWrap":false,"zoomOffset":0,"zoomReverse":false,"opacity":1,"zIndex":1,"detectRetina":false,"attribution":"\n <a href=https://r.iresmi.net/posts/2025/phoenician/ rel="nofollow" target="_blank">r.iresmi.net<\/a>.\n data: Manzano-Agugliaro et al. 2025. doi:10.1080/17445647.2025.2528876;\n map: <a href=https://r.iresmi.net/posts/2025/phoenician/ rel="nofollow" target="_blank">OpenStreetMap<\/a>"}]},{"method":"addCircleMarkers","args":[[34.85545944444445,34.83000000000001,34.70805555555556,34.53056666666667,34.43333333333333,34.25,34.11918333333333,33.89578222222222,33.56364027777777,33.4622725,33.27156027777778,33.04836805555556,32.9209525,37.39319722222222,37.25775833333334,37.05849722222222,36.66759166666667,40.92361111111111,39.88122222222222,39.87343611111111,39.68722222222222,39.215,39.20462222222223,39.17736388888888,39.13658333333333,39.06898888888889,38.98516388888889,38.70944444444445,38.68581388888889,38.11555555555556,38.1015,38.09241666666667,37.86699166666666,37.21825555555556,37.11666666666667,36.85101111111111,36.75038888888889,36.73575,36.74741666666667,36.74308333333333,36.73236111111111,36.72163888888889,36.67166666666667,36.62725,36.53214166666667,36.29841666666667,36.03674444444444,35.88888888888889,35.86027777777778,35.82444444444445,35.19974999999999,40.17036666666667,39.13385277777778,39.09075,38.90688055555555,38.89530833333333,38.86681388888889,38.42844444444444,38.07578888888889,37.26288888888889,37.24669444444444,37.20883055555556,36.82241388888889,36.61,36.41841666666667,36.19793055555555,36.00333333333333,35.70644722222222,35.64239444444444,35.32395833333334,35.07960000000001,34.00713888888889,32.63888611111111,31.49555555555555],[35.85866666666667,35.9075,35.98611111111111,36.04676388888889,35.83333333333334,35.65,35.64578333333333,35.47674166666667,35.36728611111111,35.29478888888889,35.19382222222222,35.10182222222222,35.06848611111111,-6.037475,-6.952341666666666,10.06166666666667,-4.488333333333333,9.503333333333334,8.605341666666666,8.441016666666666,8.553333333333335,9.114444444444445,8.377611111111111,8.488888888888889,8.310877777777778,8.454388888888888,9.015611111111111,-9.130277777777778,-9.153069444444444,13.36111111111111,-0.6502777777777778,-0.6762222222222222,12.46765833333333,-7.402227777777778,-7.65,10.33099444444444,-3.0075,-4.114194444444444,-4.042833333333333,-4.033,-3.691,-4.418333333333334,-4.464277777777778,-6.159972222222223,-6.297852777777778,-5.287916666666667,14.23573611111111,-5.316527777777778,14.39777777777778,10.63888888888889,-6.110908333333333,-8.722741666666666,9.495555555555555,8.689836111111111,1.436111111111111,8.885233333333332,1.334827777777778,-8.681722222222222,13.54138888888889,-1.786333333333333,-1.772944444444444,-1.830905555555556,11.95123611111111,2.196666666666666,-6.145,-5.421177777777778,-5.609861111111111,-0.8853,-1.058369444444444,-1.479766666666667,11.020575,-6.821277777777778,14.29895277777778,-9.786388888888888],10,null,null,{"interactive":true,"className":"","stroke":true,"color":"#03F","weight":5,"opacity":0.5,"fill":true,"fillColor":"#03F","fillOpacity":0.2},{"showCoverageOnHover":true,"zoomToBoundsOnClick":true,"spiderfyOnMaxZoom":true,"removeOutsideVisibleBounds":true,"spiderLegPolylineOptions":{"weight":1.5,"color":"#222","opacity":0.5},"freezeAtZoom":false},null,["<b>Arwad (Ruad Island)<\/b><br /><br />\nfrom 10th c. BCE ","<b>Amrit<\/b><br /><br />\nfrom 10th c. BCE ","<b>Tell Kazel<\/b><br /><br />\nfrom 10th c. BCE ","<b>Arqa<\/b><br /><br />\nfrom 10th c. BCE ","<b>Tripoli<\/b><br /><br />\nfrom 10th c. BCE ","<b>Batroun<\/b><br /><br />\nfrom 10th c. BCE ","<b>Byblos (Jubail)<\/b><br /><br />\nfrom 10th c. BCE ","<b>Berytus (Beirut)<\/b><br /><br />\nfrom 10th c. BCE ","<b>Sidon (Saida)<\/b><br /><br />\nfrom 10th c. BCE ","<b>Sarepta (Sarafand)<\/b><br /><br />\nfrom 10th c. BCE ","<b>Tyre<\/b><br /><br />\nfrom 10th c. BCE ","<b>Akhziv<\/b><br /><br />\nfrom 10th c. BCE ","<b>Akko<\/b><br /><br />\nfrom 10th c. BCE ","<b>El Carambolo<\/b><br /><br />\nfrom 9th c. BCE <br />to 8th, 7th","<b>Onoba (Huelva)<\/b><br /><br />\nfrom 9th c. BCE <br />to 8th, 7th","<b>Utica<\/b><br /><br />\nfrom 9th c. BCE <br />to 8th, 7th","<b>La Rebanadilla<\/b><br /><br />\nfrom 9th c. BCE ","<b>Olbia<\/b><br /><br />\nfrom 8th c. BCE <br />to 7th","<b>Othoca<\/b><br /><br />\nfrom 8th c. BCE <br />to 7th","<b>Tharros<\/b><br /><br />\nfrom 8th c. BCE <br />to 7th","<b>Neapolis<\/b><br /><br />\nfrom 8th c. BCE <br />to 7th","<b>Carales (Cagliari)<\/b><br /><br />\nfrom 8th c. BCE <br />to 7th","<b>S. Giorgio di Portoscuso<\/b><br /><br />\nfrom 8th c. BCE ","<b>Monte Sirai<\/b><br /><br />\nfrom 8th c. BCE <br />to 7th","<b>San Vittorio<\/b><br /><br />\nfrom 8th c. BCE ","<b>Sulky (Sulcis)<\/b><br /><br />\nfrom 8th c. BCE <br />to 7th","<b>Nora<\/b><br /><br />\nfrom 8th c. BCE <br />to 7th","<b>Lisbon<\/b><br /><br />\nfrom 8th c. BCE <br />to 7th","<b>Quinta do Almaraz<\/b><br /><br />\nfrom 8th c. BCE ","<b>Panormus (Palermo)<\/b><br /><br />\nfrom 8th c. BCE <br />to 7th","<b>La Fonteta<\/b><br /><br />\nfrom 8th c. BCE <br />to 7th","<b>Cabezo del Estaño<\/b><br /><br />\nfrom 8th c. BCE ","<b>Motya (Mozia)<\/b><br /><br />\nfrom 8th c. BCE <br />to 7th","<b>Ayamonte<\/b><br /><br />\nfrom 8th c. BCE <br />to 7th","<b>Tavira<\/b><br /><br />\nfrom 8th c. BCE <br />to 7th","<b>Carthage<\/b><br /><br />\nfrom 8th c. BCE <br />to 7th","<b>Abdera (Adra)<\/b><br /><br />\nfrom 8th c. BCE <br />to 7th","<b>Toscanos<\/b><br /><br />\nfrom 8th c. BCE <br />to 7th","<b>Morro de Mezquitilla<\/b><br /><br />\nfrom 8th c. BCE <br />to 7th","<b>Chorreras<\/b><br /><br />\nfrom 8th c. BCE <br />to 7th","<b>Sexs (Almuñécar)<\/b><br /><br />\nfrom 8th c. BCE <br />to 7th","<b>Malaka (Málaga)<\/b><br /><br />\nfrom 8th c. BCE <br />to 7th","<b>Cerro del Villar<\/b><br /><br />\nfrom 8th c. BCE <br />to 7th","<b>Castillo Doña Blanca<\/b><br /><br />\nfrom 8th c. BCE <br />to 7th","<b>Gadir (Cádiz)<\/b><br /><br />\nfrom 8th c. BCE <br />to 7th","<b>Casas de Montilla<\/b><br /><br />\nfrom 8th c. BCE ","<b>Gozzo<\/b><br /><br />\nfrom 8th c. BCE <br />to 7th","<b>Ceuta<\/b><br /><br />\nfrom 8th c. BCE <br />to 7th","<b>Melita<\/b><br /><br />\nfrom 8th c. BCE <br />to 7th","<b>Hadrumetum (Sousse)<\/b><br /><br />\nfrom 8th c. BCE <br />to 7th","<b>Lixus<\/b><br /><br />\nfrom 8th c. BCE <br />to 7th","<b>Santa Olaia<\/b><br /><br />\nfrom 7th c. BCE ","<b>Cuccurredus<\/b><br /><br />\nfrom 7th c. BCE ","<b>Pani Loriga<\/b><br /><br />\nfrom 7th c. BCE ","<b>Iboshim (Ibiza)<\/b><br /><br />\nfrom 7th c. BCE ","<b>Bithia<\/b><br /><br />\nfrom 7th c. BCE ","<b>Sa Caleta<\/b><br /><br />\nfrom 7th c. BCE ","<b>Abul<\/b><br /><br />\nfrom 7th c. BCE ","<b>Solunto<\/b><br /><br />\nfrom 7th c. BCE ","<b>Cabecico de Parra<\/b><br /><br />\nfrom 7th c. BCE ","<b>Baria (Villaricos)<\/b><br /><br />\nfrom 7th c. BCE ","<b>Cabecicos Negros<\/b><br /><br />\nfrom 7th c. BCE ","<b>Cossyra (Pantelleria)<\/b><br /><br />\nfrom 7th c. BCE ","<b>Iol (Cherchel)<\/b><br /><br />\nfrom 7th c. BCE ","<b>Chiclana<\/b><br /><br />\nfrom 7th c. BCE ","<b>Cerro del Prado<\/b><br /><br />\nfrom 7th c. BCE ","<b>Tarifa<\/b><br /><br />\nfrom 7th c. BCE ","<b>Les Andalouses<\/b><br /><br />\nfrom 7th c. BCE ","<b>Mersa Madakh<\/b><br /><br />\nfrom 7th c. BCE ","<b>Rachgoun<\/b><br /><br />\nfrom 7th c. BCE ","<b>Acholla (El Alia)<\/b><br /><br />\nfrom 7th c. BCE ","<b>Sala<\/b><br /><br />\nfrom 7th c. BCE ","<b>Leptis Magna<\/b><br /><br />\nfrom 7th c. BCE ","<b>Kerne (Mogador)<\/b><br /><br />\nfrom 7th c. BCE "],null,null,{"interactive":false,"permanent":false,"direction":"auto","opacity":1,"offset":[0,0],"textsize":"10px","textOnly":false,"className":"","sticky":true},null]}],"limits":{"lat":[31.49555555555555,40.92361111111111],"lng":[-9.786388888888888,36.04676388888889]}},"evals":[],"jsHooks":[]}
Figure 2: Phoenician colonies (interactive)

Export

We can build a clean Geopackage (and a CSV just in case):

phoenician |>   st_write(    "data/phoenician_settlements.gpkg",    layer = "phoenician_settlements",    layer_options = c(      "IDENTIFIER=Phoenician colonization from its origin to the 7th century BC",      glue("DESCRIPTION=Data from:             Manzano-Agugliaro, F., Marín-Buzón, C., Carpintero-Lozano, S., & López-Castro, J. L. (2025). \\            Phoenician colonization from its origin to the 7th century BC. Journal of Maps, 21(1). \\            https://doi.org/10.1080/17445647.2025.2528876                       Available on https://doi.org/10.5281/zenodo.17141060                       Extracted on {Sys.Date()} – https://r.iresmi.net/posts/2025/phoenician")),    delete_layer = TRUE,     quiet = TRUE)phoenician |>   select(-c(latitude_n, longitude_e)) |>   bind_cols(st_coordinates(phoenician)) |>   rename(lon_wgs84 = X,         lat_wgs84 = Y) |>   st_drop_geometry() |>   write_csv("data/phoenician_settlements.csv")

And lastly we store them in a public repository; they are now available on Zenodo and therefore even have a doi:10.5281/zenodo.17141060

References

Manzano-Agugliaro, Francisco, Carmen Marín-Buzón, Susana Carpintero-Lozano, and José Luis López-Castro. 2025. “Phoenician Colonization from Its Origin to the 7th Century BC.” Journal of Maps 21 (1): 2528876. https://doi.org/10.1080/17445647.2025.2528876.
To leave a comment for the author, please follow the link and comment on their blog: r.iresmi.net.

R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
Continue reading: Phoenician colonization