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)
fill=(动态)在其他层美学中的使用正在被打破geom_scatterpie。2021 年, https://github.com/ericpante/marmap/issues/20#issuecomment-796591190对此进行了讨论,并指出
该错误来自于您为底图图块提供的填充调色板(此处,这是一个连续变量:对于每个深度值,都有一个关联的颜色)与用于饼图的填充颜色(在这里,这是一个离散变量:对于因子的每个级别(合法或非法),都会使用填充颜色)。
(请注意,该问题的作者将相同的问题交叉发布到多个包中,因此我链接的此评论位于不同的包中。作者在scatterpie#31scatterpie中链接到该问题。)
有两个选择:(1) 放弃您想要的fill=美观,或 (2) 添加ggnewscale::add_scale_fill()并继续使用您现有的代码。
fill=Cases在第二个中删除geom_map,scale_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)
使用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)
旁注,您应该添加coord_quickmap()以便保留正确的比例,
gg + coord_quickmap()
Run Code Online (Sandbox Code Playgroud)