Tworzę mapę Europy z ggplot(). Ponadto mam średnie ceny dla niektórych krajów, przy czym kraje, dla których istnieją średnie, są one kolorowe inaczej (w zależności od poziomu średniej), wszystkie inne kraje są domyślnie kolorowe szare.

Mój kod dla tego wygląda:

library(ggplot2)
library(grid)
library(rworldmap)

## Get the world map: ##
worldMap <- getMap()

## Define vector with all european states: ##
v.europe <- c("Norway", "Sweden", "Finland", "Denmark", "United Kingdom","Ireland", "Greece",
              "Belgium", "Netherlands", "France", "Spain", "Portugal", "Luxembourg", "Croatia",
              "Germany", "Switzerland", "Austria", "Slovenia", "Italy", "Bulgaria", "Romania",
              "Czech Rep.", "Slovakia", "Hungary", "Poland", "Bosnia Hercegovina", "Serbia",
              "Turkey", "Ukraine", "Moldova",  "Belarus", "Estonia", "Latvia", "Lithuania",
              "Montenegro", "Albania", "Macedonia")
              
## Select only the index of statesin europe: ##
indEU <- which(worldMap$NAME%in%v.europe)


## Extract longitude and latitude border's coordinates of states: ##
df.europeCoords <- lapply(indEU, function(i){
    df <- data.frame(worldMap@polygons[[i]]@Polygons[[1]]@coords)
    df$region = as.character(worldMap$NAME[i])
    colnames(df) <- list("long", "lat", "region")
    return(df)
})
df.europeCoords <- do.call("rbind", df.europeCoords)

## Mean values of some of the states in europe: ##
meanGermany <- 33.33
meanAustria <- 35.71
meanNetherlands <- 35.9
meanBelgium <- 34.66
meanFrance <- 34.89
meanItaly <- 43.97
meanHungary <- 43.96
meanCroatia <- 42.54
meanBulgaria <- 54.61
meanGreece <- 25.72
meanNorway <- 27.64
meanSweden <- 36.41
meanFinland <- 32.13
meanDenmark <- 36.83
meanSlovakia <- 35.94
meanCzechia <- 44.15
meanRomania <- 36.52
meanSwitzerland <- 44.12
meanSerbia <- 45.53
meanSlovenia <- 45.1

## Create vector with mean values: ##
v.meanValues <- c('Germany' = meanGermany, 'Austria' = meanAustria, 'Netherlands' = meanNetherlands,
                  'Belgium' = meanBelgium, 'France' = meanFrance, 'Italy' = meanItaly, 'Greece' = meanGreece,
                  'Hungary' = meanHungary, 'Croatia' = meanCroatia, 'Bulgaria' = meanBulgaria,
                  'Norway' = meanNorway, 'Sweden' = meanSweden, 'Finland' = meanFinland, 'Denmark' = meanDenmark,
                  'Slovakia' = meanSlovakia, 'Czech Rep.' = meanCzechia, 'Romania' = meanRomania,  
                  'Serbia' = meanSerbia, 'Slovenia' = meanSlovenia, 'Switzerland' = meanSwitzerland)

## Merge mean values with european countries: ##
df.europeCoords$meanValues <- v.meanValues[match(df.europeCoords$region, names(v.meanValues))]


ax <- list(
  title = "",
  zeroline = FALSE,
  showline = FALSE,
  showticklabels = FALSE,
  showgrid = FALSE
)   
## Plot the map: ##
p <- ggplot() + 
     geom_polygon(data = df.europeCoords, aes(x = long, y = lat, group = region, fill = meanValues,
                                              text = paste("<b>", region, '</b>\n',
                                                           "Price Mean: ", meanValues, "\u20ac")),
                  color = "black", size = 0.1) +
     coord_map(xlim = c(-13, 35),  ylim = c(32, 71)) +
     theme_classic() +
     scale_fill_gradient(name = "Price Mean Values", low = "#81C07A", high = "#007d3c", na.value = "#CCCCCC") +
     theme(axis.text.x = element_blank(), 
           axis.text.y = element_blank(), 
           axis.ticks.x = element_blank(),
           axis.ticks.y = element_blank(), 
           axis.title = element_blank(), 
           legend.position = "none",
           plot.margin = unit(0 * c(-1.5, -1.5, -1.5, -1.5), "lines"),
     )
EuropePlot <- plotly::ggplotly(p, tooltip = "text") %>%
              layout(xaxis = ax, yaxis = ax)

Fabuła wygląda następująco:

enter image description here

Chcę umieścić dostępne wartości średnie (jako numer) w środku odpowiedniego kraju. W jaki sposób mogę to zrobić?

0
Michi 7 październik 2020, 11:02

1 odpowiedź

Najlepsza odpowiedź

Znalazłem dwa rozwiązania, które działa dla mnie:

Rozwiązanie 1:

Stworzyłem plik Excel z regionami i wzdłużami i szerokościami geograficznymi każdego kraju i próbowałem rozwiązać go w następujący sposób:

## Read Excel-file with longitude and latitude of each country: ##
df.longLat <- read_excel("C:/Users/z_kordasch/Documents/fire/server/input_Data/EUROPE_LongitudeLatitude.xlsx", na = "NA")

## Merge mean values to this new data frame: ##
df.longLat$meanValues <- v.meanValues[match(df.longLat$region, names(v.meanValues))]
as.data.frame(df.longLat)

## Add it to plot: ##
p <- p + geom_text(data = df.longLat, aes(long, lat, label = meanValues), size = 2)
EuropePlot <- plotly::ggplotly(p, tooltip = "text") %>%
              layout(xaxis = ax, yaxis = ax)

Rozwiązanie 2:

Obliczyłem średnie wartości wzdłużnych i szerokości geograficznych każdego kraju z następującym kodem:

df.europeCoords <- aggregate(cbind(long, lat) ~ region, data = df.europeCoords, 
                             FUN = function(x)mean(range(x)))

df.europeCoords$meanValues <- v.meanValues[match(df.europeCoords$region, names(v.meanValues))]

p <- p + geom_text(data = df.europeCoords, aes(long, lat, label = meanValues), size = 2)
EuropePlot <- plotly::ggplotly(p, tooltip = "text") %>%
              layout(xaxis = ax, yaxis = ax)
0
Miki 8 październik 2020, 05:26