提问人:Ian Campbell 提问时间:6/16/2020 最后编辑:Ian Campbell 更新时间:9/14/2022 访问量:44427
如何在 ggplot 中为条形图添加阴影、条纹或其他图案或纹理?
How can I add hatches, stripes or another pattern or texture to a barplot in ggplot?
问:
假设我有同时包含序数变量和分类变量的数据:
set.seed(35)
df <- data.frame(Class = factor(rep(c(1,2),times = 80), labels = c("Math","Science")),
StudyTime = factor(sort(sample(1:4, 16, prob = c(0.25,0.3,0.3,0.15), replace = TRUE)),labels = c("<5","5-10","10-20",">20")),
Nerd = factor(sapply(rep(c(0.1,0.3,0.5,0.8),c(30,50,50,30)), function(x)sample(c("Nerd","NotNerd"),size = 1, prob = c(x,1-x))),levels = c("NotNerd","Nerd")))
可以使用 和 with 和(或)美学映射来可视化这些变量之间的关系。ggplot
geom_bar
x
fill
alpha
color
ggplot(data = df, aes(x = Class, fill = StudyTime, alpha = Nerd)) +
geom_bar(position = "dodge", color = "black") +
scale_alpha_manual(values = c(Nerd = 0.5, NotNerd = 1)) +
scale_fill_manual(values = colorRampPalette(c("#0066CC","#FFFFFF","#FF8C00"))(4)) +
labs(x = "Class", y = "Number of Students", alpha = "Nerd?") +
theme(legend.key.height = unit(1, "cm"))
但是,并不理想。更好的替代方法可能是应用条纹或剖面线等图案。alpha
color
10 多年前对这个问题的公认答案是使用颜色,而最受好评的答案(虽然很聪明)使用了 100 多行代码。
这个问题得到了一些赞成,但没有新的答案。
除了添加如下所示的模式之外,还有其他更好的选择吗?
答:
56赞
Ian Campbell
6/16/2020
#1
一种方法是使用 Mike FC 编写的 ggpattern
包(无隶属关系):
library(ggplot2)
#remotes::install_github("coolbutuseless/ggpattern")
library(ggpattern)
ggplot(data = df, aes(x = Class, fill = StudyTime, pattern = Nerd)) +
geom_bar_pattern(position = position_dodge(preserve = "single"),
color = "black",
pattern_fill = "black",
pattern_angle = 45,
pattern_density = 0.1,
pattern_spacing = 0.025,
pattern_key_scale_factor = 0.6) +
scale_fill_manual(values = colorRampPalette(c("#0066CC","#FFFFFF","#FF8C00"))(4)) +
scale_pattern_manual(values = c(Nerd = "stripe", NotNerd = "none")) +
labs(x = "Class", y = "Number of Students", pattern = "Nerd?") +
guides(pattern = guide_legend(override.aes = list(fill = "white")),
fill = guide_legend(override.aes = list(pattern = "none")))
该封装似乎支持许多常见的几何形状。下面是用于将连续变量与分类变量组合的示例:geom_tile
set.seed(40)
df2 <- data.frame(Row = rep(1:9,times=9), Column = rep(1:9,each=9),
Evaporation = runif(81,50,100),
TreeCover = sample(c("Yes", "No"), 81, prob = c(0.3,0.7), replace = TRUE))
ggplot(data=df2, aes(x=as.factor(Row), y=as.factor(Column),
pattern = TreeCover, fill= Evaporation)) +
geom_tile_pattern(pattern_color = NA,
pattern_fill = "black",
pattern_angle = 45,
pattern_density = 0.5,
pattern_spacing = 0.025,
pattern_key_scale_factor = 1) +
scale_pattern_manual(values = c(Yes = "circle", No = "none")) +
scale_fill_gradient(low="#0066CC", high="#FF8C00") +
coord_equal() +
labs(x = "Row",y = "Column") +
guides(pattern = guide_legend(override.aes = list(fill = "white")))
评论
2赞
tjebo
6/27/2020
有趣的包,感谢分享。我个人认为条纹条形图并没有太大帮助,但是在图块上的演示是一个非常有说服力的模式用例,IMO :) +1
3赞
dnlbrky
6/16/2021
隐藏的宝石在这里:使用从填充指南中删除图案guides(fill=guide_legend(override.aes=list(pattern="none")))
3赞
CrunchyTopping
8/5/2021
一些期刊需要黑白图形和图案,而不是在黑白之间填充渐变,如果你想继续使用 ggplot2 来处理图形,这geom_bar_pattern绝对重要。
评论