2016-11-14 9 views
0

Ich habe ein Facettenplot in ggplot2 mit mehreren Datensätzen in jeder Figur als Liniendiagramme erstellt. Einige der Datenpunkte sind nach einem statistischen Test signifikant (p ≤ 0,05). Ich möchte dies auf der Handlung mit einem Stern über den Datenpunkten angeben, die signifikant sind. I found this example of having asterisks displayed above the significant valuesWie werden mehrere Sternchen für die Signifikanz im ggplot-Facettenplot dargestellt?

Die Farbe des Sternchens auf die Farbe des Datensatzes entsprechen in dem Grundstück verwendet. Und wenn mehrere signifikante Datensätze für diesen Punkt auf der x-Achse vorhanden sind, sollten die Sternchen vertikal gestapelt werden, damit sie sich nicht durch Überlappung verdecken.

In meinen Eingabedaten habe ich eine zusätzliche Spalte mit dem p-Wert. Könnte mich jemand auf den Weg hinweisen, diesen ggplot2 zu machen (wenn es überhaupt möglich ist) oder mir mit dem Code helfen.

Mein aktuelles Grundstück (Legende ist die rechte Seite abgeschnitten den Rest der Figur zu machen größer hier):

enter image description here

Mein aktueller Code:

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

Beispiel von Eingang Daten für 2 der 9 Datensätze (der Rest würde weiter unten). Für diese Daten der Sternchen auf Signifikanz (p ≤ 0,05) würden für Linien 6,7,8,10,14 & 19 basierend auf dem Wert in der letzten Spalte ≤ 0,05 wobei:

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 

Wenn es viel ist Einfacher könnte ich die p-Wert-Spalte durch eine 0 oder eine 1 ersetzen, die angibt, ob der Wert signifikant ist.

Ich habe versucht, meine vorherige Arbeit und einige Beispiel-Eingabedaten zu zeigen. Lass mich wissen, ob ich meine Frage verbessern kann. Vielen Dank für Ihre Vorschläge.

ist hier ein dput() Ausgabe einer Teilmenge der Daten wie gewünscht:

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)) 
+0

Können Sie 'dput()' in R verwenden, damit wir Ihre Daten ohne Manipulation verwenden können? – timat

+0

Ich denke, wenn Sie einen Weg finden, dies zu tun, wäre das Diagramm wirklich schwer zu lesen. Ich schlage vor, eine "Skala" zum Punkttyp hinzuzufügen (z. B. Kreis = Nicht signifikant, Diamant = Signifikant). Sie können auch auf die Größe des Punktes spielen. – timat

+0

Die Skala ist eine großartige Idee. Gibt es eine Möglichkeit, ausgefüllte Kreise für signifikante, ungefüllte für signifikante zu tun? Obwohl ich mir Sorgen mache, könnten die überlappenden Linien diese Punkte immer noch verschleiern. Aber ich könnte mit der Größe spielen, wie du gesagt hast. Wie sollte ich dput() verwenden, es gibt mir eine sehr lange Liste von Werten und ich wollte nicht alle Daten hier posten, da es> 600 Zeilen gibt. – user964689

Antwort

2

Hier ist die Lösung. Es arbeitet mit 2 Art wie in Ihrem Beispiel, soll aber mit mehr Arten arbeiten.

library(data.table) 
MyData <- data.table(MyData) 
MyData$signif <- ifelse(MyData$pvalue < 0.05,1,0) 

Um zu bestimmen, wenn mehr als 1 significative Wert auf dem gleichen Punkt gibt das Sternchen „y-Wert“

MyData[, temp:=cumsum(signif), by=c("Variant", "DAF")] 

Die Schleife erzeugen ist, basierend auf dem Punkt „y-Wert“ + 0,5. Wenn ein n significative Punkt ist, den n-ten Punkt „y-Wert“ von n * 0,5 inkrementieren.

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) 

enter image description here

Wenn Sie die Sternchen auf den Trend zeigen wollen, wie ich vorschlagen, ersetzen Sie einfach y=y_ast durch y = Mvalue in der letzten Zeile.

PS: Ich benutze data.table als ich gewohnt bin, aber y_ast Wert sein kann

+0

Großartig, vielen Dank, das sieht perfekt aus. – user964689

2

Eine Möglichkeit, mit der R base Paket oder dplyr zum Beispiel berechnen, die funktionieren könnte:
Der Datensatz die Position der umschließende Sternchen, das heißt, die Punkte, für die p-Wert signifikant ist

library(dplyr) 
df_asterisk=MyData%>% 
    filter(pvalue<0.05) 

Ein weiterer Datenrahmen, die Werte, für die mehr als 1 enthält p-Wert signifikant ist. Eine neue Spalte id wird hinzugefügt, um die unterschiedliche Gruppe zu unterscheiden.

Id_group=df_asterisk%>% 
    group_by(Variant,DAF)%>% 
    filter(n()>1)%>% 
    mutate(id=data.table::rleid(Mvalue)) 

M-Wert für die Position der * verwendet wird, ändern wir es in dem Datenrahmen für die Abbildung verwendet. Ich habe den Wert der zuvor erstellten Spalte id verwendet, um das Sternchen zu unterscheiden (keine Überlappung). Ein einfacherer Ansatz könnte darin bestehen, diesen Schritt zu ignorieren und dem Mapping eine zufällige Komponente hinzuzufügen (und neu zu zeichnen, wenn dies nicht zufriedenstellend ist). df_asterisk[with(df_asterisk,duplicated(interaction(Variant,DAF))|duplicated(interaction(Variant,DAF),fromLast = T)),]$Mvalue<-(df_asterisk[with(df_asterisk,duplicated(interaction(Variant,DAF))|duplicated(interaction(Variant,DAF),fromLast = T)),]$Mvalue)+Id_group$id/4

Grundstück:

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) 

Ich wechsle ein Datenpunkt 2 signifcant p-Werte in DAF haben für 5' zu sehen, wie es aussah. enter image description here

+0

vielen Dank! Ich werde diese Antwort durchgehen und sicherstellen, dass ich sie verstehe, das ist sehr hilfreich – user964689

Verwandte Themen