如何解决如何通过ggplot2中的构面对图例进行分组或获取单独的图例
我有一个数据集,该数据集按区域进行了分面显示,然后使用子区域作为填充。我已经使用与子区域名称相关的单独的命名变量定义了颜色。我想知道是否可以将图例本身以类似于构面的方式进行分组,以使其更易于解释。
命名的sub_region变量
sub_region_colours <- c("South America" = "#0570b0","Western Africa" = "#8c96c6","Central America" = "#74a9cf","Eastern Africa" = "#8856a7","Northern Africa" = "#edf8fb","Middle Africa" = "#b3cde3","Southern Africa" = "#810f7c","Northern America" = "#f1eef6","Caribbean" = "#bdc9e1","Eastern Asia" = "#bd0026","Southern Asia" = "#fd8d3c","South-Eastern Asia" = "#f03b20","Southern Europe" = "#238b45","Australia and New Zealand" = "#ce1256","Melanesia" = "#df65b0","Micronesia" = "#d7b5d8","Polynesia" = "#f1eef6","Central Asia" = "#fecc5c","Western Asia" = "#ffffb2","Eastern Europe" = "#66c2a4","Northern Europe" = "#edf8fb","Western Europe" = "#b2e2e2","Small Islands" = "#252525")
这是按sender_iso3分组的头(exporting_countries),已删除年份和sender_region。
structure(list(sender_iso3 = c("ABW","ABW","ABW"),year = c(2005,2011,2014,2015,2016,2017),sender_region = c("Americas","Americas","Americas"),sender_subregion = c("Caribbean","Caribbean","Caribbean"),export = c(1,1,4,5,2,1)),class = "data.frame",row.names = c(NA,-6L
))
最后这是当前情节的代码
geom_bar()+
labs(title = "Number of countries reporting export of chickens",fill = "Subregion")+
facet_wrap(~ sender_region)+
theme_minimal()+
scale_x_continuous(name = "Year",limits = c(1986,breaks = c(1986,1990,2000,2010,guide = guide_axis(angle = 90))+
scale_fill_manual(values = sub_region_colours)+
guides(fill = guide_legend(ncol = 2))
此刻产生的是
Graph with less than ideal legend
如果我可以将图例填充颜色与刻面类似地进行分组,那将是一件很棒的事情,这将使其更易于阅读。
解决方法
一种实现此目的的方法是为每个区域绘制单独的图,并使用patchwork
将图粘合在一起。第二种方法是利用ggnewscale
软件包,该软件包允许在一个图中具有多个填充(或...)比例和图例。
但是,类似于使用patchwork
的方法和使用ggnewscale
包的方法可能会变得有些乏味,因为它需要根据构面数拆分数据并通过单独的图层绘制每个数据集。因此,我的解决方案添加了一个辅助函数,该函数1)分割数据并为每个区域或构面设置图层,然后2)可用于通过例如lapply
。
顺便说一句:由于您的样本数据仅包含一个区域,因此我添加了第二个区域。
library(dplyr)
library(ggplot2)
library(ggnewscale)
sub_region_colours <- c("South America" = "#0570b0","Western Africa" = "#8c96c6","Central America" = "#74a9cf","Eastern Africa" = "#8856a7","Northern Africa" = "#edf8fb","Middle Africa" = "#b3cde3","Southern Africa" = "#810f7c","Northern America" = "#f1eef6","Caribbean" = "#bdc9e1","Eastern Asia" = "#bd0026","Southern Asia" = "#fd8d3c","South-Eastern Asia" = "#f03b20","Southern Europe" = "#238b45","Australia and New Zealand" = "#ce1256","Melanesia" = "#df65b0","Micronesia" = "#d7b5d8","Polynesia" = "#f1eef6","Central Asia" = "#fecc5c","Western Asia" = "#ffffb2","Eastern Europe" = "#66c2a4","Northern Europe" = "#edf8fb","Western Europe" = "#b2e2e2","Small Islands" = "#252525")
d <- structure(list(sender_iso3 = c(
"ABW","ABW","ABW"
),year = c(
2005,2011,2014,2015,2016,2017,2005,2017
),sender_region = c(
"Americas","Americas","Africa","Africa"
),sender_subregion = c(
"Caribbean","Caribbean","Southern Africa","Southern Africa"
),export = c(
1,1,4,5,2,1
)),class = "data.frame",row.names = c(NA,-12L))
regions <- unique(d$sender_region)
# Layers for each region
make_layers <- function(x) {
d <- filter(d,sender_region == regions[[x]])
list(
if (x != 1) new_scale_fill(),geom_bar(data = d,aes(x = year,fill = sender_subregion)),scale_fill_manual(
values = sub_region_colours,guide = guide_legend(
order = x,title = regions[x],title.position = "top"
)
)
)
}
p <- ggplot() +
lapply(seq_along(regions),make_layers)
# Add theme and wrap
p +
theme_minimal() +
scale_x_continuous(
name = "Year",limits = c(1986,2017),breaks = c(1986,1990,2000,2010,guide = guide_axis(angle = 90)
) +
facet_wrap(~sender_region)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。