如何将世界地图和饼图合并在一起?

sta*_*tar 0 r ggplot2 scatterpie geom-map

我有两个包含三个变量的数据集。我想在世界地图上将其中一个显示为热图,两个显示为饼图。

我使用了下面的代码,但出现了错误。我想知道如何解决它。

library(ggplot2)
library(scatterpie)

world_map <- map_data("world")
df <- data.frame(Country = c("USA", "Canada", "Mexico"),
                          Cases = c(10, 20, 30))
df_piechart <- data.frame(long = c(-95, -110, -75),
                                   lat = c(37, 60, 20),
                                   size = c(5, 10, 15),
                                   Group1 = c(20, 30, 50),
                                   Group2 = c(30, 40, 30))

ggplot() +
 geom_map(dat = world_map, map = world_map, aes(map_id = region), color = "white", fill = "#d3d4d3", linewidth = 0.5, alpha=0.4 ) +
 geom_map(dat = df, map = world_map, aes(map_id = Country, fill = Cases), linewidth = 0.5) +
 scale_fill_gradient(low = "skyblue", high = "dodgerblue4", name = "Avian Cases") +
 geom_map(dat = world_map, map = world_map, aes(map_id = region), color = "white", fill = "#d3d4d3", linewidth = 0.5, alpha=0.0 ) +
 expand_limits(x = world_map$long, y = world_map$lat) +
 geom_scatterpie(data = df_piechart, aes(x = long, y = lat, r = size),
                          cols = colnames(df_piechart[, c(4:5)]), alpha = 0.8) +
theme(legend.text = element_text(size = 8, family = "serif"),
    legend.title = element_text(size = 8, face = "bold", family = "serif"),
    legend.key.height = unit(0.2, 'cm'), 
    legend.key.width = unit(0.2, 'cm')) +
theme_void()
Run Code Online (Sandbox Code Playgroud)

错误:

Error in `train_discrete()`:
! Continuous value supplied to a discrete scale
Run Code Online (Sandbox Code Playgroud)

r2e*_*ans 6

fill=(动态)在其他层美学中的使用正在被打破geom_scatterpie2021 年, https://github.com/ericpante/marmap/issues/20#issuecomment-796591190对此进行了讨论,并指出

该错误来自于您为底图图块提供的填充调色板(此处,这是一个连续变量:对于每个深度值,都有一个关联的颜色)与用于饼图的填充颜色(在这里,这是一个离散变量:对于因子的每个级别(合法或非法),都会使用填充颜色)。

(请注意,该问题的作者将相同的问题交叉发布到多个包中,因此我链接的此评论位于不同的包中。作者在scatterpie#31scatterpie中链接到问题。)

有两个选择:(1) 放弃您想要的fill=美观,或 (2) 添加ggnewscale::add_scale_fill()并继续使用您现有的代码。

  1. fill=Cases在第二个中删除geom_mapscale_fill_gradient然后你可以绘制它(尽管可能不是你想要的):

    gg <- ggplot() +
     geom_map(dat = world_map, map = world_map, aes(map_id = region), color = "white", fill = "#d3d4d3", linewidth = 0.5, alpha=0.4 ) +
     geom_map(dat = df, map = world_map, aes(map_id = Country), linewidth = 0.5) + # , fill = Cases
     # scale_fill_gradient(low = "skyblue", high = "dodgerblue4", name = "Avian Cases") +
     geom_map(dat = world_map, map = world_map, aes(map_id = region), color = "white", fill = "#d3d4d3", linewidth = 0.5, alpha=0.0 ) +
     expand_limits(x = world_map$long, y = world_map$lat) +
     geom_scatterpie(data = df_piechart, aes(x = long, y = lat, r = size),
                              cols = colnames(df_piechart[, c(4:5)]), alpha = 0.8) +
     theme(legend.text = element_text(size = 8, family = "serif"),
        legend.title = element_text(size = 8, face = "bold", family = "serif"),
        legend.key.height = unit(0.2, 'cm'), 
        legend.key.width = unit(0.2, 'cm')) +
     theme_void()
    
    gg
    
    Run Code Online (Sandbox Code Playgroud)

    在此输入图像描述

  2. 使用ggnewscale(或其他一些允许您拥有多个色阶的包)并使用add_new_fill(),如

    gg <- ggplot() +
     geom_map(dat = world_map, map = world_map, aes(map_id = region), color = "white", fill = "#d3d4d3", linewidth = 0.5, alpha=0.4 ) +
     geom_map(dat = df, map = world_map, aes(map_id = Country, fill = Cases), linewidth = 0.5) +
     scale_fill_gradient(low = "skyblue", high = "dodgerblue4", name = "Avian Cases") +
     ggnewscale::new_scale_fill() +
     geom_map(dat = world_map, map = world_map, aes(map_id = region), color = "white", fill = "#d3d4d3", linewidth = 0.5, alpha=0.0 ) +
     expand_limits(x = world_map$long, y = world_map$lat) +
     geom_scatterpie(data = df_piechart, aes(x = long, y = lat, r = size),
                              cols = colnames(df_piechart[, c(4:5)]), alpha = 0.8) +
     theme(legend.text = element_text(size = 8, family = "serif"),
        legend.title = element_text(size = 8, face = "bold", family = "serif"),
        legend.key.height = unit(0.2, 'cm'), 
        legend.key.width = unit(0.2, 'cm')) +
     theme_void()
    
    gg
    
    Run Code Online (Sandbox Code Playgroud)

    与 ggnewscale

旁注,您应该添加coord_quickmap()以便保留正确的比例,

gg + coord_quickmap()
Run Code Online (Sandbox Code Playgroud)

固定比率