【问题标题】:Reproducing this plot in R在 R 中重现此图
【发布时间】:2020-12-20 23:36:13
【问题描述】:

我有两组患者。我想为两组患者绘制一个情节

类似这样的情节

我有这样的数据

> dput(df)
structure(list(gene = c("18q", "4q", "21p", "21q", "5q", "22q", 
"17p", "3p", "9p", "4p", "9q", "19q", "10q", "15q", "16p", "19p", 
"1p", "18p", "16q", "8p", "21q", "4q", "18q", "21p", "1p", "3p", 
"4p", "17p", "5q", "16q", "18p", "14q", "19p", "20q"), CNV = c("Deletion", 
"Deletion", "Deletion", "Deletion", "Deletion", "Deletion", "Deletion", 
"Deletion", "Deletion", "Deletion", "Deletion", "Deletion", "Deletion", 
"Deletion", "Deletion", "Deletion", "Deletion", "Deletion", "Deletion", 
"Deletion", "Deletion", "Deletion", "Deletion", "Deletion", "Deletion", 
"Deletion", "Deletion", "Deletion", "Deletion", "Deletion", "Deletion", 
"Deletion", "Deletion", "Amplification"), log10_pvalue = c(5.974694135, 
5.73754891, 4.995678626, 4.970616222, 4.793174124, 4.793174124, 
4.109020403, 3.524328812, 3.524328812, 2.823908741, 2.567030709, 
2.186419011, 1.769551079, 1.59345982, 1.59345982, 1.59345982, 
1.416801226, 1.195860568, 1.094743951, 1.087777943, 4.083019953, 
3.826813732, 3.826813732, 3.826813732, 2.675717545, 2.675717545, 
2.675717545, 2.342944147, 2.084072788, 1.850780887, 1.659555885, 
1.197226275, 1.197226275, 1.88941029), Percentage_altered = c(0.61, 
0.53, 0.61, 0.56, 0.44, 0.5, 0.5, 0.44, 0.5, 0.47, 0.39, 0.28, 
0.33, 0.31, 0.33, 0.31, 0.22, 0.36, 0.33, 0.33, 0.63, 0.52, 0.59, 
0.67, 0.26, 0.44, 0.52, 0.48, 0.33, 0.44, 0.44, 0.3, 0.33, 0.5
), group = c("Non-responders", "Non-responders", "Non-responders", 
"Non-responders", "Non-responders", "Non-responders", "Non-responders", 
"Non-responders", "Non-responders", "Non-responders", "Non-responders", 
"Non-responders", "Non-responders", "Non-responders", "Non-responders", 
"Non-responders", "Non-responders", "Non-responders", "Non-responders", 
"Non-responders", "Responders", "Responders", "Responders", "Responders", 
"Responders", "Responders", "Responders", "Responders", "Responders", 
"Responders", "Responders", "Responders", "Responders", "Responders"
)), class = "data.frame", row.names = c(NA, -34L))
>

我已经尝试过这段代码,但没有给出你生成的内容

df %>%
  mutate(net_frequency=ifelse(CNV == "Deletion", -Percentage_altered/100, Percentage_altered/100)) %>%
  crossing(., tibble(grp = c("Responders", "Non-Responders"))) %>%
  mutate(log10_pvalue = if_else(CNV == "Deletion", -log10_pvalue, log10_pvalue)) %>% 
  ggplot(aes(x = log10_pvalue, y = net_frequency, color = log10_pvalue)) +
  geom_point(aes(size=Percentage_altered)) +
  geom_text_repel(aes(label=ifelse(log10_pvalue > -log10(0.05), gene, "")), force=10) +
  geom_hline(yintercept=0, lty=2) +
  scale_color_distiller(type = "div") +
  theme_classic() +
  facet_wrap(~grp)

我得到这样的情节但没有意义

如果您查看,对于这两个组,只有响应者的信息被绘制

你能帮忙编辑一下代码吗

【问题讨论】:

  • 看看?facet_wrap?facet_grid
  • 是的,但我不知道如何在数据框中定义 group1 和 group2 并要求在每个组中使用不同的颜色进行放大和删除,例如 group1 用浅蓝色删除,用深蓝色删除组2
  • 您能否详细解释一下您的数据中如何表示“响应者”和“无响应者”?那些和你所说的group1group2一样吗?我在您发布的df 中没有看到类似的内容。我看到您说您不知道如何在数据中定义 group1/2 ,但也不清楚您的意思。您知道df 中的哪些条目属于这两个组吗?
  • 是的,它们是 group1 和 group2。 df 仅用于 group1 和 group2 将具有相同的数据但不粘贴在这里
  • 为您的问题提供解决方案需要将group1group2 包含在同一数据框中。如果您可以编辑帖子以提供完全代表您的问题空间的数据,那将会很有帮助。

标签: r ggplot2 reshape


【解决方案1】:

更新包括 OP 的更新数据,现在有两个组。
编辑 2 删除 OP 的原始 geom_repel 过滤器,每个 cmets。

这是一种通过将log10_pvalue 的所有CNV == 'Deletion' 值设为负值来创建不同色阶的方法。与facet_wrap() 配对,就可以实现您的目标。

df %>% 
  mutate(net_frequency=ifelse(CNV == "Deletion", -Percentage_altered/100, Percentage_altered/100),
         log10_pvalue = if_else(CNV == "Deletion", -log10_pvalue, log10_pvalue)) %>% 
  ggplot(aes(x = log10_pvalue, y = net_frequency, color = log10_pvalue)) +
  geom_point(aes(size=Percentage_altered)) +
  geom_text_repel(aes(label=gene), force=10) +
  geom_hline(yintercept=0, lty=2) +
  scale_color_distiller(type = "div") +
  theme_classic() +
  facet_wrap(~group)

【讨论】:

  • 对不起,为什么我得到这个错误 UseMethod("mutate_") 中的错误:没有适用于 'mutate_' 的方法应用于类“function”的对象此外:警告消息:mutate_() 是自 dplyr 0.7.0 起已弃用。请改用mutate()。有关更多帮助,请参阅 vignette('programming') 此警告每 8 小时显示一次。致电lifecycle::last_warnings() 以查看此警告的生成位置。 >
  • 尝试新的 R 环境,只需加载 library(tidyverse),然后加载您在帖子中定义的 df。然后运行这段代码——它会产生上面的图。
  • 请注意,包含 crossing() 的唯一原因(最初由 @r2evans 提供)是为了模拟两组数据。现在您已经包含了两个组,只需删除管道的那一部分 - 其他一切都运行正常。我将更新我的答案以使用您新添加的数据进行演示。
  • 这是在您的原始代码中做出的决定,geom_text_repel()。如果log10_pvalue 不符合某个阈值,则您有一个规则将圆圈标签设置为""。如果您希望更多圈子有标签,只需删除或更改此规则即可。
  • 试试geom_text_repel(aes(label=gene), force=10)。但是如果您在使用 ifelse 语法以及它如何适合您的绘图功能时遇到问题,我建议您花更多时间来理解您开始使用的代码。运行您不理解的代码是遇到意外错误的好方法。以?ifelse开头。
【解决方案2】:

正如@andrew_reece 建议的那样,facet_* 将在这里提供帮助。

由于我们在数据中没有任何“响应者”的概念,我将使用tidyr::crossing 盲目地复制数据。

另外,为了演示,我删除了theme_classic 以突出显示窗格。 (用起来没问题,只是想把区别说清楚。)

library(dplyr)
library(ggplot2)
library(ggrepel) # geom_text_repel
library(tidyr)   # crossing
df %>%
  mutate(net_frequency=ifelse(CNV == "Deletion", -Percentage_altered/100, Percentage_altered/100)) %>%
  crossing(. tibble(resp = c("Responder", "Non-Responder"))) %>%
  ggplot(. aes(x=log10_pvalue, y=net_frequency)) +
  geom_point(aes(size=Percentage_altered, color=log10_pvalue)) +
  geom_text_repel(aes(label=ifelse(log10_pvalue > -log10(0.05), gene, "")), force=10) +
  geom_hline(yintercept=0, lty=2) +
  facet_wrap(. ~ resp)

至于“两组不同的颜色”,还不清楚你需要什么。如果您希望(例如)响应者的色阶为“蓝色”,非响应者为“红色”,请查看 ggplot-extension 包,例如 ggnewscaleggrelayer。 (它们没有被烘烤。)

【讨论】:

    猜你喜欢
    • 2022-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 2023-01-02
    • 2020-05-12
    • 1970-01-01
    • 2020-09-28
    相关资源
    最近更新 更多