2013-02-19 5 views
8

Ich baue ein Quantil-Quantil-Plot aus einer Variablen namens x aus einem Datenrahmen namens df in dem unten angegebenen Arbeitsbeispiel. Ich möchte die Punkte mit der name Variablen meines df Datensatzes beschriften.Wie kann ich die Punkte eines mit ggplot2 erstellten Quantil-Quantil-Diagramms beschriften?

Ist es möglich, dies in ggplot2 ohne Rückgriff auf die schmerzhafte Lösung (Codierung der theoretischen Verteilung von Hand und dann gegen die empirische) zu tun?

Edit: es passiert, dass ja, dank eines Benutzers, der seine Antwort veröffentlicht und dann gelöscht hat. Siehe die Kommentare nach Aruns Antwort unten. Danke an Didzis für seine ansonsten clevere Lösung mit ggbuild.

# MWE 
df <- structure(list(name = structure(c(1L, 2L, 3L, 4L, 5L, 7L, 9L, 
10L, 6L, 12L, 13L, 14L, 15L, 16L, 17L, 19L, 18L, 20L, 21L, 22L, 
8L, 23L, 11L, 24L), .Label = c("AUS", "AUT", "BEL", "CAN", "CYP", 
"DEU", "DNK", "ESP", "FIN", "FRA", "GBR", "GRC", "IRL", "ITA", 
"JPN", "MLT", "NLD", "NOR", "NZL", "PRT", "SVK", "SVN", "SWE", 
"USA"), class = "factor"), x = c(-0.739390016757746, 0.358177826874146, 
1.10474523846099, -0.250589535389937, -0.423112615445571, -0.862144579740376, 
0.823039669834058, 0.079521521937704, 1.08173649722493, -2.03962942823921, 
1.05571087029737, 0.187147291278723, -0.144770773941437, 0.957990771847331, 
-0.0546549555439176, -2.70142550075757, -0.391588386498849, -0.23855544527369, 
-0.242781575907386, -0.176765072121165, 0.105155860923456, 2.69031085872414, 
-0.158320176671995, -0.564560815972446)), .Names = c("name", 
"x"), row.names = c(NA, -24L), class = "data.frame") 

library(ggplot2) 
qplot(sample = x, data = df) + geom_abline(linetype = "dotted") + theme_bw() 

# ... using names instead of points would allow to spot the outliers 

ich auf einer Anpassung des this gist arbeite, und sendet andere Fragen zu CrossValidated beachten, wenn ich Fragen über die Regressionsdiagnose haben, die von Interesse für CV-Benutzer sein könnten.

+0

jemand gepostet eine noch direkte Lösung als Didzis und es gelöscht. Es war etwas wie 'ggplot (df, aes (Beispiel = x)) + geom_text (Label = df $ name, stat =" qq ") + geom_abline (Linientyp =" gepunktet ")'. Falls Sie interessiert sind. – Arun

Antwort

8

Sie können Ihren ursprünglichen QQ-Plot als Objekt (verwendete Funktion ggplot() und stat_qq() statt qplot())

g<-ggplot(df, aes(sample = x)) + stat_qq() 

Dann mit Funktion ggplot_build() Sie können Daten extrahieren zum Plotten speichern. Sie sind im Element data[[1]] gespeichert. Speichert diese Daten als neuen Datenrahmen.

df.new<-ggplot_build(g)$data[[1]] 
head(df.new) 
      x   y  sample theoretical PANEL group 
1 -2.0368341 -2.7014255 -2.7014255 -2.0368341  1  1 
2 -1.5341205 -2.0396294 -2.0396294 -1.5341205  1  1 
3 -1.2581616 -0.8621446 -0.8621446 -1.2581616  1  1 
4 -1.0544725 -0.7393900 -0.7393900 -1.0544725  1  1 
5 -0.8871466 -0.5645608 -0.5645608 -0.8871466  1  1 
6 -0.7415940 -0.4231126 -0.4231126 -0.7415940  1  1 

Jetzt können Sie Datenrahmennamen von Beobachtungen hinzufügen. Wichtig ist, order() zu verwenden, da Daten in neuen Datenrahmen bestellt werden.

df.new$name<-df$name[order(df$x)] 

nun neue Datenrahmen wie gewohnt plotten und statt geom_point()geom_text() bieten.

ggplot(df.new,aes(theoretical,sample,label=name))+geom_text()+ 
    geom_abline(linetype = "dotted") + theme_bw() 

enter image description here

+0

(+1) brillante Verwendung von 'ggplot_build()'. Eine Frage: Wo kann ich über die untere Kontrolle von 'ggplot2' lesen, irgendeine Idee? – Arun

+1

@Arun Ich bin mir nicht sicher, wo ich Informationen finden kann - das habe ich bei anderen SO-Fragen herausgefunden –

+0

Oh, das ist nett. Ich werde dann nach deinen Antworten suchen! :) – Arun

5

Die Punkte sind zu nah. Ich würde so etwas tun:

df <- df[with(df, order(x)), ] 
df$t <- quantile(rnorm(1000), seq(0, 100, length.out = nrow(df))/100) 

p <- ggplot(data = df, aes(x=t, y=x)) + geom_point(aes(colour=df$name)) 

Das gibt:

enter image description here

Wenn Sie darauf bestehen, auf Etiketten innerhalb des Grundstücks hat, dann können Sie so etwas wie versuchen könnte:

df <- df[with(df, order(x)), ] 
df$t <- quantile(rnorm(1000), seq(0, 100, length.out = nrow(df))/100) 

p <- ggplot(data = df, aes(x=t, y=x)) + geom_point(aes(colour=df$name)) 
p <- p + geom_text(aes(x=t-0.05, y=x-0.15, label=df$name, size=1, colour=df$name)) 

p 

enter image description here

Sie können herumspielen mit den x und y Koordinaten und wenn Sie möchten, können Sie immer die Farbästhetik entfernen.

+0

+1 Schöne Regenbogenfarben :) Ich denke, der Code für deine zweite Handlung fehlt? – juba

+0

@juba, oopsie! habe vergessen, es einzufügen.Danke für das Aufzeigen! – Arun

+0

Vielen Dank für Ihren Vorschlag. Ich dachte an diese letzte Lösung, möchte aber auf die Erzeugung zusätzlicher 'rnorm'-Daten nur für die Handlung verzichten. –

Verwandte Themen