ggplot2:为彩色条形图和图例添加不同的纹理[重复]

Posted

技术标签:

【中文标题】ggplot2:为彩色条形图和图例添加不同的纹理[重复]【英文标题】:ggplot2: Add Different Textures to Colored Barplot and Legend [duplicate] 【发布时间】:2019-06-03 05:35:51 【问题描述】:

基于 ggplot2 包,我想为条形图的不同条形添加不同的纹理。此外,我想将这些纹理添加到条形图的图例中。

考虑以下可重现的示例:

# Create example data
data_ggp <- data.frame(category = rep(c("cat1", "cat2", "cat3"), 4),
                       values = c(0.664, 0.045, 0.291, 0.482, 0.029, 0.489, 0.537, 0.027, 0.436, 0.536, 0.028, 0.436),
                       group = c(rep("group1a", 3), rep("group1b", 3), rep("group2a", 3), rep("group2b", 3)))

# Load ggplot2
library("ggplot2")

# Draw barchart (not overlayed)
ggplot(data_ggp, aes(category, values)) + 
  geom_bar(stat = "identity", aes(fill = group), position = "dodge") +
  scale_fill_manual(" ", 
                    labels = c("group1a", "group1b", "group2a", "group2b"),
                    values = c("group1a" = "deepskyblue4", "group1b" = "darkolivegreen4", 
                               "group2a" = "deepskyblue1", "group2b" = "darkolivegreen2"))

对于这个条形图,我想在 2a 组中绘制对角线,在 2b 组中绘制垂直 + 水平线。图例也应该包含这些纹理。

最终的条形图应如下所示(用油漆绘制):

我在堆栈溢出时发现了一个比较老的线程:How to add texture to fill colors in ggplot2?

不幸的是,这段代码非常复杂,没有自动化,并且难以应用于不同类型的条形图。此外,我想将纹理添加到我的图例中。

问题:如何在条形图的不同条形+条形图的图例中添加不同的纹理?

【问题讨论】:

在链接的帖子中查看 Hadley 的答案。好像还没有更新。因此,您最好的选择是该功能,无论它多么复杂。也许尝试重构它? 也许是这个? cran.r-project.org/web/packages/patternplot/patternplot.pdf @NelsonGon 你有没有看到我在我的问题中提到了这个线程?另一个线程有一个非常非自动化的代码,它也没有显示如何向图例添加纹理。 Check Hadley 的答案是从 2010 年开始的,所以从那时起可能会有更新。 查看我对哈德利回答的评论?那是去年。没有更新。去年年底我自己想到了这个。 @IanCampbell 非常感谢你给我看这个。事实上,ggpattern 包给我留下了深刻的印象,因此我在我的网站上创建了一个关于该包的教程。如果您有兴趣,可以在这里查看:statisticsglobe.com/ggpattern-r-package 【参考方案1】:

我可以使用 ggpattern 解决这个问题

# remotes::install_github("coolbutuseless/ggpattern")
library(ggpattern)
library(ggplot2)

data_ggp <- data.frame(category = rep(c("cat1", "cat2", "cat3"), 4),
                       values = c(0.664, 0.045, 0.291, 0.482, 0.029, 0.489, 0.537, 0.027, 0.436, 0.536, 0.028, 0.436),
                       group = c(rep("group1a", 3), rep("group1b", 3), rep("group2a", 3), rep("group2b", 3)))

ggplot(data_ggp, aes(category, values)) + 
  geom_bar_pattern(stat = "identity", 
                   pattern = c("none", "none", "none", # 1st col
                               "none", "none", "none", # 2nd col
                               "stripe", "stripe", "stripe", # 3rd col
                               "crosshatch", "crosshatch", "crosshatch" # 4th col 
                               ),
                   pattern_angle = c(rep(0, 6), rep(45, 3), rep(0, 3)),
                   pattern_density = .1,
                   pattern_spacing = .04,
                   pattern_fill = 'black',
                   aes(fill = group), 
                   position = "dodge") +
  scale_fill_manual(" ", 
                    labels = c("group1a", "group1b", "group2a", "group2b"),
                    values = c("group1a" = "deepskyblue4", "group1b" = "darkolivegreen4", 
                               "group2a" = "deepskyblue1", "group2b" = "darkolivegreen2")) +
  guides(fill = guide_legend(override.aes = 
                               list(
                                 pattern = c("none", "none", "stripe", "crosshatch"),
                                 pattern_spacing = .01,
                                 pattern_angle = c(0, 0, 45, 0)
                                 )
                             ))

由reprex package (v0.3.0) 于 2021-01-13 创建

【讨论】:

以上是关于ggplot2:为彩色条形图和图例添加不同的纹理[重复]的主要内容,如果未能解决你的问题,请参考以下文章

将水平线添加到 R 中 ggplot2 中的堆叠条形图,并在图例中显示

R:在 ggplot2 中设置图例和颜色

为ggplot2线图创建图例

R语言使用ggplot2可视化:使用ggpattern包在分组条形图中添加自定义条纹图案添加阴影条纹或其他图案或纹理(add hatches, stripes or another pattern

条形图和彩色分类变量

带有ggplot2的发散堆积条形图:图例中的因子排序问题