Update app.R
Browse files
app.R
CHANGED
|
@@ -8,7 +8,7 @@ library(cartogram)
|
|
| 8 |
library(ggplot2)
|
| 9 |
library(rnaturalearth)
|
| 10 |
library(rnaturalearthdata)
|
| 11 |
-
library(countrycode)
|
| 12 |
|
| 13 |
# =============================
|
| 14 |
# UI
|
|
@@ -19,7 +19,6 @@ ui <- dashboardPage(
|
|
| 19 |
sidebarMenu(
|
| 20 |
menuItem("Cartogram", tabName = "cartogramTab", icon = icon("globe"))
|
| 21 |
),
|
| 22 |
-
# User input: which representation index to display
|
| 23 |
selectInput(
|
| 24 |
inputId = "indexChoice",
|
| 25 |
label = "Select Representation Index:",
|
|
@@ -35,7 +34,7 @@ ui <- dashboardPage(
|
|
| 35 |
fluidRow(
|
| 36 |
box(
|
| 37 |
width = 12,
|
| 38 |
-
plotOutput("cartogramPlot", height = "
|
| 39 |
)
|
| 40 |
)
|
| 41 |
)
|
|
@@ -51,32 +50,22 @@ server <- function(input, output, session) {
|
|
| 51 |
# ---- Read CSV data and create ISO3 codes ----
|
| 52 |
rankings_data <- reactive({
|
| 53 |
read_csv("CountryRepresentationRankings.csv") %>%
|
| 54 |
-
# Use countrycode to convert the country names to ISO3 codes
|
| 55 |
mutate(iso_a3 = countrycode(Country, origin = "country.name", destination = "iso3c"))
|
| 56 |
})
|
| 57 |
|
| 58 |
# ---- Read/prepare world map shapefile ----
|
| 59 |
world_sf <- reactive({
|
| 60 |
ne_countries(scale = "medium", returnclass = "sf") %>%
|
| 61 |
-
select(name, iso_a3, pop_est, geometry) %>%
|
| 62 |
-
st_transform(crs = "ESRI:54009")
|
| 63 |
})
|
| 64 |
|
| 65 |
-
# ---- Create cartogram ----
|
| 66 |
cartogram_sf <- reactive({
|
| 67 |
-
# Merge your CSV data (for coloring) with Natural Earth polygons via ISO3
|
| 68 |
merged_sf <- world_sf() %>%
|
| 69 |
left_join(rankings_data(), by = "iso_a3")
|
| 70 |
merged_sf <- merged_sf[!is.na(merged_sf$Overall),]
|
| 71 |
-
|
| 72 |
-
# You can choose which variable to use for the cartogram distortion.
|
| 73 |
-
# If you want to size by pop_est, use weight = "pop_est"
|
| 74 |
-
#cartogram_cont(
|
| 75 |
-
#merged_sf,
|
| 76 |
-
#weight = "pop_est",
|
| 77 |
-
#prepare = TRUE)
|
| 78 |
-
#return( cartogram_dorling( merged_sf, weight = "pop_est" ))
|
| 79 |
-
return( merged_sf )
|
| 80 |
})
|
| 81 |
|
| 82 |
# ---- Plot output ----
|
|
@@ -88,8 +77,9 @@ server <- function(input, output, session) {
|
|
| 88 |
|
| 89 |
ggplot(plot_data) +
|
| 90 |
geom_sf(aes_string(fill = index_col), color = "grey20", size = 0.1) +
|
| 91 |
-
scale_fill_viridis_c(option = "D", na.value = "white") +
|
| 92 |
-
|
|
|
|
| 93 |
labs(
|
| 94 |
fill = paste(index_col, "Index"),
|
| 95 |
title = "Country Representation Rankings",
|
|
@@ -97,9 +87,12 @@ server <- function(input, output, session) {
|
|
| 97 |
caption = "Source: Global Leadership Project (GLP) & Natural Earth"
|
| 98 |
) +
|
| 99 |
theme(
|
| 100 |
-
plot.title = element_text(face = "bold"),
|
| 101 |
-
|
| 102 |
-
|
|
|
|
|
|
|
|
|
|
| 103 |
)
|
| 104 |
})
|
| 105 |
}
|
|
@@ -107,4 +100,4 @@ server <- function(input, output, session) {
|
|
| 107 |
# =============================
|
| 108 |
# Launch the Shiny App
|
| 109 |
# =============================
|
| 110 |
-
shinyApp(ui = ui, server = server)
|
|
|
|
| 8 |
library(ggplot2)
|
| 9 |
library(rnaturalearth)
|
| 10 |
library(rnaturalearthdata)
|
| 11 |
+
library(countrycode)
|
| 12 |
|
| 13 |
# =============================
|
| 14 |
# UI
|
|
|
|
| 19 |
sidebarMenu(
|
| 20 |
menuItem("Cartogram", tabName = "cartogramTab", icon = icon("globe"))
|
| 21 |
),
|
|
|
|
| 22 |
selectInput(
|
| 23 |
inputId = "indexChoice",
|
| 24 |
label = "Select Representation Index:",
|
|
|
|
| 34 |
fluidRow(
|
| 35 |
box(
|
| 36 |
width = 12,
|
| 37 |
+
div(style = "height: 80vh;", plotOutput("cartogramPlot", height = "100%"))
|
| 38 |
)
|
| 39 |
)
|
| 40 |
)
|
|
|
|
| 50 |
# ---- Read CSV data and create ISO3 codes ----
|
| 51 |
rankings_data <- reactive({
|
| 52 |
read_csv("CountryRepresentationRankings.csv") %>%
|
|
|
|
| 53 |
mutate(iso_a3 = countrycode(Country, origin = "country.name", destination = "iso3c"))
|
| 54 |
})
|
| 55 |
|
| 56 |
# ---- Read/prepare world map shapefile ----
|
| 57 |
world_sf <- reactive({
|
| 58 |
ne_countries(scale = "medium", returnclass = "sf") %>%
|
| 59 |
+
select(name, iso_a3, pop_est, geometry) %>%
|
| 60 |
+
st_transform(crs = "ESRI:54009") # Mollweide projection
|
| 61 |
})
|
| 62 |
|
| 63 |
+
# ---- Create cartogram (currently a regular map) ----
|
| 64 |
cartogram_sf <- reactive({
|
|
|
|
| 65 |
merged_sf <- world_sf() %>%
|
| 66 |
left_join(rankings_data(), by = "iso_a3")
|
| 67 |
merged_sf <- merged_sf[!is.na(merged_sf$Overall),]
|
| 68 |
+
return(merged_sf) # Regular map; cartogram functions are commented out
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 69 |
})
|
| 70 |
|
| 71 |
# ---- Plot output ----
|
|
|
|
| 77 |
|
| 78 |
ggplot(plot_data) +
|
| 79 |
geom_sf(aes_string(fill = index_col), color = "grey20", size = 0.1) +
|
| 80 |
+
scale_fill_viridis_c(option = "D", na.value = "white") +
|
| 81 |
+
coord_sf(expand = FALSE) +
|
| 82 |
+
theme_void(base_size = 14) +
|
| 83 |
labs(
|
| 84 |
fill = paste(index_col, "Index"),
|
| 85 |
title = "Country Representation Rankings",
|
|
|
|
| 87 |
caption = "Source: Global Leadership Project (GLP) & Natural Earth"
|
| 88 |
) +
|
| 89 |
theme(
|
| 90 |
+
plot.title = element_text(face = "bold", hjust = 0.5),
|
| 91 |
+
plot.subtitle = element_text(hjust = 0.5),
|
| 92 |
+
plot.caption = element_text(hjust = 1),
|
| 93 |
+
plot.margin = unit(c(0, 0, 0, 0), "cm"),
|
| 94 |
+
legend.position = "bottom",
|
| 95 |
+
legend.direction = "horizontal"
|
| 96 |
)
|
| 97 |
})
|
| 98 |
}
|
|
|
|
| 100 |
# =============================
|
| 101 |
# Launch the Shiny App
|
| 102 |
# =============================
|
| 103 |
+
shinyApp(ui = ui, server = server)
|