Σε αυτό το οδηγό (tutorial) θα δούμε πώς:
και κατασκευάζουμε :
έναν στατικό θεματικό χάρτη με την χρήση του πακέτου tmap,
έναν διαδραστικό χάρτη (Leaflet μέσω tmap), και
έναν πολυχρονικό χάρτη με facets σε tmap για την αποτύπωση της διαχρονικής εξέλιξης.
Οι χάρτες δεν είναι απλώς «εικόνες», αλλά εργαλεία διερεύνησης: μας βοηθούν να δούμε πώς κατανέμονται τα χωρικά φαινόμενα, να οπτικοποιήσουμε σχέσεις, να εντοπίσουμε πρότυπα και να κατανοήσουμε δυναμικές που δύσκολα διακρίνονται σε έναν πίνακα αριθμών. Όταν ένα φαινόμενο έχει χωρική διάσταση, η χαρτογραφική του απόδοση συχνά είναι απαραίτητη για να αναλυθεί ουσιαστικά.
Ενδεικτικά, βασικές (ευρείες) κατηγορίες γεωγραφικών φαινομένων που μελετώνται μέσω χαρτών είναι:
Χωροθέτηση (Location) – πού βρίσκεται κάτι.
Κατανομή (Distribution) – πώς κατανέμονται τιμές ή γεγονότα στον χώρο.
Περιφερειοποίηση (Regions) – ομαδοποίηση περιοχών με κοινά χαρακτηριστικά.
Συνδέσεις / Συσχετίσεις (Association) – σχέσεις μεταξύ φαινομένων σε διαφορετικές θέσεις.
Κινήσεις / Ροές (Movement / Flows) – μετακινήσεις πληθυσμών, αγαθών, πληροφοριών.
Διάχυση (Diffusion) – εξάπλωση φαινομένων στον χώρο και στον χρόνο (π.χ. καινοτομία, ασθένειες).
Κάθε χάρτης είναι ένα σχέδιο του χώρου: μια επιλεκτική, συχνά απλουστευμένη αλλά οργανωμένη αναπαράσταση μιας περιοχής σε δύο διαστάσεις. Όπως κάθε διάγραμμα, έτσι και ο χάρτης αποτελείται από βασικά γραφικά στοιχεία, τα οποία η γεωμετρία ορίζει με σαφήνεια και είναι περιορισμένα σε αριθμό:
Σημείο
Γραμμή
Πολύγωνο
Πάνω σε αυτά χτίζονται όλες οι χαρτογραφικές απεικονίσεις. Ενδεικτικά:
Τα σημεία χρησιμοποιούνται για να δείξουν θέσεις, π.χ. ξενοδοχεία, σταθμούς, πόλεις.
Οι γραμμές αποδίδουν γραμμικά στοιχεία, π.χ. οδικό δίκτυο, ποτάμια, σύνορα.
Τα πολύγωνα (κλειστές επιφάνειες) παριστάνουν εκτάσεις με κοινά χαρακτηριστικά, π.χ. διοικητικές ενότητες, χρήσεις γης, περιφέρειες NUTS.
Στη σύγχρονη χαρτογραφία και στα Συστήματα Γεωγραφικών Πληροφοριών
(GIS) -καθώς και στη R με sf και tmap-, κάθε
χωρικό αντικείμενο που εμφανίζεται σε έναν χάρτη είναι, στην ουσία, ένα
από αυτά τα τρία βασικά γεωμετρικά “δομικά υλικά”.
Ο τύπος των δεδομένων καθορίζει σε μεγάλο βαθμό πώς πρέπει να τα χαρτογραφήσουμε και ποιο συμβολισμό να επιλέξουμε. Δεν “ταιριάζουν” όλα τα σύμβολα σε όλα τα δεδομένα: άλλο τρόπο θέλει μια κατηγορία (π.χ. τύπος περιφέρειας) και άλλο ένας αριθμητικός δείκτης (π.χ. ΑΕΠ κατά κεφαλή). Σε γενικές γραμμές, μπορούμε να ξεχωρίσουμε τις εξής βασικές κατηγορίες:
Ποιοτικά (κατηγορικά/ονομαστικά) δεδομένα
Κάθε τιμή αντιστοιχεί σε κατηγορία χωρίς εσωτερική σειρά.
Παράδειγμα: τύπος περιφέρειας: νησιωτική, ορεινή,
πεδινή.
Ιεραρχικά / διατεταγμένα (ordinal)
δεδομένα
Οι τιμές δηλώνουν τάξη/βαθμίδα με φυσική σειρά, αλλά όχι απαραίτητα ίσα
διαστήματα.
Παράδειγμα: ποιότητα εδάφους: κακή – μέτρια – καλή.
Ποσοτικά – συνεχής μεταβλητή
Τιμές σε συνεχές φάσμα.
Παράδειγμα: θερμοκρασία, ποσοστό ανεργίας, δείκτης ΑΕΠ κατά
κεφαλή.
Ποσοτικά – διακριτές τιμές / μέτρηση
(count)
Τιμές που εκφράζουν πλήθος ή άθροισμα.
Παράδειγμα: πληθυσμός, συνολικό ΑΕΠ, αριθμός
επιχειρήσεων.
Η σωστή διαχείριση των δεδομένων είναι βασικό βήμα πριν φτιάξουμε χάρτη: εξασφαλίζει ότι ο συμβολισμός “λέει την αλήθεια” και δεν παραπλανά τον αναγνώστη.
Οι τρόποι παρουσίασης αποτελούν το κρίσιμο “σύνδεσμο” ανάμεσα στη σημειωτική και τη χαρτογραφία: είναι ο μηχανισμός με τον οποίο οι αριθμοί και οι κατηγορίες μετατρέπονται σε οπτική πληροφορία. Ο Jacques Bertin (1983) ήταν ο πρώτος που οργάνωσε συστηματικά αυτή τη λογική, διατυπώνοντας μια σημειολογική θεωρία των γραφικών παραστάσεων. Σύμφωνα με αυτήν, ένα σύμβολο στον χάρτη μπορεί να μεταφέρει διαφορετικά νοήματα μεταβάλλοντας συγκεκριμένα οπτικά χαρακτηριστικά – τις λεγόμενες οπτικές μεταβλητές.
Τα βασικά οπτικά/χαρτογραφικά “δομικά στοιχεία” που χρησιμοποιούνται για να διαφοροποιήσουμε τα σύμβολα και να κωδικοποιήσουμε διαφορετικού τύπου δεδομένα είναι:
Σχήμα: διαφοροποίηση κατηγοριών (π.χ. διαφορετικά εικονίδια για διαφορετικά είδη δραστηριοτήτων).
Απόχρωση (Hue): διάκριση ποιοτικών κατηγοριών ή ομάδων.
Τιμή (Value / φωτεινότητα): διαβάθμιση έντασης, συχνά για ποσοτικά δεδομένα.
Μέγεθος: απόδοση ποσοτικών διαφορών (αναλογικά σύμβολα).
Πυκνότητα / υφή χρώματος: ενίσχυση της αίσθησης “περισσότερο–λιγότερο” σε περιοχές.
Προσανατολισμός: υποδήλωση κατεύθυνσης ή τάσης (π.χ. ροές, επικρατούσα διεύθυνση)
Η σωστή αντιστοίχιση τύπου δεδομένων και οπτικής μεταβλητής είναι θεμελιώδης: εξασφαλίζει ότι ο χάρτης είναι όχι μόνο αισθητικά ευχάριστος, αλλά και νοηματικά σαφής και ερμηνεύσιμος.
Ο τύπος της μεταβλητής δεν είναι τυπική λεπτομέρεια· καθορίζει ποια οπτική μεταβλητή είναι κατάλληλη για τη χαρτογραφική της απόδοση. Με βάση τη σημειολογική προσέγγιση (Bertin), ενδεικτικά:
Ποιοτικά (ονομαστικά) δεδομένα
Παράδειγμα: τύπος περιφέρειας (νησιωτική, ορεινή,
πεδινή).
Κατάλληλες οπτικές μεταβλητές:
Απόχρωση (διαφορετικά χρώματα)
Σχήμα (διαφορετικά εικονίδια)
Υφή / μοτίβο
→ Στόχος: καθαρή διάκριση κατηγοριών, χωρίς αίσθηση τάξης ή
μεγέθους.
Ιεραρχικά / διατεταγμένα δεδομένα
(ordinal)
Παράδειγμα: ποιότητα εδάφους (κακή–μέτρια–καλή).
Κατάλληλες οπτικές μεταβλητές:
Τιμή (ανοιχτό → σκούρο του ίδιου χρώματος)
Πυκνότητα / ένταση χρώματος
→ Στόχος: να φαίνεται η σειρά/βαθμίδα, χωρίς να επιδιώκονται ακριβείς
αριθμητικές διαφορές.
Ποσοτικά δεδομένα – συνεχείς τιμές
Παράδειγμα: ποσοστό ανεργίας, δείκτης ΑΕΠ κατά κεφαλή.
Κατάλληλες οπτικές μεταβλητές:
Τιμή (φωτεινότητα) ή συνεχής κλίμακα απόχρωσης (gradients)
Γραμμική ή ταξινομημένη διαβάθμιση σε choropleth
→ Στόχος: ανάδειξη προτύπων υψηλών/χαμηλών τιμών και χωρικών
τάσεων.
Ποσοτικά δεδομένα – διακριτές τιμές / μετρήσεις (counts,
totals)
Παράδειγμα: πληθυσμός, συνολικό ΑΕΠ, αριθμός
επιχειρήσεων.
Κατάλληλες οπτικές μεταβλητές:
Μέγεθος συμβόλου (αναλογικοί κύκλοι)
Ύψος στηλών σε χαρτογράμματα
Εναλλακτικά, κλάσεις σε χωροπληθείς χάρτες (choropleth)
μόνο όταν έχει νόημα
→ Στόχος: να αποδοθούν καθαρά οι διαφορές μεγέθους, χωρίς να
μπερδεύονται με ποιοτικές κατηγορίες.
Με λίγα λόγια:
διαφορετικός τύπος δεδομένων →διαφορετική οπτική μεταβλητή
→διαφορετικός τύπος θεματικού χάρτη
Αυτό είναι και το θεωρητικό υπόβαθρο πίσω από τις επιλογές που κάνουμε στη συνέχεια με την περιγραφή των παραδειγμάτων χαρτογράφησης.
Η χαρτογράφηση ποσοτικών μεταβλητών βασίζεται στην ιδέα ότι δεν μπορούμε (και δεν χρειάζεται) να δείξουμε κάθε αριθμητική τιμή ξεχωριστά. Αντί γι’ αυτό, ομαδοποιούμε τις τιμές σε κλάσεις, ώστε ο χάρτης να αναδεικνύει τη γενική δομή και τα χωρικά πρότυπα του φαινομένου, όχι την ιδιαιτερότητα κάθε μεμονωμένης περίπτωσης. Στόχος της θεματικής χαρτογραφίας δεν είναι να αντικαταστήσει έναν αναλυτικό πίνακα δεδομένων, αλλά να βοηθήσει τον αναγνώστη να “δει” πώς κατανέμεται το φαινόμενο στον χώρο.
Η ποιότητα ενός θεματικού χάρτη ποσοτικών δεδομένων εξαρτάται κυρίως από δύο κρίσιμες επιλογές:
το γεωγραφικό επίπεδο αναφοράς, δηλαδή σε ποιες χωρικές ενότητες (χώρες, περιφέρειες, Δήμους, NUTS-2 κ.λπ.) θα χωρίσουμε τον χώρο, και
τον τρόπο ταξινόμησης των τιμών σε κλάσεις, δηλαδή πόσες κλάσεις θα χρησιμοποιήσουμε και με ποια όρια.
Κάθε τέτοια επιλογή είναι ένας συμβιβασμός: χάνουμε μέρος της λεπτομέρειας, αλλά κερδίζουμε καθαρότερη εικόνα της βασικής χωρικής δομής (πρότυπο/μοτίβο, pattern). Ένας προσεκτικά σχεδιασμένος χάρτης πετυχαίνει ακριβώς αυτόν τον συμβιβασμό, κάνοντας τις χωρικές διαφοροποιήσεις ευδιάκριτες χωρίς να διαστρεβλώνει την πληροφορία.
Ο χάρτης δεν είναι μόνο η απεικόνιση ενός τμήματος της γήινης επιφάνειας σε χαρτί ή οθόνη. Είναι ένα ολοκληρωμένο επικοινωνιακό προϊόν, το οποίο πρέπει να προσφέρει στον αναγνώστη όλα τα απαραίτητα στοιχεία για να κατανοήσει σωστά την πληροφορία που παρουσιάζεται.
Βασικά συστατικά ενός καλά σχεδιασμένου χάρτη είναι συνήθως:
Τίτλος – περιγράφει με σαφήνεια τι δείχνει ο χάρτης (τι, πού, πότε).
Υπόμνημα (legend) – εξηγεί τα σύμβολα, τα χρώματα, τις κλάσεις τιμών.
Κλίμακα – δείχνει τη σχέση χάρτη–πραγματικότητας (γραμμική ή αριθμητική).
Κυρίως χάρτης – η οπτική αναπαράσταση του φαινομένου.
Πληροφορίες προβολής και συστήματος αναφοράς – όπου είναι απαραίτητες.
Πηγές δεδομένων & δημιουργός – για διαφάνεια, τεκμηρίωση και αναπαραγωγιμότητα.
Προαιρετικά: πυξίδα/βέλος βορρά, ένθετοι χάρτες (insets), σημειώσεις.
Ο συνδυασμός αυτών των στοιχείων, σε ισορροπημένη διάταξη, είναι κρίσιμος ώστε ο χάρτης να είναι όχι μόνο αισθητικά άρτιος, αλλά και σαφής, αξιόπιστος και λειτουργικός για τον χρήστη.
Στο περιβάλλον της R, τα πακέτα (R packages) αποτελούν τον βασικό τρόπο επέκτασης της γλώσσας. Κάθε πακέτο είναι μια οργανωμένη συλλογή από συναρτήσεις, σύνολα δεδομένων και τεκμηρίωση, που εγκαθίσταται μία φορά και φορτώνεται όποτε χρειάζεται. Με αυτόν τον τρόπο προσθέτουμε εξειδικευμένα εργαλεία για στατιστική ανάλυση, χειρισμό χωρικών δεδομένων, χαρτογράφηση, διαδραστική απεικόνιση κ.ά., χωρίς να “εφευρίσκουμε τον τροχό”.
Στο συγκεκριμένο παράδειγμα χρησιμοποιούμε τα παρακάτω πακέτα που καλύπτουν ολόκληρη τη ροή εργασίας:
eurostat: απευθείας λήψη στατιστικών δεδομένων από την Eurostat.
giscoR: πρόσβαση σε επίσημα γεωχωρικά σύνολα (GISCO) για όρια χωρών και NUTS.
sf: σύγχρονη διαχείριση χωρικών δεδομένων (σημεία, γραμμές, πολύγωνα) σε μορφή πίνακα.
dplyr: σαφής διαχείριση δεδομένων (επιλογή, ένωση..).
tmap: παραγωγή στατικών και διαδραστικών θεματικών χαρτών.
Η σωστή προετοιμασία (έλεγχος–εγκατάσταση–φόρτωση πακέτων στην αρχή του 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))
Για την επιλογή των δεδομένων χρησιμοποιούμε τις συναρτήσεις του
πακέτου eurostat:
search_eurostat() για να εντοπίσουμε ποιά σειρά
δεδομένων (dataset) μας ενδιαφέρει (π.χ. αναζήτηση “GDP per capita” ή
“regional gdp”).
get_eurostat(code, ...) για να κατεβάσουμε το
dataset με βάση τον επίσημο κωδικό του (π.χ.
nama_10r_2gdp).
προαιρετικά filters = list(...) μέσα στο
get_eurostat() για να περιορίσουμε εξ αρχής τις επιλογές
(π.χ. συγκεκριμένη μονάδα ή έτος).
label_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 + τιμή). Η χαρτογράφηση απαιτεί ένωση με τα γεωμετρικά όρια.
Για να διασφαλίσουμε ότι οι χάρτες μας βασίζονται σε επίσημα και συνεπή χωρικά δεδομένα, αξιοποιούμε τα σύνολα ορίων που παρέχονται από επίσημες πηγές Η GISCO (Geographic Information System of the Commission) αποτελεί την επίσημη γεωχωρική υποδομή της Ευρωπαϊκής Επιτροπής. Μέσω της GISCO παρέχονται:
Η συνάρτηση get_eurostat_geospatial() του πακέτου
eurostat μας επιτρέπει να κατεβάζουμε απευθείας
γεωχωρικά δεδομένα (πολύγωνα, όρια) από την GISCO σε μορφή
sf. Η συνάρτηση get_eurostat_geospatial() δεν
προορίζεται για πλήρη περιήγηση σε όλα τα διαθέσιμα χαρτογραφικά
δεδομένα της Eurostat, αλλά εστιάζει στην παροχή τυποποιημένων
γεωμετριών (όπως τα επίπεδα NUTS) σε συγκεκριμένα έτη, κλίμακες και
συστήματα αναφοράς, διευκολύνοντας την άμεση σύνδεσή τους με στατιστικά
δεδομένα. Οι βασικές επιλογές είναι οι παρακάτω:
nuts_level:
[0] = χώρες (NUTS-0), [1, 2,
3 ]= ενότητες αντίστοιχου επιπέδουyear: έκδοση NUTS (π.χ. 2021 για NUTS
2021)resolution: λεπτομέρεια ορίων (π.χ. "60"
πιο “ελαφρύ”, "20" πιο λεπτομερές)crs: σύστημα συντεταγμένων (π.χ. 4326
γεωγραφικό, 3035 ευρωπαϊκή προβολή)output_class: συνήθως "sf"Στο παράδειγμά μας, φορτώνουμε τα επίσημα όρια 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) που:
NUTS_ID, όνομα περιφέρειας, χώρα, τιμές δεικτών
κ.λπ.),geom ή geometry), όπου
αποθηκεύονται τα σχήματα:
Μαζί με τη γεωμετρία, κάθε αντικείμενο sf γνωρίζει και
το σύστημα αναφοράς συντεταγμένων (CRS) που
χρησιμοποιεί (π.χ. EPSG:4326, EPSG:3035), κάτι
που είναι κρίσιμο για σωστή απεικόνιση και χωρικές πράξεις.
Πλεονέκτημα της μορφής sf:
dplyr,
tidyr),tmap και
ggplot2,Η συνάρτηση gisco_get_countries() του πακέτου
giscoR λειτουργεί συμπληρωματικά στη συνάρτηση
get_eurostat_geospatial(), καθώς μας επιτρέπει να
κατεβάζουμε επίσημα γεωμετρικά όρια χωρών (state boundaries) από τη
GISCO, με έλεγχο σε:
σύστημα αναφοράς (epsg / crs),
επίπεδο γενίκευσης (resolution),
γεωγραφική περιοχή (π.χ.
region = "Europe").
Στο παράδειγμά μας τη χρησιμοποιούμε για να προσθέσουμε ως υπόβαθρο τις γειτονικές χώρες εκτός ΕΕ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()
Σχόλιο
Με την παραπάνω διαδικασία εξασφαλίζουμε ότι χώρες όπως Νορβηγία, Ελβετία, Ην. Βασίλειο, Τουρκία κ.λπ. εμφανίζονται σωστά ως υπόβαθρο.
Στο παράδειγμά μας, χρησιμοποιούμε το θεματικό επίπεδο 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
x) και έναν δεξιό (y).Με την εντολή left_join(x, y, by = ...):
Διατηρούνται όλες τις γραμμές του x
(αριστερού πίνακα). Για κάθε γραμμή του x, ψάχνεις στον
y γραμμές που ταιριάζουν στο/στα πεδίο(κλειδί)/α που
δήλωσες στο by.
Αν βρεθεί ταίριασμα:
y προστίθενται σε αυτή τη γραμμή
του πίνακα x.Αν δεν βρεθεί:
y συμπληρώνονται με
NA.Ο αριθμός γραμμών του πίνακα x δεν
αλλάζει.
Τα πεδία (κλειδιά) μπορεί:
είτε να έχουν το ίδιο όνομα και στους δύο πίνακες: left_join(x, y, by = “code”)
είτε να έχουν διαφορετικά ονόματα, οπότε το
δηλώνεται έτσι: left_join(x, y, by = c(“NUTS_ID” = “geo”), δηλαδή: οι
τιμές της στήλης NUTS_ID του πίνακα x
“ταιριάζουν” με τις τιμές της στήλης geo του πίνακα
y.
Για τις ανάγκες του συγκεκριμένου οδηγού θα χρησιμοποιήσουμε το
πακέτο tmap. Το tmap συνιστά μια εξειδικευμένη
βιβλιοθήκη της R για θεματική χαρτογραφία, σχεδιασμένη
ώστε να κάνει την παραγωγή χαρτών με χωρικά δεδομένα όσο γίνεται πιο
δομημένη, αναγνώσιμη και αναπαράξιμη – ιδανική για διδασκαλία και
επιστημονική χρήση.
Βασίζεται σε μια λογική παρόμοια με το “grammar of graphics”: κάθε χάρτης χτίζεται βήμα-βήμα με Θεματικά επίπεδα (layers). Ξεκινάμε πάντα με:
tm_shape(δεδομένα) για να δηλώσουμε ποιο χωρικό
αντικείμενο θα χαρτογραφήσουμε (π.χ. polygons NUTS-2),και στη συνέχεια προσθέτουμε επίπεδα αναπαράστασης, όπως:
tm_polygons() για πολύγωνα (π.χ. χρωματισμός
περιφερειών ανά τιμή δείκτη),tm_symbols() ή tm_bubbles() για
σημειακά/αναλογικά σύμβολα,tm_lines() για γραμμές (π.χ. δίκτυα),tm_raster() για χωρικά δεδομένα σε μορφή καννάβουlayout(), tm_scalebar(),
tm_compass(), tm_credits() για στοιχειοθέτηση,
υπόμνημα, κλίμακα, τίτλους, πηγές κ.λπ.Κεντρικό πλεονέκτημα της βιβλιοθήκης tmap είναι ότι
δουλεύει απευθείας με αντικείμενα sf (και
άλλα χωρικές μορφοποιήσεις), επομένως ενσωματώνεται ταχύτατα σε ροή
εργασίας: εισάγουμε/παράγουμε χωρικά δεδομένα ως sf, τα
επεξεργαζόμαστε με dplyr, και τα χαρτογραφούμε με
tmap χωρίς επιπλέον μετατροπές.
Ένα ακόμη ιδιαίτερα χρήσιμο χαρακτηριστικό είναι η ύπαρξη δύο “καταστάσεων λειτουργίας”:
tmap_mode("plot"): παράγει στατικούς χάρτες
υψηλής ποιότητας, κατάλληλους για αναφορές, άρθρα,
presentations, αποθήκευση σε PNG/PDF κ.λπ.
tmap_mode("view"): παράγει διαδραστικούς
χάρτες με δυνατότητα zoom, pan και pop-ups (βασισμένους σε
Leaflet), ιδανικούς για διαδικτυακή παρουσίαση, dashboards ή
εκπαιδευτικές εφαρμογές.
Μεταξύ άλλων το πακέτο tmap υποστηρίζει:
facets (πολλαπλούς χάρτες σε πλέγμα) για σύγκριση ετών ή κατηγοριών,
διακριτές ή συνεχείς κλίμακες χρωμάτων με έλεγχο σε breaks, παλέτες και χειρισμό ελλιπών τιμών,
εύκολη σύνθεση σύνθετων χαρτών με διαφανή υποβάθρα, σύνορα, ετικέτες και θεματικά σύμβολα.
Μπορείτε να βρείτε τεκμηρίωση και παραδείγματα στη σελίδα του πακέτου:
αποθετήριο CRAN: https://cran.r-project.org/package=tmap
Τεκμηρίωση & παραδείγματα: https://r-tmap.github.io/tmap
Στο παρακάτω παράδειγμα παρατίθεται ο κώδικας που κατασκευάζει το βασικό στατικό χωροπλήθη (choropleth) χάρτη του οδηγού που:
ορίζει το παράθυρο προβολής σε ευρωπαϊκή προβολή (ETRS89 / LAEA Europe, EPSG:3035),
σχεδιάζει ως ουδέτερο υπόβαθρο τις γειτονικές χώρες εκτός ΕΕ27,
αποδίδει τις περιφέρειες NUTS-2 της ΕΕ27 ως θεματικό χάρτη (choropleth) με βάση τον δείκτη ΑΕΠ κατά κεφαλή (ΜΑΔ , EU27=100),
προσθέτει τα εθνικά σύνορα (NUTS-0) για έμφαση,
τοποθετεί ετικέτες με τους κωδικούς χωρών, και
διαμορφώνει την σύνθεση του χάρτη με τίτλο, υπόμνημα και βασική αισθητική, ώστε να προκύψει ένας καθαρός, αναγνώσιμος χάρτης αναφοράς για την ΕΕ27.
# ορισμός "παραθύρου προβολής" στο επιλεγμένο σύστημα 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()
Σχόλια για συζήτηση
Ποιες περιφέρειες βρίσκονται στα υψηλότερα/χαμηλότερα επίπεδα; Πώς κατανέμονται γεωγραφικά;
Στο παρακάτω παράδειγμα παρατίθεται ο κώδικας που κατασκευάζει σύνθετο στατικό χωροπληθή χάρτη. Επί της ουσίας εφαρμόζουμε στην πράξη τις αρχές σχεδιασμού που παρουσιάστηκαν στα προηγούμενα κεφάλαια, συνδυάζοντας σε μια ενιαία χαρτογραφική σύνθεση δύο διαφορετικού τύπου πληροφορίες:
Για να το υλοποιήσουμε τεχνικά, χρησιμοποιούμε τη συνάρτηση
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()
Στο παρακάτω παράδειγμα παρατίθεται ο κώδικας που κατασκευάζει τη
διαδραστική εκδοχή του προηγούμενου χάρτη,
χρησιμοποιώντας tmap_mode("view")χωρίς να αλλάξει η βασική
λογική χαρτογράφησης:
κρατά το ίδιο χωρικό πλαίσιο (Ευρώπη σε προβολή 3035) και το ίδιο θεματικό περιεχόμενο: NUTS-2 περιφέρειες της ΕΕ27 με χρωματική κωδικοποίηση του ΑΕΠ κατά κεφαλή (PPS, EU27=100),
αποδίδει τις γειτονικές χώρες εκτός ΕΕ27 ως ουδέτερο γκρι υπόβαθρο,
επιτρέπει μεγέθυνση (zoom) και κύληση (pan) πάνω στον χάρτη,
προσθέτει διαδραστικά αναδυόμενα παράθυρα
(tooltips/popups): με κλικ σε μια περιφέρεια εμφανίζονται το
όνομα (NAME_LATN), ο κωδικός χώρας (CNTR_CODE)
και η τιμή του δείκτη,
ορίζει το αρχικό παράθυρο προβολής και περιορίζει την πλοήγηση
στην ευρύτερη ευρωπαϊκή περιοχή με το
tm_view(bbox = eu_bbox, set_bounds = TRUE) ,
ο τίτλος χρησιμοποιεί <br> για να εμφανιστεί
σε δύο γραμμές στο περιβάλλον HTML.
##ίδια με το προηγούμενο παράδειγμα_________________________________________________
# ορισμός "παραθύρου προβολής" στο επιλεγμένο σύστημα 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), επιλέγοντας με τον δρομέα ενότητες στο χάρτη, για να εντοπίσετε συγκεκριμένες περιφέρειες και να συγκρίνετε τιμές.
Στο παρακάτω παράδειγμα παρατίθεται ο κώδικας που κατασκευάζει έναν πολυχρονικό θεματικό χάρτη με facets (μικροί πολλαπλοί χάρτες σε πλέγμα), ώστε να φανεί η διαχρονική εξέλιξη του δείκτη ΑΕΠ κατά κεφαλή :
Επιλέγονται πολλά έτη (2017–2022) από τα δεδομένα
της Eurostat και δημιουργείται πίνακας με τιμές values για
κάθε συνδυασμό NUTS-2 × έτος.
Οι τιμές ενώνονται (left_join) με τις γεωμετρίες
NUTS-2, ώστε να έχουμε για κάθε περιφέρεια και για κάθε έτος ένα πλήρες
sf αντικείμενο (ένα πολύγωνο με πολλές τιμές- one to many
join).
Ορίζεται κοινό παράθυρο προβολής και ενιαία κλίμακα χρωμάτων, ώστε οι χάρτες να είναι συγκρίσιμοι μεταξύ τους.
Με tm_facets(by = "year", ncol = 3) ο χάρτης “σπάει”
σε πολλαπλά πάνελ: κάθε πάνελ δείχνει τον χάρτη για ένα συγκεκριμένο
έτος.
Το αποτέλεσμα είναι μια σειρά στατικών χαρτών σε πλέγμα, που επιτρέπουν οπτική σύγκριση της χωρικής κατανομής του ΑΕΠ κατά κεφαλή στην ΕΕ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ετία; Ποιες μένουν σταθερά χαμηλά; Πώς διαφοροποιούνται οι ευρύτερες ενότητες κεντρικές περιφερειακές χώρες / Βορράς–Νότος;
Δημιουργήστε χάρτες για άλλα έτη (αλλαγή μεταβλητής intime).
Δοκιμάστε άλλο δείκτη από την Eurostat (π.χ. ανεργία, R&D).
Περάστε τα δεδομένα σε ggplot2 για εναλλακτική χαρτογραφική προσέγγιση.
Χρησιμοποιήστε tmap_mode(“view”) και για τα facets (προσοχή όμως στην απόδοση).