R 如何在ggplot facet plot中为重要性绘制多个星号?

R 如何在ggplot facet plot中为重要性绘制多个星号?,r,plot,ggplot2,facet,p-value,R,Plot,Ggplot2,Facet,P Value,我在ggplot2中创建了一个刻面图,每个图中都有多个数据集作为折线图显示。根据统计检验,一些数据点是显著的(p≤ 0.05). 我想在图上用星号在重要数据点上方表示这一点 星号的颜色应与绘图中使用的数据集的颜色相对应。当x轴上该点有多个有效数据集时,星号应垂直堆叠,以避免重叠而相互遮挡 在我的输入数据中,我有一个附加的p值列。有人能告诉我怎么做ggplot2(如果可能的话)或者帮我写代码吗 我的当前绘图(图例从右侧裁剪,使图的其余部分在此放大): 我当前的代码: ggplot(MyData,

我在ggplot2中创建了一个刻面图,每个图中都有多个数据集作为折线图显示。根据统计检验,一些数据点是显著的(p≤ 0.05). 我想在图上用星号在重要数据点上方表示这一点

星号的颜色应与绘图中使用的数据集的颜色相对应。当x轴上该点有多个有效数据集时,星号应垂直堆叠,以避免重叠而相互遮挡

在我的输入数据中,我有一个附加的p值列。有人能告诉我怎么做ggplot2(如果可能的话)或者帮我写代码吗

我的当前绘图(图例从右侧裁剪,使图的其余部分在此放大):

我当前的代码:

ggplot(MyData,aes( x = DAF, y = Mvalue ,group=Species, colour = Species)) + geom_line(size=1.3) + xlab("Frequencies") + ylab("Score")  + theme(axis.text.x=element_text(angle = -45, hjust = 0, size = 6)) + theme(axis.text.y=element_text( size = 6)) + facet_wrap(~Variant) + geom_point()
9个数据集中2个的输入数据示例(其余数据将在下面继续)。对于该数据,星号表示显著性(p≤ 0.05)将用于第6、7、8、10、14和19行,基于最后一列中的值≤ 0.05:

1   Species Variant DAF Mvalue  pvalue
2   Tom 5' UTR  0.1-0.19    -1.6026346186   NA
3   Tom 5' UTR  0.2-0.29    1.1646939405    NA
4   Tom 5' UTR  0.3-0.39    0.0003859956    9.84E-01
5   Tom 5' UTR  0.4-0.49    0.0226744644    3.28E-01
6   Tom 5' UTR  0.5-0.59    0.1163627387    3.22E-05
7   Tom 5' UTR  0.6-0.69    0.1614562558    6.33E-06
8   Tom 5' UTR  0.7-0.79    0.221583632 4.29E-06
9   Tom 5' UTR  0.8-0.89    0.1231280752    1.42E-01
10  Tom 5' UTR  0.9-0.99    0.5765076152    9.13E-03
11  Tom 5' UTR  1   5.8105310419    1.87E-13
12  Jerry   5' UTR  0.1-0.19    -0.1371122871   NA
13  Jerry   5' UTR  0.2-0.29    -0.0539638465   4.30E-01
14  Jerry   5' UTR  0.3-0.39    0.1666681074    1.45E-02
15  Jerry   5' UTR  0.4-0.49    0.0081950639    9.19E-01
16  Jerry   5' UTR  0.5-0.59    -0.1204254909   1.82E-01
17  Jerry   5' UTR  0.6-0.69    0.1017622151    3.15E-01
18  Jerry   5' UTR  0.7-0.79    0.1293398031    3.16E-01
19  Jerry   5' UTR  0.8-0.89    0.2944195851    4.52E-02
20  Jerry   5' UTR  0.9-0.99    -0.2956980914   2.12E-01
21  Jerry   5' UTR  1   0.0746902715    7.63E-01
如果更简单的话,我可以用0或1来代替p值列,指示该值是否重要

我试图展示我以前的工作和一些示例输入数据。让我知道我是否可以改进我的问题。 谢谢你的建议

以下是请求的数据子集的dput()输出:

structure(list(Species = structure(c(2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("Jerry", 
"Tom"), class = "factor"), Variant = structure(c(2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L), .Label = c("3' UTR", 
"5' UTR", "Missense", "Stop gained"), class = "factor"), DAF = structure(c(1L, 
2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 1L, 2L, 3L, 4L, 5L, 6L, 
7L, 8L, 9L, 10L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 1L, 
2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 1L, 2L, 3L, 4L, 5L, 6L, 
7L, 8L, 9L, 10L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 1L, 
2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 1L, 2L, 3L, 4L, 5L, 6L, 
7L, 8L, 9L, 10L), .Label = c("0.1-0.19", "0.2-0.29", "0.3-0.39", 
"0.4-0.49", "0.5-0.59", "0.6-0.69", "0.7-0.79", "0.8-0.89", "0.9-0.99", 
"1"), class = "factor"), Mvalue = c(-1.6026346186, 1.1646939405, 
0.0003859956, 0.0226744644, 0.1163627387, 0.1614562558, 0.221583632, 
0.1231280752, 0.5765076152, 5.8105310419, -0.0251257018, -0.022586792, 
0.0089090304, 0.037280128, 0.0745842692, 0.0831538898, 0.0762765259, 
0.1750634419, 0.2095647328, NA, -0.0139837967, -0.0218524964, 
-0.023889027, -0.0042744306, 0.0949525873, 0.087866945, 0.1379730494, 
0.2719542633, 0.4726727792, NA, 0.0201430038, 0.1304518218, -0.0948886785, 
-0.2329137983, -0.0901357588, 0.0504128137, -0.2308377878, 0.4422620731, 
NA, NA, -0.1371122871, -0.0539638465, 0.1666681074, 0.0081950639, 
-0.1204254909, 0.1017622151, 0.1293398031, 0.2944195851, -0.2956980914, 
0.0746902715, -0.005168038, 0.0403712226, -0.0034692714, -0.0049252304, 
-0.0089669044, -0.0604522846, 0.1061225099, 0.0180975445, -0.1843156999, 
-0.1920104157, 0.2228406046, 0.0532141252, 0.0670815638, -0.1197784096, 
-0.235101482, -0.1920644059, -0.2493575855, -0.1564613691, -0.2600385981, 
0.069079018, 0.0503810571, 0.4346052688, 0.1300533982, 0.0662828745, 
-0.4627398332, -1.081459609, -0.7693678877, -0.4865007276, -0.0230373639, 
0.4693415234), pvalue = c(NA, NA, 0.984, 0.328, 3.22e-05, 6.33e-06, 
4.29e-06, 0.142, 0.00913, 1.87e-13, NA, NA, 0.354, NA, 1.93e-07, 
7.29e-06, 0.00288, 2.48e-05, 0.1, 0.791, 0.124, NA, 0.131, 0.824, 
4.11e-05, 0.00354, 0.000711, 3.1e-05, 0.0122, 0.871, 0.73, 0.0963, 
0.367, NA, 0.574, 0.799, 0.442, 0.267, 0.319, 0.98, NA, 0.43, 
0.0145, 0.919, 0.182, 0.315, 0.316, 0.0452, 0.212, 0.763, 0.824, 
0.096, 0.896, 0.868, 0.779, 0.124, 0.0261, 0.761, NA, NA, 6.44e-22, 
0.0407, 0.0162, NA, NA, NA, NA, NA, NA, 0.481, 0.809, 0.0236, 
0.573, 0.801, 0.172, NA, 0.186, 0.449, 0.975, 0.513)), .Names = c("Species", 
"Variant", "DAF", "Mvalue", "pvalue"), class = "data.frame", row.names = c(NA, 
-80L))

这是解决办法。它与您的示例中的2个物种一起工作,但应该与更多的物种一起工作

library(data.table)
MyData <- data.table(MyData)
MyData$signif <- ifelse(MyData$pvalue < 0.05,1,0)
循环基于点“y值”+0.5创建星号“y值”。 当存在n个有效点时,它将第n个点“y值”增加n*0.5

for (i in 1:length(levels(MyData$Species))) {
  MyData[temp == i , y_ast:=max(Mvalue, na.rm=TRUE)+(i*0.5), by=c("DAF", "Variant")]
}


ggplot(MyData,aes( x = DAF, y = Mvalue ,group=Species, colour = Species)) +
  geom_line(size=1) + xlab("Frequencies") + ylab("Score")  +
  theme(axis.text.x=element_text(angle = -45, hjust = 0, size = 6)) +
  theme(axis.text.y=element_text( size = 6)) +
  facet_wrap(~Variant) +
  geom_point()+
  geom_point(data = MyData[MyData$signif ==1, ],aes(x=DAF, y=y_ast),shape = "*", size=8, show.legend = FALSE)

如果您想按照我的建议在趋势上显示星号,只需将最后一行中的y=
y=y_ast
替换为y=
Mvalue


PS:我使用
数据。表
与我习惯的一样,但是
y_ast
值可以使用R
base
包或
dplyr
计算,例如

这里是解决方案。它与您的示例中的2个物种一起工作,但应该与更多的物种一起工作

library(data.table)
MyData <- data.table(MyData)
MyData$signif <- ifelse(MyData$pvalue < 0.05,1,0)
循环基于点“y值”+0.5创建星号“y值”。 当存在n个有效点时,它将第n个点“y值”增加n*0.5

for (i in 1:length(levels(MyData$Species))) {
  MyData[temp == i , y_ast:=max(Mvalue, na.rm=TRUE)+(i*0.5), by=c("DAF", "Variant")]
}


ggplot(MyData,aes( x = DAF, y = Mvalue ,group=Species, colour = Species)) +
  geom_line(size=1) + xlab("Frequencies") + ylab("Score")  +
  theme(axis.text.x=element_text(angle = -45, hjust = 0, size = 6)) +
  theme(axis.text.y=element_text( size = 6)) +
  facet_wrap(~Variant) +
  geom_point()+
  geom_point(data = MyData[MyData$signif ==1, ],aes(x=DAF, y=y_ast),shape = "*", size=8, show.legend = FALSE)

如果您想按照我的建议在趋势上显示星号,只需将最后一行中的y=
y=y_ast
替换为y=
Mvalue


PS:我使用
数据。表
和我习惯的一样,但是
y_ast
值可以使用R
base
包或
dplyr
计算,例如

一种可行的方法:
包含星号位置的数据集,即p值重要的点

library(dplyr)
df_asterisk=MyData%>%
  filter(pvalue<0.05)
Mvalue用于*的位置,我们在用于映射的数据帧中更改它。我使用前面创建的
id
列的值来区分星号(无重叠)。一种更简单的方法是忽略这一步,向映射中添加一个随机组件(如果不满意,则重新绘制)

我将一个数据点更改为5'的DAF中有2个重要的p值,以查看其外观。
一种可行的方法:
包含星号位置的数据集,即p值重要的点

library(dplyr)
df_asterisk=MyData%>%
  filter(pvalue<0.05)
Mvalue用于*的位置,我们在用于映射的数据帧中更改它。我使用前面创建的
id
列的值来区分星号(无重叠)。一种更简单的方法是忽略这一步,向映射中添加一个随机组件(如果不满意,则重新绘制)

我将一个数据点更改为5'的DAF中有2个重要的p值,以查看其外观。

您能在R中使用
dput()
吗,这样我们就可以轻松地使用您的数据而无需进行任何操作?我认为如果您找到一种方法来做到这一点,图形实际上将很难读取。例如,我建议在点的类型上添加一个
比例
(圆圈=不显著,菱形=显著)。你也可以根据球的大小来比赛。音阶是个好主意。有没有一种方法可以将填充的圆圈表示为重要,将未填充的圆圈表示为重要?尽管我担心重叠的线条可能会掩盖这些点。但我可以像你说的那样玩尺寸。我应该如何使用dput(),它给了我一个很长的值列表,我不想在这里发布所有数据,因为有>600行。我用dput()创建了一个输入数据文件。在这里共享数据的正确方法是什么?只需将其添加到您的帖子中即可。如果它真的很大,考虑只提供相关的子集。你能在R中使用<代码> dPUTE()/Cord>,这样我们就可以不用操纵就轻松地使用你的数据了吗?我想如果你找到了一个方法来做的话,图表实际上是很难阅读的。例如,我建议在点的类型上添加一个
比例
(圆圈=不显著,菱形=显著)。你也可以根据球的大小来比赛。音阶是个好主意。有没有一种方法可以将填充的圆圈表示为重要,将未填充的圆圈表示为重要?尽管我担心重叠的线条可能会掩盖这些点。但我可以像你说的那样玩尺寸。我应该如何使用dput(),它给了我一个很长的值列表,我不想在这里发布所有数据,因为有>600行。我用dput()创建了一个输入数据文件。在这里共享数据的正确方法是什么?只需将其添加到您的帖子中即可。如果它真的很大,考虑只提供相关的子集。非常感谢!我会仔细阅读这个答案,并确保我理解它,这是非常有帮助的。非常感谢!我会仔细阅读这个答案,并确保我理解它,这是非常有帮助的
ggplot(MyData,aes( x = DAF, y = Mvalue ,group=Species, colour = Species)) +
  geom_line(size=1.3) +
  xlab("Frequencies") +
  ylab("Score")  +
  theme(axis.text.x=element_text(angle = -45, hjust = 0, size = 6)) +
  theme(axis.text.y=element_text( size = 6)) + 
  geom_point()+
  geom_text(data=df_asterisk,aes(x=DAF,y=Mvalue),label="*",size=5,nudge_y=1)+
  facet_wrap(~Variant)