添加facet_grid面板的文本和hline

3

我有一个数据框,看起来像这样。

> head(df)
  DGene JGene cdr3_len Sum
1 IGHD1 IGHJ1        0  22
2 IGHD1 IGHJ1        1  11
3 IGHD1 IGHJ1        2  16
4 IGHD1 IGHJ1        3  40
5 IGHD1 IGHJ1        4  18
6 IGHD1 IGHJ1        5  30
...

很容易使用facet_grid进行处理。
ggplot(df,aes(x=cdr3_len,y=Sum)) + geom_line() + xlim(c(1,42)) + facet_grid(JGene~DGene,scales="free_y")

我想知道是否有人能帮助我在每个网格的平均值处添加水平线。或者可能如何在右上角打印每个网格的平均值。

谢谢,

编辑 - 数据框的完整链接

并获得类似于以下内容的东西。

enter image description here


如何为Facets添加不同的行 - hrbrmstr
问题在于像他们那样预计算均值。 - jwillis0720
1个回答

7
这里有一种方法可以通过预先计算所需值(根据@jwillis0720的评论)来添加文本和平均垂直线:

首先,计算每个面板的的平均值,然后将该数据框与计算每个面板上放置文本的适当y值的第二个数据框进行连接(因为适当的y值仅由级别变化)。

library(dplyr) 

meanData = df %>% group_by(JGene, DGene) %>%
  summarise(meanCDR = sum(Sum*cdr3_len)/sum(Sum)) %>%
  left_join(df %>% group_by(JGene) %>%
              summarise(ypos = 0.9*max(Sum)))

现在让我们来谈谈情节:
ggplot(df,aes(x=cdr3_len, y=Sum)) +
  geom_vline(data=meanData, aes(xintercept=meanCDR), colour="red", lty=3) +
  geom_line() +
  geom_text(data=meanData, 
            aes(label=round(meanCDR,1), x=40, y=ypos), colour="red",
            hjust=1) +
  xlim(c(1,42)) + 
  facet_grid(JGene~DGene,scales="free_y")

enter image description here


非常接近了!我确实需要cdr3_len,但Sum是每个长度的计数。因此,我需要meanSum成为平均长度。函数是cdr3_len*Sum/sum(Sum),但我无法完全理解该函数。 - jwillis0720
类似于 meanData = df %>% group_by(JGene, DGene) %>% summarise(meanSum = Sum*cdr3_len/sum(Sum)) %>% left_join(df %>% group_by(JGene) %>% summarise(ypos = 0.9*max((Sum*cdr3_len)/sum(Sum)))) 的内容。 - jwillis0720
1
我有一种感觉,那就是你想要的,但是在你的问题中你说了 hline,所以我就按照那个来做了。请看更新后的代码。你不需要改变 ypos 的计算方式,因为它是根据每个 JGene 级别的 Sum 最大值来计算的。 - eipi10

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接