Τι θα μάθουμε

Σε αυτό το οδηγό (tutorial) θα δούμε πώς:

και κατασκευάζουμε :

Εισαγωγή - Βασικά σημεία Θεματικής Χαρτογραφίας

Οι χάρτες ως εργαλείο ανάλυσης χωρικών φαινομένων

Οι χάρτες δεν είναι απλώς «εικόνες», αλλά εργαλεία διερεύνησης: μας βοηθούν να δούμε πώς κατανέμονται τα χωρικά φαινόμενα, να οπτικοποιήσουμε σχέσεις, να εντοπίσουμε πρότυπα και να κατανοήσουμε δυναμικές που δύσκολα διακρίνονται σε έναν πίνακα αριθμών. Όταν ένα φαινόμενο έχει χωρική διάσταση, η χαρτογραφική του απόδοση συχνά είναι απαραίτητη για να αναλυθεί ουσιαστικά.

Ενδεικτικά, βασικές (ευρείες) κατηγορίες γεωγραφικών φαινομένων που μελετώνται μέσω χαρτών είναι:

  1. Χωροθέτηση (Location) – πού βρίσκεται κάτι.

  2. Κατανομή (Distribution) – πώς κατανέμονται τιμές ή γεγονότα στον χώρο.

  3. Περιφερειοποίηση (Regions) – ομαδοποίηση περιοχών με κοινά χαρακτηριστικά.

  4. Συνδέσεις / Συσχετίσεις (Association) – σχέσεις μεταξύ φαινομένων σε διαφορετικές θέσεις.

  5. Κινήσεις / Ροές (Movement / Flows) – μετακινήσεις πληθυσμών, αγαθών, πληροφοριών.

  6. Διάχυση (Diffusion) – εξάπλωση φαινομένων στον χώρο και στον χρόνο (π.χ. καινοτομία, ασθένειες).

Τα δομικά στοιχεία του χάρτη

Κάθε χάρτης είναι ένα σχέδιο του χώρου: μια επιλεκτική, συχνά απλουστευμένη αλλά οργανωμένη αναπαράσταση μιας περιοχής σε δύο διαστάσεις. Όπως κάθε διάγραμμα, έτσι και ο χάρτης αποτελείται από βασικά γραφικά στοιχεία, τα οποία η γεωμετρία ορίζει με σαφήνεια και είναι περιορισμένα σε αριθμό:

Πάνω σε αυτά χτίζονται όλες οι χαρτογραφικές απεικονίσεις. Ενδεικτικά:

Στη σύγχρονη χαρτογραφία και στα Συστήματα Γεωγραφικών Πληροφοριών (GIS) -καθώς και στη R με sf και tmap-, κάθε χωρικό αντικείμενο που εμφανίζεται σε έναν χάρτη είναι, στην ουσία, ένα από αυτά τα τρία βασικά γεωμετρικά “δομικά υλικά”.

Είδος των δεδομένων

Ο τύπος των δεδομένων καθορίζει σε μεγάλο βαθμό πώς πρέπει να τα χαρτογραφήσουμε και ποιο συμβολισμό να επιλέξουμε. Δεν “ταιριάζουν” όλα τα σύμβολα σε όλα τα δεδομένα: άλλο τρόπο θέλει μια κατηγορία (π.χ. τύπος περιφέρειας) και άλλο ένας αριθμητικός δείκτης (π.χ. ΑΕΠ κατά κεφαλή). Σε γενικές γραμμές, μπορούμε να ξεχωρίσουμε τις εξής βασικές κατηγορίες:

Η σωστή διαχείριση των δεδομένων είναι βασικό βήμα πριν φτιάξουμε χάρτη: εξασφαλίζει ότι ο συμβολισμός “λέει την αλήθεια” και δεν παραπλανά τον αναγνώστη.

Γενικά χαρακτηριστικά των χαρτογραφικών δομικών στοιχείων

Οι τρόποι παρουσίασης αποτελούν το κρίσιμο “σύνδεσμο” ανάμεσα στη σημειωτική και τη χαρτογραφία: είναι ο μηχανισμός με τον οποίο οι αριθμοί και οι κατηγορίες μετατρέπονται σε οπτική πληροφορία. Ο Jacques Bertin (1983) ήταν ο πρώτος που οργάνωσε συστηματικά αυτή τη λογική, διατυπώνοντας μια σημειολογική θεωρία των γραφικών παραστάσεων. Σύμφωνα με αυτήν, ένα σύμβολο στον χάρτη μπορεί να μεταφέρει διαφορετικά νοήματα μεταβάλλοντας συγκεκριμένα οπτικά χαρακτηριστικά – τις λεγόμενες οπτικές μεταβλητές.

Τα βασικά οπτικά/χαρτογραφικά “δομικά στοιχεία” που χρησιμοποιούνται για να διαφοροποιήσουμε τα σύμβολα και να κωδικοποιήσουμε διαφορετικού τύπου δεδομένα είναι:

Η σωστή αντιστοίχιση τύπου δεδομένων και οπτικής μεταβλητής είναι θεμελιώδης: εξασφαλίζει ότι ο χάρτης είναι όχι μόνο αισθητικά ευχάριστος, αλλά και νοηματικά σαφής και ερμηνεύσιμος.

Αντιστοίχιση τύπου δεδομένων και οπτικών μεταβλητών

Ο τύπος της μεταβλητής δεν είναι τυπική λεπτομέρεια· καθορίζει ποια οπτική μεταβλητή είναι κατάλληλη για τη χαρτογραφική της απόδοση. Με βάση τη σημειολογική προσέγγιση (Bertin), ενδεικτικά:

Με λίγα λόγια:
διαφορετικός τύπος δεδομένων →διαφορετική οπτική μεταβλητή →διαφορετικός τύπος θεματικού χάρτη

Αυτό είναι και το θεωρητικό υπόβαθρο πίσω από τις επιλογές που κάνουμε στη συνέχεια με την περιγραφή των παραδειγμάτων χαρτογράφησης.

Χαρτογράφηση ποσοτικών μεταβλητών

Η χαρτογράφηση ποσοτικών μεταβλητών βασίζεται στην ιδέα ότι δεν μπορούμε (και δεν χρειάζεται) να δείξουμε κάθε αριθμητική τιμή ξεχωριστά. Αντί γι’ αυτό, ομαδοποιούμε τις τιμές σε κλάσεις, ώστε ο χάρτης να αναδεικνύει τη γενική δομή και τα χωρικά πρότυπα του φαινομένου, όχι την ιδιαιτερότητα κάθε μεμονωμένης περίπτωσης. Στόχος της θεματικής χαρτογραφίας δεν είναι να αντικαταστήσει έναν αναλυτικό πίνακα δεδομένων, αλλά να βοηθήσει τον αναγνώστη να “δει” πώς κατανέμεται το φαινόμενο στον χώρο.

Η ποιότητα ενός θεματικού χάρτη ποσοτικών δεδομένων εξαρτάται κυρίως από δύο κρίσιμες επιλογές:

  1. το γεωγραφικό επίπεδο αναφοράς, δηλαδή σε ποιες χωρικές ενότητες (χώρες, περιφέρειες, Δήμους, NUTS-2 κ.λπ.) θα χωρίσουμε τον χώρο, και

  2. τον τρόπο ταξινόμησης των τιμών σε κλάσεις, δηλαδή πόσες κλάσεις θα χρησιμοποιήσουμε και με ποια όρια.

Κάθε τέτοια επιλογή είναι ένας συμβιβασμός: χάνουμε μέρος της λεπτομέρειας, αλλά κερδίζουμε καθαρότερη εικόνα της βασικής χωρικής δομής (πρότυπο/μοτίβο, pattern). Ένας προσεκτικά σχεδιασμένος χάρτης πετυχαίνει ακριβώς αυτόν τον συμβιβασμό, κάνοντας τις χωρικές διαφοροποιήσεις ευδιάκριτες χωρίς να διαστρεβλώνει την πληροφορία.

Σχεδιασμός του χάρτη (χαρτοσύνθεση)

Ο χάρτης δεν είναι μόνο η απεικόνιση ενός τμήματος της γήινης επιφάνειας σε χαρτί ή οθόνη. Είναι ένα ολοκληρωμένο επικοινωνιακό προϊόν, το οποίο πρέπει να προσφέρει στον αναγνώστη όλα τα απαραίτητα στοιχεία για να κατανοήσει σωστά την πληροφορία που παρουσιάζεται.

Βασικά συστατικά ενός καλά σχεδιασμένου χάρτη είναι συνήθως:

Ο συνδυασμός αυτών των στοιχείων, σε ισορροπημένη διάταξη, είναι κρίσιμος ώστε ο χάρτης να είναι όχι μόνο αισθητικά άρτιος, αλλά και σαφής, αξιόπιστος και λειτουργικός για τον χρήστη.

1. Προετοιμασία περιβάλλοντος εργασίας και φόρτωση βιβλιοθηκών

Στο περιβάλλον της R, τα πακέτα (R packages) αποτελούν τον βασικό τρόπο επέκτασης της γλώσσας. Κάθε πακέτο είναι μια οργανωμένη συλλογή από συναρτήσεις, σύνολα δεδομένων και τεκμηρίωση, που εγκαθίσταται μία φορά και φορτώνεται όποτε χρειάζεται. Με αυτόν τον τρόπο προσθέτουμε εξειδικευμένα εργαλεία για στατιστική ανάλυση, χειρισμό χωρικών δεδομένων, χαρτογράφηση, διαδραστική απεικόνιση κ.ά., χωρίς να “εφευρίσκουμε τον τροχό”.

Στο συγκεκριμένο παράδειγμα χρησιμοποιούμε τα παρακάτω πακέτα που καλύπτουν ολόκληρη τη ροή εργασίας:

Η σωστή προετοιμασία (έλεγχος–εγκατάσταση–φόρτωση πακέτων στην αρχή του script ή του R Markdown) εξασφαλίζει ότι ο κώδικας είναι αναπαραγώγιμος: οποιοσδήποτε χρήστης, σε οποιονδήποτε υπολογιστή, μπορεί να εκτελέσει τα βήματα και να παραγάγει τους ίδιους χάρτες.

# πακέτα που είναι απαραίτητα για αυτόν το οδηγό
rpackages <- c("eurostat", "giscoR", "sf", "dplyr", "tmap")

# έλεγχος και εγκατάσταση πακέτων
to_install <- setdiff(rpackages, rownames(installed.packages()))
if (length(to_install) > 0) {
install.packages(to_install)
}

# διαδικασία ενεργοποίησης πακέτων
invisible(lapply(rpackages, library, character.only = TRUE))

2. Εισαγωγή περιγραφικών δεδομένων (πίνακες) - Δεδομένα Eurostat

Για την επιλογή των δεδομένων χρησιμοποιούμε τις συναρτήσεις του πακέτου eurostat:

# Cache για πακετο Eurostat (προαιρετικό)
options(eurostat_cache = TRUE)

# Αναζήτηση σειρών δεδομένων (datasets) που σχετίζονται με το ΑΕΠ (GDP)
res_gdp <- search_eurostat("GDP", type = "dataset")

# διερεύνηση περιεχομένου αναζήτησης
dplyr::glimpse(res_gdp)
## Rows: 41
## Columns: 9
## $ title                       <chr> "Gross domestic product (GDP) and main com…
## $ code                        <chr> "namq_10_gdp", "nama_10_gdp", "ei_na_q_vtg…
## $ type                        <chr> "dataset", "dataset", "dataset", "dataset"…
## $ last.update.of.data         <chr> "10.11.2025", "27.10.2025", "15.10.2025", …
## $ last.table.structure.change <chr> "31.10.2025", "09.09.2025", "15.10.2025", …
## $ data.start                  <chr> "1975-Q1", "1975", "1995-Q1", "2000", "200…
## $ data.end                    <chr> "2025-Q3", "2024", "2025-Q2", "2023", "202…
## $ values                      <dbl> 7980673, 1056299, 49374, 71581, 40358, 279…
## $ hierarchy                   <dbl> 5, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 7, …
# εμφάνιση 10 πρώτων εγγραφών σε συνοπτική μορφή (επιλεγμένες στήλες)
res_gdp_small <- res_gdp[, c("code", "title", "data.end")]
head(res_gdp_small, 10)
## # A tibble: 10 × 3
##    code             title                                               data.end
##    <chr>            <chr>                                               <chr>   
##  1 namq_10_gdp      Gross domestic product (GDP) and main components (… 2025-Q3 
##  2 nama_10_gdp      Gross domestic product (GDP) and main components (… 2024    
##  3 ei_na_q_vtg      Gross domestic product (GDP) - quarterly  data - v… 2025-Q2 
##  4 nama_10r_2gdp    Gross domestic product (GDP) at current market pri… 2023    
##  5 nama_10r_3popgdp Average annual population to calculate regional GD… 2023    
##  6 nama_10r_3gdp    Gross domestic product (GDP) at current market pri… 2023    
##  7 nama_10r_2gvagr  Gross domestic product (GDP) and Gross value added… 2023    
##  8 met_10r_3gdp     Gross domestic product (GDP) at current market pri… 2022    
##  9 met_10r_3pgdp    Average annual population to calculate regional GD… 2022    
## 10 urt_10r_3gdp     Gross domestic product (GDP) at current market pri… 2023

Στο παράδειγμά μας, επιλέγουμε το dataset nama_10r_2gdp.

# παράμετροι επιλογής
indata <- "nama_10r_2gdp" # σειρά δεδομένων (dataset)
intime <- 2022 # έτος
inname <- "Π. Πανταζής" # συγγραφέας

# φόρτωση δεδομένων από Eurostat
gdp_raw <- get_eurostat(indata, time_format = "num")
## indexed 0B in  0s, 0B/sindexed 2.15GB in  0s, 2.15GB/s                                                                              
# επισκόπηση μεταβλητών και χρονικής περιόδου διαθέσιμων δεδομένων 
unique(gdp_raw$unit)
## [1] "EUR_HAB"           "EUR_HAB_EU27_2020" "MIO_EUR"          
## [4] "MIO_NAC"           "MIO_PPS_EU27_2020" "PPS_EU27_2020_HAB"
## [7] "PPS_HAB_EU27_2020"
range(gdp_raw$TIME_PERIOD)
## [1] 2000 2023

Στο παράδειγμά μας, φιλτράρουμε το dataset με τον δείκτη PPS_HAB_EU27_2020 (ΑΕΠ κατά κεφαλή σε μονάδες αγοραστικής δύναμης (ΜΑΔ) ως ποσοστό του αντίστοιχου δείκτη της ΕΕ27) και στο έτος 2022.

# Επιλέγουμε μόνο τον δείκτη PPS_HAB_EU27_2020 και για το έτος intime.
gdp_m <- gdp_raw %>%
dplyr::filter(
  unit == "PPS_HAB_EU27_2020",
  TIME_PERIOD == intime
 ) %>%
dplyr::select(geo, values)

# οπτικός έλεγχος πίνακα
head(gdp_m)
## # A tibble: 6 × 2
##   geo   values
##   <chr>  <dbl>
## 1 AT       123
## 2 AT1      119
## 3 AT11      86
## 4 AT12     101
## 5 AT13     140
## 6 AT2      113

Παρατήρηση

Προς το παρόν έχουμε μόνο πίνακα δεδομένων (κωδικός NUTS-2 + τιμή). Η χαρτογράφηση απαιτεί ένωση με τα γεωμετρικά όρια.

3. Εισαγωγή γεωμετρικών δεδομένων (geodataset)

3.1 Υπόβαθρα NUTS (Eurostat/GISCO)

Για να διασφαλίσουμε ότι οι χάρτες μας βασίζονται σε επίσημα και συνεπή χωρικά δεδομένα, αξιοποιούμε τα σύνολα ορίων που παρέχονται από επίσημες πηγές Η GISCO (Geographic Information System of the Commission) αποτελεί την επίσημη γεωχωρική υποδομή της Ευρωπαϊκής Επιτροπής. Μέσω της GISCO παρέχονται:

Η συνάρτηση get_eurostat_geospatial() του πακέτου eurostat μας επιτρέπει να κατεβάζουμε απευθείας γεωχωρικά δεδομένα (πολύγωνα, όρια) από την GISCO σε μορφή sf. Η συνάρτηση get_eurostat_geospatial() δεν προορίζεται για πλήρη περιήγηση σε όλα τα διαθέσιμα χαρτογραφικά δεδομένα της Eurostat, αλλά εστιάζει στην παροχή τυποποιημένων γεωμετριών (όπως τα επίπεδα NUTS) σε συγκεκριμένα έτη, κλίμακες και συστήματα αναφοράς, διευκολύνοντας την άμεση σύνδεσή τους με στατιστικά δεδομένα. Οι βασικές επιλογές είναι οι παρακάτω:

Στο παράδειγμά μας, φορτώνουμε τα επίσημα όρια NUTS-2 και NUTS-0 (χώρες) (έτος 2021) σε προβολικό σύστημα EPSG:3035 [ETRS89-extended / LAEA Europe].

# φόρτωση και δημιουργία γεωχωρικου θεματικού επίπεδο για περιφέρειες (NUTS-2)
nuts2 <- get_eurostat_geospatial(
  output_class = "sf",
  resolution = "60",
  nuts_level = 2,
  year = 2021,
 crs = 3035
)

#φόρτωση και δημιουργία γεωχωρικου θεματικού επίπεδο για χώρες (NUTS-0)
nuts0 <- get_eurostat_geospatial(
  output_class = "sf",
  resolution = "60",
  nuts_level = 0,
  year = 2021,
  crs = 3035
)

# Κωδικοί χωρών ΕΕ27 για επιλογή δεδομένων
eu_info <- eurostat::eu_countries
eu27_codes <- eu_info$code 

Τι είναι η μορφή sf;

Στη σύγχρονη R, τα περισσότερα χωρικά δεδομένα (shapefiles, γεωμετρικά όρια κ.λπ.) διαχειρίζονται με τη μορφή sf (simple features).

Ένα αντικείμενο sf είναι ουσιαστικά ένας πίνακας (data frame) που:

Μαζί με τη γεωμετρία, κάθε αντικείμενο sf γνωρίζει και το σύστημα αναφοράς συντεταγμένων (CRS) που χρησιμοποιεί (π.χ. EPSG:4326, EPSG:3035), κάτι που είναι κρίσιμο για σωστή απεικόνιση και χωρικές πράξεις.

Πλεονέκτημα της μορφής sf:

3.2 Υπόβαθρο γειτονικών χωρών (μη ΕΕ27) (προαιρετικό βήμα)

Η συνάρτηση gisco_get_countries() του πακέτου giscoR λειτουργεί συμπληρωματικά στη συνάρτηση get_eurostat_geospatial(), καθώς μας επιτρέπει να κατεβάζουμε επίσημα γεωμετρικά όρια χωρών (state boundaries) από τη GISCO, με έλεγχο σε:

Στο παράδειγμά μας τη χρησιμοποιούμε για να προσθέσουμε ως υπόβαθρο τις γειτονικές χώρες εκτός ΕΕ27, ώστε οι θεματικοί χάρτες NUTS-2 να εντάσσονται σε ένα πλήρες και συνεπές γεωγραφικό πλαίσιο.

# Όρια χωρών από GISCO (όλες οι χώρες)
neigh_all <- gisco_get_countries(
  resolution = "60",
  epsg       = 3035
)

# Κωδικοί χωρών ΕΕ27
euinfo      <- eurostat::eu_countries
eu27_codes  <- euinfo$code

# 3. Υπόβαθρο: μη-ΕΕ27 χώρες
bg_non_eu <- neigh_all %>%
  dplyr::filter(!(CNTR_ID %in% eu27_codes)) %>%
  sf::st_make_valid()

Σχόλιο

Με την παραπάνω διαδικασία εξασφαλίζουμε ότι χώρες όπως Νορβηγία, Ελβετία, Ην. Βασίλειο, Τουρκία κ.λπ. εμφανίζονται σωστά ως υπόβαθρο.

4. Σύνδεση περιγραφικών με γεωμετρικά δεδομένα

Στο παράδειγμά μας, χρησιμοποιούμε το θεματικό επίπεδο NUTS-2 (nuts2) που είναι sf αντικείμενο, το οποίο στη συνέχεια συνδέουμε (join) με τα στατιστικά δεδομένα της Eurostat (gdp_m).

Κρατάμε μόνο τις περιφέρειες των χωρών ΕΕ27 (NUTS-2) και ενώνουμε (προσθέτουμε) τις τιμές ΑΕΠ.

#Χώρες (NUTS-0)-> επιλογή μόνο ΕΕ27

nuts0_eu27 <- nuts0 %>%
dplyr::filter(CNTR_CODE %in% eu27_codes)

#Περιφέρειες (NUTS-2)  με τιμές ΑΕΠ μόνο για ΕΕ27

nuts2_gdp <- nuts2 %>%
dplyr::left_join(gdp_m, by = c("NUTS_ID" = "geo")) %>%
dplyr::filter(substr(NUTS_ID, 1, 2) %in% eu27_codes)

# οπτικός έλεγχος πίνακα
head(nuts2_gdp[, c("NUTS_ID", "NAME_LATN", "CNTR_CODE", "values")])
## Simple feature collection with 6 features and 4 fields
## Geometry type: GEOMETRY
## Dimension:     XY
## Bounding box:  xmin: 3817785 ymin: 1596715 xmax: 6524943 ymax: 3098721
## Projected CRS: ETRS89-extended / LAEA Europe
##   NUTS_ID             NAME_LATN CNTR_CODE values                       geometry
## 1    BE31  Prov. Brabant Wallon        BE    145 POLYGON ((3969815 3082970, ...
## 2    BE32         Prov. Hainaut        BE     73 MULTIPOLYGON (((3865687 308...
## 3    BE33           Prov. Liège        BE     86 POLYGON ((4017252 3086773, ...
## 4    BE34 Prov. Luxembourg (BE)        BE     74 POLYGON ((4013536 3037570, ...
## 5    CY00                Kýpros        CY     98 POLYGON ((6467380 1643362, ...
## 6    CZ01                 Praha        CZ    199 POLYGON ((4625398 3001301, ...

Τι κάνει το left_join() στη dplyr

Με την εντολή left_join(x, y, by = ...):
Διατηρούνται όλες τις γραμμές του x (αριστερού πίνακα). Για κάθε γραμμή του x, ψάχνεις στον y γραμμές που ταιριάζουν στο/στα πεδίο(κλειδί)/α που δήλωσες στο by.

Αν βρεθεί ταίριασμα:

Αν δεν βρεθεί:

Ο αριθμός γραμμών του πίνακα x δεν αλλάζει.

Τα πεδία (κλειδιά) μπορεί:

5. Κατασκευή χαρτών

Για τις ανάγκες του συγκεκριμένου οδηγού θα χρησιμοποιήσουμε το πακέτο tmap. Το tmap συνιστά μια εξειδικευμένη βιβλιοθήκη της R για θεματική χαρτογραφία, σχεδιασμένη ώστε να κάνει την παραγωγή χαρτών με χωρικά δεδομένα όσο γίνεται πιο δομημένη, αναγνώσιμη και αναπαράξιμη – ιδανική για διδασκαλία και επιστημονική χρήση.

Βασίζεται σε μια λογική παρόμοια με το “grammar of graphics”: κάθε χάρτης χτίζεται βήμα-βήμα με Θεματικά επίπεδα (layers). Ξεκινάμε πάντα με:

και στη συνέχεια προσθέτουμε επίπεδα αναπαράστασης, όπως:

Κεντρικό πλεονέκτημα της βιβλιοθήκης tmap είναι ότι δουλεύει απευθείας με αντικείμενα sf (και άλλα χωρικές μορφοποιήσεις), επομένως ενσωματώνεται ταχύτατα σε ροή εργασίας: εισάγουμε/παράγουμε χωρικά δεδομένα ως sf, τα επεξεργαζόμαστε με dplyr, και τα χαρτογραφούμε με tmap χωρίς επιπλέον μετατροπές.

Ένα ακόμη ιδιαίτερα χρήσιμο χαρακτηριστικό είναι η ύπαρξη δύο “καταστάσεων λειτουργίας”:

Μεταξύ άλλων το πακέτο tmap υποστηρίζει:

Μπορείτε να βρείτε τεκμηρίωση και παραδείγματα στη σελίδα του πακέτου:

5.1. Στατικός χωροπληθής χάρτης

Στο παρακάτω παράδειγμα παρατίθεται ο κώδικας που κατασκευάζει το βασικό στατικό χωροπλήθη (choropleth) χάρτη του οδηγού που:

# ορισμός "παραθύρου προβολής" στο επιλεγμένο σύστημα 3035 [ETRS89-extended / LAEA Europe]
eu_bbox <- sf::st_as_sfc(sf::st_bbox(
c(xmin = 2440000, xmax = 6500000,
ymin = 1100000, ymax = 5700000),
crs = sf::st_crs(nuts0)
))

# ορισμός κλάσεων και παλέτα χρωμάτων
mybreaks <- c(0, 50, 75, 90, 100, 110, 125, 150, 200, 300) # όρια κλάσεων
mypal0 <- c("#084A92", "#fef9e7", "#800026") # χρώματα: μπλε-λευκό-κόκκινο

# επιλογή τρόπου παρουσίασης, plot-> στατικός χάρτης
tmap_mode("plot")

# δημιουργία χάρτη
fmap <- 
# θεματικό επίπεδο γειτονικών χωρών με την μορφή πολυγώνου 
  tm_shape(bg_non_eu, bbox = eu_bbox) + 
  tm_polygons(
    fill = "grey95",
    fill_alpha = 1,
    border.col = "grey85",
    lwd = 0.3
  ) +
# θεματικό επίπεδο περιφερειών ΕΕ27 με την μορφή πολυγώνου 
  tm_shape(nuts2_gdp, bbox = eu_bbox) +
  tm_polygons(
    fill = "values",
    fill_alpha = 0.9,
    fill.scale = tm_scale_intervals(
      breaks = mybreaks,
      values = mypal0,
      label.na = "ΜΔ",
      value.na = "grey80"
    ),
    fill.legend = tm_legend(
    title = paste0("ΑΕΠ κατά κεφαλή\n(ΜΑΔ, EU27=100, ", intime, ")")
    )
  ) +
  tm_borders(col = "grey90", lwd = 0.3) +
# θεματικό επίπεδο ορίων χώρων-ΕΕ27 με την μορφή περιγράμματος (γραμμές-όρια)
  tm_shape(nuts0_eu27, bbox = eu_bbox) + 
  tm_borders(col = "grey30", lwd = 0.9) +
# θεματικό επίπεδο ορίων χώρων-ΕΕ27, ετικέτες
  tm_shape(nuts0_eu27, bbox = eu_bbox) + 
  tm_labels(
    "CNTR_CODE",
    col = "black",
    size = 0.55,
    bgcol = "white",
    bgcol_alpha = 0.7,
    legend.size.show = FALSE,
    options = opt_tm_labels(
      points_only = "ifany",
      point_per = "feature",
      on_surface = TRUE,
      just = "center",
      remove_overlap = TRUE
    )
  ) +
# μορφοποίηση σύνθεσης του χάρτη
  tm_layout( 
    frame = TRUE,
    legend.outside = TRUE,
    legend.text.size = 0.6,
    legend.title.size = 0.8
  ) +
# τίτλος του χάρτη
  tm_title( 
    paste0("ΑΕΠ κατά κεφαλή\nNUTS-2, ΕΕ27-2020=100, ", intime),
    size = 0.9
  ) 

# εμφάνιση του χάρτη
fmap

Σημείωση για το "\n"

Στις συναρτήσεις της R που χρησιμοποιούν αλφαριθμητικά δεδομένα (κείμενο), η ακολουθία "\n" δηλώνει αλλαγή γραμμής. Τη χρησιμοποιούμε σε συναρτήσεις όπως tm_title() και σε τίτλους υπομνημάτων για να “σπάμε” μεγάλες προτάσεις σε δύο ή περισσότερες γραμμές, κάνοντας τον χάρτη πιο ευανάγνωστο.

Προαιρετική αποθήκευση του χάρτη

wkd<-"d:/PROJECTS/rpubs/" # διαδρομή στον τοπικό δίσκο 

png(file = paste0(wkd, "eu27_gdppc_", intime, "_nuts2.png"),
    width = 1950, height = 1800, res = 250)
fmap
dev.off()

Σχόλια για συζήτηση

Ποιες περιφέρειες βρίσκονται στα υψηλότερα/χαμηλότερα επίπεδα; Πώς κατανέμονται γεωγραφικά;

5.1.1 Στατικός χωροπληθής χάρτης με δύο μεταβλητές

Στο παρακάτω παράδειγμα παρατίθεται ο κώδικας που κατασκευάζει σύνθετο στατικό χωροπληθή χάρτη. Επί της ουσίας εφαρμόζουμε στην πράξη τις αρχές σχεδιασμού που παρουσιάστηκαν στα προηγούμενα κεφάλαια, συνδυάζοντας σε μια ενιαία χαρτογραφική σύνθεση δύο διαφορετικού τύπου πληροφορίες:

Για να το υλοποιήσουμε τεχνικά, χρησιμοποιούμε τη συνάρτηση st_point_on_surface() ώστε να ορίσουμε ένα αντιπροσωπευτικό σημείο μέσα σε κάθε πολύγωνο NUTS-2 και πάνω σε αυτά τα σημεία τοποθετούμε τα σύμβολα. Με αυτόν τον τρόπο:

Στη σύνθεση ενσωματώνονται επίσης βασικά στοιχεία χαρτογραφικού σχεδιασμού, όπως η γραφική κλίμακα (tm_scalebar()), το σύμβολο βορρά (tm_compass()), καθώς και οι πηγές και η χαρτογραφική υπογραφή (tm_credits()), ώστε ο χάρτης να είναι πλήρης, τεκμηριωμένος και λειτουργικός.

Το υπόμνημα οργανώνεται αντίστοιχα σε δύο σαφή τμήματα: ένα για την κλίμακα χρωμάτων (δείκτης) και ένα για τις κλάσεις μεγέθους των συμβόλων, διευκολύνοντας τον αναγνώστη να “αναγνωρίσει” αυτόχρονα τις σχετικές και τις απόλυτες διαστάσεις του ίδιου φαινομένου.

# Επιλογή συνολικού ΑΕΠ σε ΜΑΔ (εκατομμύρια ΜΑΔ, EΕ27)
gdp_pps <- gdp_raw %>%
  dplyr::filter(
    unit == "MIO_PPS_EU27_2020",
    TIME_PERIOD == intime
  ) %>%
  dplyr::select(geo, gdp_mpps = values)

# ένωση με NUTS-2  (κρατάμε μόνο περιφέρειες ΕΕ27)
nuts2_gdp_pps <- nuts2 %>%
  dplyr::left_join(gdp_pps, by = c("NUTS_ID" = "geo")) %>%
  dplyr::filter(substr(NUTS_ID, 1, 2) %in% eu27_codes)

# Υπολογισμός σημειακής θέσης ανά περιφέρεια
nuts2_points_pps <- nuts2_gdp_pps %>%
  sf::st_point_on_surface()

# ορισμός "παραθύρου προβολής" στο επιλεγμένο σύστημα 3035 [ETRS89-extended / LAEA Europe]
eu_bbox <- sf::st_as_sfc(sf::st_bbox(
c(xmin = 2440000, xmax = 6500000,
ymin = 1100000, ymax = 5700000),
crs = sf::st_crs(nuts0)
))

# ορισμός κλάσεων και παλέτα χρωμάτων
mybreaks <- c(0, 50, 75, 90, 100, 110, 125, 150, 200, 300) # όρια κλάσεων
mypal0 <- c("#084A92", "#fef9e7", "#800026") # χρώματα: μπλε-λευκό-κόκκινο

# επιλογή τρόπου παρουσίασης, plot-> στατικός χάρτης
tmap_mode("plot")

# Συνδυαστικός χάρτης:
#    - Πολύγωνα: ΑΕΠ κατά κεφαλή (PPS_HAB_EU27_2020 = 100)
#    - Φούσκες: συνολικό ΑΕΠ σε εκατ. ΜΑΔ (MIO_PPS_EU27_2020)
fmap_bubbles_pps <-
# θεματικό επίπεδο γειτονικών χωρών με την μορφή πολυγώνου 
  tm_shape(bg_non_eu, bbox = eu_bbox) +
  tm_polygons(
    fill       = "grey95",
    fill_alpha = 1,
    border.col = "grey85",
    lwd        = 0.3
  ) +
#1. χωροπληθής: ΑΕΠ κατά κεφαλή (δείκτης σε ΜΑΔ, EU27=100)
  tm_shape(nuts2_gdp, bbox = eu_bbox) +
  tm_polygons(
    fill        = "values",
    fill_alpha  = 0.9,
    fill.scale  = tm_scale_intervals(
      breaks   = mybreaks,
      values   = mypal0,
      label.na = "ΜΔ",
      value.na = "grey80"
    ),
#! γράφημα κατανομής τιμών
    fill.chart =   tm_chart_bar(position = tm_pos_out("right", "center")), 
    fill.legend = tm_legend(
      title = paste0("ΑΕΠ κατά κεφαλή\n(ΜΑΔ, EU27=100)"),
      position = tm_pos_out("right", "center")
    )
  ) +
  tm_borders(col = "grey90", lwd = 0.3) +
# θεματικό επίπεδο ορίων χώρων-ΕΕ27 με την μορφή περιγράμματος (γραμμές-όρια)
  tm_shape(nuts0_eu27, bbox = eu_bbox) +
  tm_borders(col = "grey30", lwd = 0.9) +
#2. αναλογικά σύμβολα (φούσκες): συνολικό ΑΕΠ σε εκατομμύρια ΜΑΔ
  tm_shape(nuts2_points_pps, bbox = eu_bbox) +
  tm_bubbles(
    size       = "gdp_mpps",
    fill= "orange",
    fill_alpha      = 0.5,
    size.scale = tm_scale_continuous(
      values.scale = 1.2, # δοκιμή 0.8, 1, 1.5
      ticks = c(200000, 500000, 800000), 
      labels = c("200k", "500k", "800k")
    ),
    size.legend = tm_legend(
      title = "Συνολικό ΑΕΠ\n(εκατ. ΜΑΔ)",
      position = tm_pos_out("right", "center")
    )
  ) +
# θεματικό επίπεδο ορίων χώρων-ΕΕ27, ετικέτες
  tm_shape(nuts0_eu27, bbox = eu_bbox) +
  tm_labels(
    "CNTR_CODE",
    col             = "black",
    size            = 0.5,
    bgcol           = "white",
    bgcol_alpha     = 0.7,
    legend.size.show = FALSE,
    options = opt_tm_labels(
      points_only    = "ifany",
      point_per      = "feature",
      on_surface     = TRUE,
      just           = "center",
      remove_overlap = TRUE
    )
  ) +
# μορφοποίηση σύνθεσης του χάρτη
  tm_layout(
    frame            = TRUE,
    legend.outside   = TRUE,
    legend.text.size = 0.6,
    legend.title.size= 0.8
  ) +
# τίτλος του χάρτη
  tm_title(
    paste0(
      "ΑΕΠ κατά κεφαλή (ΜΑΔ) & συνολικό ΑΕΠ (εκατ. ΜΑΔ)",
      "NUTS-2, ΕΕ27-2020, ", intime
    ),
    size = 0.9
  ) +
#! γραφική κλίμακα του  χάρτη - προαιρετικά
  tm_scalebar( 
    breaks = c(0, 250, 500),
    text.size = 0.6,
    position = c("right", "bottom")
  ) +
#! σύμβολο για βορρά - προαιρετικά
  tm_compass(
    type      = "arrow",        # απλό βέλος προς Βορρά
    position  = c("left", "top"),
    size      = 2,
    show.labels = TRUE
  ) +
#! λοιπά περιγραφικά στοιχεία του χάρτη - προαιρετικά
  tm_credits( 
    paste0("Πηγή: Eurostat (", indata, ", NUTS 2021) • ", inname),
    position = c("left", "bottom"),
    scale = 0.5,
    fontface = "italic"
  )

# εμφάνιση χάρτη
fmap_bubbles_pps

Προαιρετική αποθήκευση του χάρτη

wkd<-"d:/PROJECTS/rpubs/" # διαδρομή στον τοπικό δίσκο 

png(file = paste0(wkd, "eu27_gdppc-gdp_", intime, "_nuts2.png"),
    width = 1950, height = 1800, res = 250)
fmap
dev.off()

5.2. Διαδραστικός χωροπληθής χάρτης (Leaflet μέσω tmap)

Στο παρακάτω παράδειγμα παρατίθεται ο κώδικας που κατασκευάζει τη διαδραστική εκδοχή του προηγούμενου χάρτη, χρησιμοποιώντας tmap_mode("view")χωρίς να αλλάξει η βασική λογική χαρτογράφησης:

##ίδια με το προηγούμενο παράδειγμα_________________________________________________
# ορισμός "παραθύρου προβολής" στο επιλεγμένο σύστημα 3035 [ETRS89-extended / LAEA Europe]
eu_bbox <- sf::st_as_sfc(sf::st_bbox(
c(xmin = 2440000, xmax = 6500000,
ymin = 1100000, ymax = 5700000),
crs = sf::st_crs(nuts0)
))

# ορισμός κλάσεων και παλέτα χρωμάτων
mybreaks <- c(0, 50, 75, 90, 100, 110, 125, 150, 200, 300) # όρια κλάσεων
mypal0 <- c("#084A92", "#fef9e7", "#800026") # χρώματα: μπλε-λευκό-κόκκινο
##_________________________________________________________________________________

# επιλογή τρόπου παρουσίασης, view -> δυναμικός χάρτης
tmap_mode("view")

# δημιουργία χάρτη
fmap_view <- 
# θεματικό επίπεδο γειτονικών χωρών με την μορφή πολυγώνου 
  tm_shape(bg_non_eu, bbox = eu_bbox) + 
  tm_polygons(
    fill       = "grey95",
    fill_alpha = 1,
    border.col = "grey85",
    lwd = 0.3
  ) +
# θεματικό επίπεδο περιφερειών ΕΕ27 με την μορφή πολυγώνου 
  tm_shape(nuts2_gdp, bbox = eu_bbox) + 
  tm_polygons(
    fill        = "values",
    fill_alpha  = 0.9,
    fill.scale  = tm_scale_intervals(
       breaks   = mybreaks,
       values   = mypal0,
       label.na = "ΜΔ",
       value.na = "grey80"
    ),
    id          = "NUTS_ID",  # λειτουργικότητα tooltip
    popup.vars  = c(
      "Περιφέρεια: " = "NAME_LATN",
      "Χώρα: "       = "CNTR_CODE",
      "Δείκτης: "    = "values"
    ),
    fill.legend = tm_legend(
      title    = "ΑΕΠ κατά κεφαλή σε ΜΑΔ",
      position = tm_pos_out("right", "top")
    )
  ) +
# θεματικό επίπεδο ορίων χώρων-ΕΕ27 με την μορφή περιγράμματος (γραμμές-όρια)
  tm_shape(nuts0_eu27, bbox = eu_bbox) + 
  tm_borders(col = "black", lwd = 1) +
  tm_layout(
    legend.position  = c("right", "bottom")
  )+
# τίτλος του χάρτη  
  tm_title( 
    paste0("ΑΕΠ κατά κεφαλή (ΜΑΔ)<br>",
           "NUTS-2, ΕΕ27-2020=100, ", intime)
  ) +
# ορισμός παραθύρου παρουσίασης του ΄χαρτη  
  tm_view( 
    bbox       = eu_bbox,   
    set_bounds = TRUE       
  )

# εμφάνιση του χάρτη
fmap_view

Άσκηση

Χρησιμοποιήστε τα αναδυόμενα παράθυρα (popups), επιλέγοντας με τον δρομέα ενότητες στο χάρτη, για να εντοπίσετε συγκεκριμένες περιφέρειες και να συγκρίνετε τιμές.

5.3. Πολυχρονικοί χωροπληθείς χάρτες (Facets): Εξέλιξη 2017–2022

Στο παρακάτω παράδειγμα παρατίθεται ο κώδικας που κατασκευάζει έναν πολυχρονικό θεματικό χάρτη με facets (μικροί πολλαπλοί χάρτες σε πλέγμα), ώστε να φανεί η διαχρονική εξέλιξη του δείκτη ΑΕΠ κατά κεφαλή :

Το αποτέλεσμα είναι μια σειρά στατικών χαρτών σε πλέγμα, που επιτρέπουν οπτική σύγκριση της χωρικής κατανομής του ΑΕΠ κατά κεφαλή στην ΕΕ27 μέσα στην εξαετία 2017–2022.

# επιλογή χρονικού διαστήματος 
years_facet <- 2017:2022

# επιλογή δεδομένων πολλαπλών ετών 
gdp_multi <- gdp_raw %>%
  filter(unit == "PPS_HAB_EU27_2020", TIME_PERIOD %in% years_facet) %>%
  rename(year = TIME_PERIOD) %>%
  select(geo, year, values)

# ένωση με το γεωμετρικό υπόβαθρο nuts2
nuts2_gdp_multi <- nuts2 %>%
  left_join( gdp_multi, by = c("NUTS_ID" = "geo")) %>%
  filter(substr(NUTS_ID, 1, 2) %in% eu27_codes) %>%
  mutate( year = factor(year, levels = years_facet, ordered = TRUE)) %>%
  filter(!is.na(year))

##ίδια με τα προηγούμενα παραδείγματα______________________________________________
# ορισμός "παραθύρου προβολής" στο επιλεγμένο σύστημα 3035 [ETRS89-extended / LAEA Europe]
eu_bbox <- sf::st_as_sfc(sf::st_bbox(
  c(xmin = 2440000, xmax = 6500000,
  ymin = 1100000, ymax = 5700000),
  crs = sf::st_crs(nuts0))
  )

# ορισμός κλάσεων και παλέτα χρωμάτων
mybreaks <- c(0, 50, 75, 90, 100, 110, 125, 150, 200, 300) # όρια κλάσεων
mypal0 <- c("#084A92", "#fef9e7", "#800026") # χρώματα: μπλε-λευκό-κόκκινο
##_________________________________________________________________________________

# επιλογή τρόπου παρουσίασης, plot-> στατικός χάρτης
tmap_mode("plot")

# δημιουργία χάρτη 
fmap_facets <-
 # θεματικό επίπεδο γειτονικών χωρών με την μορφή πολυγώνου 
  tm_shape(bg_non_eu, bbox = eu_bbox) +
  tm_polygons(
    fill = "grey95",
    fill_alpha = 1,
    col = "grey90",
    lwd = 0.1
  ) +
# θεματικό επίπεδο περιφερειών ΕΕ27 -πολλαπλών ετών- με την μορφή πολυγώνου 
  tm_shape(nuts2_gdp_multi, bbox = eu_bbox) + 
  tm_polygons(
    fill = "values",
    fill_alpha = 0.9,
    fill.scale = tm_scale_intervals(
      breaks = mybreaks,
      values = mypal0,
      label.na = "ΜΔ",
      value.na = "grey80"
    ),
    fill.legend = tm_legend(
      title = "ΑΕΠ κατά κεφαλή\n(ΜΑΔ, EU27=100)",
      position = tm_pos_out("right", "center") 
    )
  ) +
  tm_borders(col = "grey80", lwd = 0.2) +
# λειτουργικότητα facet (πολλαπλοί χάρτες με βάση κάπια μεταβλητή)
  tm_facets(   
    by = "year", # ανα έτος
    ncol = 3,
    free.coords = FALSE
  ) +
# θεματικό επίπεδο ορίων χώρων-ΕΕ27 με την μορφή περιγράμματος (γραμμές-όρια)  
  tm_shape(nuts0_eu27, bbox = eu_bbox) + 
  tm_borders(col = "grey30", lwd = 0.6) +
# μορφοποίηση σύνθεσης του χάρτη
  tm_layout( 
    frame = TRUE, 
    legend.outside = TRUE,
    legend.position = c("right", "center"),
    legend.text.size = 0.5,
    legend.title.size = 0.7
  ) +
# τίτλος του χάρτη
  tm_title( 
    paste0( "Εξέλιξη ΑΕΠ κατά κεφαλή\nNUTS-2, ΕΕ27-2020=100 (",
    min(years_facet), "–", max(years_facet), ")"
    ),
    size = 0.9
  )

# εμφάνιση του χάρτη
fmap_facets

Προαιρετική αποθήκευση του χάρτη

wkd<-"d:/PROJECTS/rpubs/" # διαδρομή στον τοπικό δίσκο 

png(file = paste0(wkd, "eu27_gdppc_facet", "_nuts2.png"),
    width = 2100, height = 1700, res = 250)
fmap_facets
dev.off()

Σχόλια για συζήτηση

Ποιες περιφέρειες βελτιώνουν τη θέση τους στην 6ετία; Ποιες μένουν σταθερά χαμηλά; Πώς διαφοροποιούνται οι ευρύτερες ενότητες κεντρικές περιφερειακές χώρες / Βορράς–Νότος;

6. Ιδέες για εμπλουτισμό του παραδείγματος