2013-02-19 10 views
8

Buduję wykres kwantylowo-kwantylowy ze zmiennej o nazwie x z ramki danych o nazwie df w przedstawionym poniżej przykładzie roboczym. Chciałbym nazwać punkty zmienną name mojego zbioru danych df.Jak mogę oznaczyć punkty wykresu kwantyle-kwantyle złożonego z ggplot2?

Czy można to zrobić w ggplot2 bez uciekania się do bolesnego rozwiązania (zakodowanie rozkładu teoretycznego ręką, a następnie narysowanie go na podstawie empirycznej)?

Edytuj: zdarza się, że tak, dzięki użytkownikowi, który opublikował, a następnie skasował swoją odpowiedź. Zobacz komentarze po odpowiedzi Aruna poniżej. Dzięki Didzisowi za jego sprytne rozwiązanie z 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 

Pracuję nad adaptacją this gist, i rozważy inne pytania wysyłając do CrossValidated jeśli mam pytania dotyczące diagnostyki regresji, które mogą być interesujące dla użytkowników CV.

+0

ktoś zamieścił nawet bezpośrednie rozwiązanie niż Didzis i usunął go. Było to coś w stylu 'ggplot (df, aes (sample = x)) + geom_text (label = df $ name, stat =" qq ") + geom_abline (typ linii =" kropkowany ")'. Jeśli jesteś zainteresowany. – Arun

Odpowiedz

8

Można zapisać swoją oryginalną QQ działkę jako obiekt (używana funkcja ggplot() i stat_qq() zamiast qplot())

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

Następnie z funkcją ggplot_build() można wyodrębnić dane wykorzystywane do kreślenia. Są przechowywane w elemencie data[[1]]. Zapisano te dane jako nową ramkę danych.

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 

Teraz można dodać do ramki danych nazw obserwacji. Ważne jest użycie order(), ponieważ dane w nowej ramce danych są uporządkowane.

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

teraz wykreślić nową ramkę danych jak zwykle, a zamiast geom_point() zapewnić geom_text().

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

enter image description here

+0

(+1) genialne użycie 'ggplot_build()'. Jedno pytanie: Gdzie mogę przeczytać o kontroli niższego poziomu 'ggplot2', takich jak te, każdy pomysł? – Arun

+1

@Arun Nie mam pewności, gdzie znaleźć informacje - nauczyłem się tego, patrząc na inne pytania SO. –

+0

No dobrze, to miłe. Wciąż będę szukał waszych odpowiedzi! :) – Arun

5

Punkty są zbyt blisko. Chciałbym zrobić coś takiego:

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

Daje:

enter image description here

Jeśli domagać się etykiet wewnątrz działki, a następnie, można spróbować czegoś takiego:

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

Możesz grać ze współrzędnymi x i y, a jeśli chcesz, możesz zawsze usunąć estetykę kolorów.

+0

+1 Ładne kolory tęczy :) Myślę, że brakuje kodu dla twojej drugiej fabuły? – juba

+0

@juba, oopsy! zapomniałem go wkleić.dzięki za wskazanie! – Arun

+0

Dziękuję za sugestię. Myślałem o tym ostatnim rozwiązaniu, ale chciałbym obyć się bez tworzenia dodatkowych danych 'rnorm' tylko dla fabuły. –

Powiązane problemy