ggplot2 в сочетании с rworldmap

Я делаю следующее rworldplot:

library(rworldmap)
#> Loading required package: sp
#> ### Welcome to rworldmap ###
#> For a short introduction type :   vignette('rworldmap')
library(RColorBrewer)
test.data <- data.frame(
  country = c('USA','Denmark','Australia','Germany'),
  value = c(4000,1000,2300,100)
)
sPDF <- joinCountryData2Map(test.data,joinCode = "NAME",nameJoinColumn = "country")
#> 4 codes from your data successfully matched countries in the map
#> 0 codes from your data failed to match with a country code in the map
#> 239 codes from the map weren't represented in your data
colourPalette <- brewer.pal(4,'Reds')
mapParams <- mapCountryData(sPDF, nameColumnToPlot="value", colourPalette=colourPalette, catMethod=c(0,500,1000,2300,5000), addLegend=FALSE, mapTitle = 'TEST')
do.call( addMapLegend, c( mapParams
                          , legendLabels="all"
                          , legendWidth=0.5 ))

Для ясности я также хочу добавить гистограмму:

library(ggplot2)
barplot <- ggplot(test.data, aes(x=reorder(country,-value), y = value)) +
  geom_bar(stat='identity', fill = 'darkred') + 
  theme_classic()
barplot

В идеале я хочу объединить сюжет rworldmap и ggplot на одном рисунке, используя, например. grid.arrange или пакет cowplot. Я знаю, что это легко для разных объектов ggplot, однако do.call строит rworldmap напрямую, поэтому я не знаю, как я могу получить слово, подобное grid.arrange(<rworlddmapplot>, barplot).


person CodeNoob    schedule 26.08.2019    source источник


Ответы (1)


Функция plot_grid() из cowplot может принимать аргумент функции, которая рисует график, который вы хотите показать.

library(rworldmap)
#> Loading required package: sp
#> ### Welcome to rworldmap ###
#> For a short introduction type :   vignette('rworldmap')
library(RColorBrewer)

test.data <- data.frame(
  country = c('USA','Denmark','Australia','Germany'),
  value = c(4000,1000,2300,100)
)

draw_map <- function(test.data) {
  function() {
    sPDF <- joinCountryData2Map(test.data,joinCode = "NAME",nameJoinColumn = "country")
    colourPalette <- brewer.pal(4,'Reds')
    mapParams <- mapCountryData(sPDF, nameColumnToPlot="value", colourPalette=colourPalette, catMethod=c(0,500,1000,2300,5000), addLegend=FALSE, mapTitle = 'TEST')
    do.call( addMapLegend, c( mapParams
                          , legendLabels="all"
                          , legendWidth=0.5 ))
  }
}

library(ggplot2)
barplot <- ggplot(test.data, aes(x=reorder(country,-value), y = value)) +
  geom_bar(stat='identity', fill = 'darkred') + 
  theme_classic()

library(cowplot)
#> 
#> ********************************************************
#> Note: As of version 1.0.0, cowplot does not change the
#>   default ggplot2 theme anymore. To recover the previous
#>   behavior, execute:
#>   theme_set(theme_cowplot())
#> ********************************************************

plot_grid(barplot, draw_map(test.data))
#> 4 codes from your data successfully matched countries in the map
#> 0 codes from your data failed to match with a country code in the map
#> 239 codes from the map weren't represented in your data

Создана 26 августа 2019 г. с помощью пакета reprex (v0.3.0)

person Claus Wilke    schedule 26.08.2019