❝本节来介绍如何使用ggpattern包自定义图案来进行阴影填充。整个过程仅参考,希望对各位观众老爷能有所帮助。❞
加载R包
library(tidyverse)
library(ggsci)
# install.packages("remotes")
#remotes::install_github("coolbutuseless/ggpattern")
library(ggpattern)
library(gapminder)
df <- gapminder %>%
filter(year %in% c(1957,2002,2007), !continent %in% c("Oceania","Africa")) %>%
select(country,year,lifeExp,continent) %>%
mutate(paired = rep(1:(n()/3), each=3), year=factor(year))
# 自定义一个图案填充函数,用于在ggpattern中使用
tiling3_pattern <- function(params, boundary_df, aspect_ratio, legend = FALSE) {
# 使用do.call动态调用patternGrob函数,并直接构建参数列表
do.call(gridpattern::patternGrob, c(
list(pattern = "polygon_tiling", # 设置图案类型为多边形平铺
x = boundary_df$x, # 设置图案的x坐标
y = boundary_df$y, # 设置图案的y坐标
id = boundary_df$id, # 设置图案的ID
prefix = "", # 设置前缀(此处为空)
# 计算平均颜色并设置pattern_fill参数
pattern_fill = c(params$fill, gridpattern::mean_col(params$fill, params$pattern_fill), params$pattern_fill)),
# 从params中提取以"pattern_"开头的参数
as.list(params)[grep("^pattern_", names(params))]
))
}
# 设置ggpattern的图案函数选项
options(ggpattern_geometry_funcs = list(tiling3 = tiling3_pattern))
df %>%
ggplot(aes(year, lifeExp)) + # 设置绘图的aes,包括x轴为年份,y轴为预期寿命
stat_boxplot(aes(ymin = ..lower.., ymax = ..upper..), outlier.shape = NA, width=0.5) + # 绘制箱线图的主体部分
stat_boxplot(geom = "errorbar", aes(ymin = ..ymax..), width=0.2, size=0.35) + # 绘制箱线图的上边缘
stat_boxplot(geom = "errorbar", aes(ymax = ..ymin..), width=0.2, size=0.35) + # 绘制箱线图的下边缘
geom_boxplot_pattern(aes(pattern_type=year, fill=year), # 应用图案填充
pattern = 'tiling3', # 使用自定义的tiling3图案
pattern_angle = 45, # 设置图案角度
pattern_spacing = 0.045, outlier.shape = NA, width=0.5) + # 设置图案间距
facet_wrap(.~continent, nrow=1) + # 按大陆进行面板分割
scale_fill_npg() + # 应用NPG颜色主题
scale_pattern_type_manual(values = c('hexagonal', 'rhombille', 'pythagorean')) + # 手动设置图案类型
labs(x=NULL, y=NULL) + # 移除x轴和y轴的标签
guides(fill=guide_legend(override.aes = list(size=8))) + # 自定义图例
theme_classic() + # 使用经典主题
theme(legend.background = element_blank(), # 移除图例背景
legend.key = element_blank(), # 移除图例键的背景
legend.title = element_blank(), # 移除图例标题
panel.background = element_blank(), # 移除面板背景
panel.grid.major = element_blank(), # 移除主要网格线
panel.grid.minor = element_blank(), # 移除次要网格线
panel.spacing.x=unit(0,"cm"), # 设置面板间的x轴间距
axis.text.x=element_blank(), # 移除x轴文本
axis.ticks.x = element_blank(), # 移除x轴刻度
strip.text = element_text(color="black", face="bold"), # 设置面板标题样式
strip.background = element_rect(fill="grey90", colour = NA), # 设置面板标题背景
plot.background = element_blank(), # 移除绘图背景
plot.margin=unit(c(0.5,0.5,0.5,0.5), units="cm")) # 设置绘图边距