R 添加网格面板的方式为文本和hline

R 添加网格面板的方式为文本和hline,r,ggplot2,R,Ggplot2,我有一个像这样的数据框 > 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 ... 在网格上刻面是非常简单的 ggplot(df,aes(x=c

我有一个像这样的数据框

> 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
...
在网格上刻面是非常简单的

ggplot(df,aes(x=cdr3_len,y=Sum)) + geom_line() + xlim(c(1,42)) + facet_grid(JGene~DGene,scales="free_y")
并且得到一些看起来像的东西

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

谢谢

编辑-
这里有一种方法,通过预先计算所需的值(根据@jwillis0720的注释),为
cdr3\u len
的平均值添加文本和垂直线:

首先,计算每个面板的
cdr3\u len
平均值,然后将该数据帧加入到第二个数据帧中,该数据帧计算用于在每个面板上放置文本的适当y值(因为适当的y值仅随
JGene
的级别而变化)

现在来看情节:

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")

可能的dup:麻烦在于像他们那样预先计算平均值。太接近了!我确实需要cdr3_len,但总和是每个长度的计数。所以我需要平均和,就是平均长度。功能。cdr3_len*Sum/Sum(Sum),但我不太明白这个函数。类似于
meanData=df%>%groupby(JGene,DGene)%%>%summary(meanSum=Sum*cdr3_len/Sum(Sum))%%>%left_join(df%>%groupby(JGene)%%>%summary(ypos=0.9*max((Sum*cdr3_len)/Sum(Sum))
我觉得这就是你想要的,但你在问题中说了hline,所以我同意了。请参阅更新的代码。您不需要更改
ypos
的计算,因为这是基于
Sum
的最大值为
JGene
的每一级别计算的。
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")