r - 将特定于组的文本/数据添加到 R/ggplot2 中的多面图
问题描述
我正在比较大型基因表达实验中重复样本之间的组内相关性,其中我有多个独立的生物学组 - 想法是查看是否有任何组的相关性远低于其他组,这表明潜在的样本混淆或其他错误。
我正在使用 ggplot 绘制每个重复对的表达式值。我还希望能够将相关系数和 p 值添加到图的每个面板,我通过summarize
和获得cor.test
。您可以使用此代码来获得一般概念:在 中exp1
,重复项是相关的,但在 中不相关exp2
。
library(tidyverse)
df <- data.frame(exp=c(rep('exp1', 100), rep('exp2', 100)), a=rnorm(200, 1000, 200))
df <- mutate(df, b=ifelse(exp=='exp1', a*rnorm(100,1,0.05), rnorm(100, 1000, 200)))
head(df)
tail(df)
df %>% ggplot(aes(x=a, y=b))+
geom_point() +
facet_wrap(~exp)
group_by(df, exp) %>%
summarize(corr=cor.test(a,b)$estimate, pval=cor.test(a,b)$p.value)
这是我通过 生成的图ggplot
,我手动添加了最后得到的 R 值和 p 值。但是,当然,如果我有很多样本对要分析,那么能够从ggplot
调用中自动添加它们会很好。我只是不知道该怎么做。
解决方案
如果出于某种原因,您想自己构建它而不是使用ggpubr
函数,您可以创建摘要数据、格式化标签并将标签放置在geom_text
.
我正在格式化统计数据,以使 R 具有固定的 3 位有效数字,而 p 具有 3 位数字,使用科学记数法。我将这些列的名称更改summarise
为 R 和 p 以制作下面的标签。整形为长数据并创建一个新列unite
得到这个:
library(tidyverse)
...
group_by(df, exp) %>%
summarize(R = cor.test(a, b)$estimate, p = cor.test(a, b)$p.value) %>%
mutate(R = formatC(R, format = "fg", digits = 3),
p = formatC(p, format = "g", digits = 3)) %>%
gather(key = measure, value = value, -exp) %>%
unite("stat", measure, value, sep = " = ")
#> # A tibble: 4 x 2
#> exp stat
#> <chr> <chr>
#> 1 exp1 R = 0.965
#> 2 exp2 R = 0.0438
#> 3 exp1 p = 1.14e-58
#> 4 exp2 p = 0.665
然后对于每个组,我想折叠两个标签,用换行符分隔\n
。这是一个可以很好地扩展的地方——你可能有更多的汇总统计数据要显示,但这应该仍然有效。
summ <- group_by(df, exp) %>%
summarize(R = cor.test(a, b)$estimate, p = cor.test(a, b)$p.value) %>%
mutate(R = formatC(R, format = "fg", digits = 3),
p = formatC(p, format = "g", digits = 3)) %>%
gather(key = measure, value = value, -exp) %>%
unite("stat", measure, value, sep = " = ") %>%
group_by(exp) %>%
summarise(both_stats = paste(stat, collapse = "\n"))
summ
#> # A tibble: 2 x 2
#> exp both_stats
#> <chr> <chr>
#> 1 exp1 "R = 0.965\np = 1.14e-58"
#> 2 exp2 "R = 0.0438\np = 0.665"
在geom_text
中,我将 x 坐标设置为-Inf
,它获取所有 x 值的最小值,并将 y 坐标设置为Inf
所有 y 值的最大值。这会将标签放在左上角,而不管数据中的值如何。
我在这里不喜欢的一件事是在他们预期的 0 到 1 范围之外破解hjust
和。但是/不会做任何事情,因为值被设置为无穷大。vjust
nudge_x
nudge_y
df %>%
ggplot(aes(x = a, y = b)) +
geom_point() +
geom_text(aes(x = -Inf, y = Inf, label = both_stats), data = summ,
hjust = -0.1, vjust = 1.1, lineheight = 1) +
facet_wrap(~ exp)
由reprex 包(v0.2.1)于 2018 年 11 月 14 日创建
推荐阅读
- audio - 如何用 ffmpeg 替换给定时间戳的音频?
- doctrine - 教义子查询语法
- javascript - 由于 CORS,HTTP Auth 请求在浏览器中失败,在 Node 中正常
- angular - 如何将数字值从角度传递给webapi
- javascript - javascript函数和javascript对象之间的主要核心区别是什么?
- javascript - javascript:使用我自己的确认框和功能确认功能
- jboss - 无法从 JBOSS 访问 CMS
- php - 从字符串中删除单引号和双引号
- oauth - 获取 Bearer 令牌后无法发出获取请求 - 401 错误“范围不足”
- rabbitmq - RabbitMQ Shovel 连接失败