向ggplot条添加阴影或图案[重复]

Posted

技术标签:

【中文标题】向ggplot条添加阴影或图案[重复]【英文标题】:Adding hatches or patterns to ggplot bars [duplicate] 【发布时间】:2021-07-13 19:31:14 【问题描述】:

假设我想在条形图中显示基于 RNA-seq 和 q-PCR 分析的基因表达结果 (logFC)。我的数据集如下所示:

set.seed(42)

f1 <- expand.grid(
  comp = LETTERS[1:3],
  exp = c("qPCR", "RNA-seq"),
  geneID = paste("Gene", 1:4)
)
f1$logfc <- rnorm(nrow(f1))
f1$SE <- runif(nrow(f1), min=0, max=1.5)

我的 R 命令行


p=ggplot(f1, aes(x=geneID, y=logfc, fill= comp,color=exp))+
  geom_bar(stat="identity", position =position_dodge2(preserve="single"))+
  theme(axis.text.x = element_text(angle = 45, vjust = 0.5, hjust=1))```

我有这个输出:

我想获得与变量之一(exp 或 comp)相对应的条上的任何标记图案或阴影,并添加上部误差条,如下图所示:

有什么帮助吗?

【问题讨论】:

这能回答你的问题吗? How can I add hatches, stripes or another pattern or texture to a barplot in ggplot? 很遗憾没有!我在这里发帖之前阅读了这个帖子。但是输入的数据和我的不一样。他们有分类变量,我有数值变量。我必须在 y 轴上绘制“值 (logfc)”,在 x 轴上绘制geneID,根据“comp”填充或着色条,并根据“exp”(q-PCR 或 RNA-seq)添加模式。跨度> 好吧,您能否将一些可以与您的代码一起使用的(虚拟)数据作为f1 对象发布,以便这里的人们可以尝试让这种模式发挥作用? 我已经编辑了我的帖子并添加了一个示例输入表作为超链接 只是出于好奇,我对链接问题的回答中的哪一部分让您感到困惑?我可以考虑改进它。 【参考方案1】:

按照链接的答案,如何将其扩展到您的案例似乎很自然。在下面的示例中,我使用了一些结构类似于您提供的 head() 数据的虚拟数据,因为 csv 链接给了我一个 404。

library(ggplot2)
library(ggpattern)
#> 
#> Attaching package: 'ggpattern'
#> The following objects are masked from 'package:ggplot2':
#> 
#>     flip_data, flipped_names, gg_dep, has_flipped_aes, remove_missing,
#>     should_stop, waiver

# Setting up some dummy data
set.seed(42)
f1 <- expand.grid(
  comp = LETTERS[1:3],
  exp = c("qPCR", "RNA-seq"),
  geneID = paste("Gene", 1:4)
)
f1$logfc <- rnorm(nrow(f1))

ggplot(f1, aes(x = geneID, y = logfc, fill = comp)) +
  geom_col_pattern(
    aes(pattern = exp),
    colour = "black",
    pattern_fill = "black",
    pattern_angle = 45,
    pattern_density = 0.1,
    pattern_spacing = 0.01,
    position = position_dodge2(preserve = 'single'),
  ) +
  scale_pattern_manual(
    values = c("none", "stripe"),
    guide = guide_legend(override.aes = list(fill = "grey70")) # <- make lighter
  ) +
  scale_fill_discrete(
    guide = guide_legend(override.aes = list(pattern = "none")) # <- hide pattern
  )

由reprex package (v1.0.0) 于 2021-04-19 创建

编辑:如果您想重复填充图例中的阴影,您可以创建一个interaction(),然后自定义手动填充比例。

ggplot(f1, aes(x = geneID, y = logfc)) +
  geom_col_pattern(
    aes(pattern = exp,
        fill = interaction(exp, comp)), # <- make this an interaction
    colour = "black",
    pattern_fill = "black",
    pattern_angle = 45,
    pattern_density = 0.1,
    pattern_spacing = 0.01,
    position = position_dodge2(preserve = 'single'),
  ) +
  scale_pattern_manual(
    values = c("none", "stripe"),
    guide = guide_legend(override.aes = list(fill = "grey70")) # <- make lighter
  ) +
  scale_fill_manual(
    # Have 3 colours and repeat each twice
    values = rep(scales::hue_pal()(3), each = 2),
    # Extract the second name after the '.' from the `interaction()` call
    labels = function(x) 
      vapply(strsplit(x, "\\."), `[`, character(1), 2)
    ,
    # Repeat the pattern over the guide
    guide = guide_legend(
      override.aes = list(pattern = rep(c("none", "stripe"), 3))
    )
  )

由reprex package (v1.0.0) 于 2021-04-19 创建

EDIT2:现在带有错误栏:

library(ggplot2)
library(ggpattern)
set.seed(42)

f1 <- expand.grid(
  comp = LETTERS[1:3],
  exp = c("qPCR", "RNA-seq"),
  geneID = paste("Gene", 1:4)
)
f1$logfc <- rnorm(nrow(f1))
f1$SE <- runif(nrow(f1), min=0, max=1.5)

ggplot(f1, aes(x = geneID, y = logfc)) +
  geom_col_pattern(
    aes(pattern = exp,
        fill = interaction(exp, comp)), # <- make this an interaction
    colour = "black",
    pattern_fill = "black",
    pattern_angle = 45,
    pattern_density = 0.1,
    pattern_spacing = 0.01,
    position = position_dodge2(preserve = 'single'),
  ) +
  geom_errorbar(
    aes(
      ymin = logfc,
      ymax = logfc + sign(logfc) * SE,
      group = interaction(geneID, comp, exp)
    ),
    position = "dodge"
  ) +
  scale_pattern_manual(
    values = c("none", "stripe"),
    guide = guide_legend(override.aes = list(fill = "grey70")) # <- make lighter
  ) +
  scale_fill_manual(
    # Have 3 colours and repeat each twice
    values = rep(scales::hue_pal()(3), each = 2),
    # Extract the second name after the '.' from the `interaction()` call
    labels = function(x) 
      vapply(strsplit(x, "\\."), `[`, character(1), 2)
    ,
    # Repeat the pattern over the guide
    guide = guide_legend(
      override.aes = list(pattern = rep(c("none", "stripe"), 3))
    )
  )

由reprex package (v1.0.0) 于 2021-04-22 创建

【讨论】:

哇,这看起来太棒了!我快到了。如果我也想使用该模式自定义“comp”的图例,如我的帖子中显示的第二个图所示。在这种情况下,在您的示例中,此处的“comp”元素(如 A、B、C)在图例中将是一个带模式和一个不带模式的元素(如第二个图所示)。谢谢! 是的,这让它有点复杂,但我在编辑中添加了一个示例。 谢谢@theunbrand。我要回到这一点。我有第二列“SE”,其中包含“logfc”中每个值的标准偏差。添加误差线的最佳方法是什么。我本来打算在limits &lt;- aes(ymax = logfc + SE, ymin = logfc) dodge &lt;- position_dodge(width = 0.9) and 和p+geom_errorbar(limits, position = dodge, colour = "black") 后面添加ist ass,但我收到一条消息错误:**错误:手动比例中的值不足。需要 6 个,但只提供了 4 个。运行 rlang::last_error() 以查看错误发生的位置。** 是的,对不起,我不知道你做的和我做的有什么不同。我无法调试无法查看和试验的代码和数据。 我不想;因为(1)它剥夺了其他人回答你问题的机会;(2)这意味着我有责任解决你的问题,我宁愿避免。如果可以的话,我很乐意提供帮助,但我不知道是否可以。我也只选择性地回答我认为我理解得足够好的 SO 问题。我认为最好的办法是生成一个可以与任何人共享的虚拟数据集(就像我上面所做的那样)并复制问题,然后发布一个不同的问题来解决这个不同的问题。

以上是关于向ggplot条添加阴影或图案[重复]的主要内容,如果未能解决你的问题,请参考以下文章

我们可以在R(ggplot2)中为(虚线)线添加阴影吗?

如何在Android中以编程方式向影像添加阴影? [重复]

向圆圈添加投影模糊阴影

向 collectionViewCell 添加阴影 [重复]

如何向 <rect> 添加阴影 [重复]

R语言ggplot2可视化:ggplot2可视化散点图并使用geom_mark_ellipse函数在数据簇或数据分组的数据点周围添加椭圆(ellipse)进行注释(对椭圆包围的区域进行着色为阴影区域)