向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 <- aes(ymax = logfc + SE, ymin = logfc) dodge <- 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条添加阴影或图案[重复]的主要内容,如果未能解决你的问题,请参考以下文章
向 collectionViewCell 添加阴影 [重复]
R语言ggplot2可视化:ggplot2可视化散点图并使用geom_mark_ellipse函数在数据簇或数据分组的数据点周围添加椭圆(ellipse)进行注释(对椭圆包围的区域进行着色为阴影区域)