2013-02-19 17 views
8

Tôi đang xây dựng một âm mưu lượng tử định lượng ra khỏi một biến gọi là x từ một khung dữ liệu được gọi là df trong ví dụ làm việc được cung cấp bên dưới. Tôi muốn gắn nhãn các điểm bằng biến số name của số liệu df của tôi.Làm cách nào để gắn nhãn các điểm của một âm mưu lượng tử lượng tử được tạo thành với ggplot2?

Có thể thực hiện điều này trong ggplot2 mà không cần đến giải pháp đau đớn (mã hóa phân phối lý thuyết bằng tay và sau đó vẽ đồ thị dựa trên thực nghiệm)?

Chỉnh sửa: điều đó xảy ra là có, nhờ người dùng đã đăng và sau đó xóa câu trả lời của mình. Xem các bình luận sau câu trả lời của Arun bên dưới. Nhờ Didzis cho giải pháp thông minh khác của mình với 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 

tôi đang làm việc trên một sự thích nghi của this gist, và sẽ xem xét việc gửi câu hỏi khác để CrossValidated nếu tôi có thắc mắc về chẩn đoán hồi quy, mà có thể được quan tâm đến người sử dụng CV.

+0

một người nào đó đã đăng một giải pháp thậm chí trực tiếp hơn Didzis và xóa nó. Nó giống như 'ggplot (df, aes (mẫu = x)) + geom_text (nhãn = df $ name, stat =" qq ") + geom_abline (linetype =" chấm ")'. Trong trường hợp bạn quan tâm. – Arun

Trả lời

8

Bạn có thể lưu QQ cốt truyện ban đầu của bạn như đối tượng (sử dụng chức năng ggplot()stat_qq() thay vì qplot())

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

Sau đó, với chức năng ggplot_build() bạn có thể trích xuất dữ liệu sử dụng cho âm mưu. Chúng được lưu trữ trong phần tử data[[1]]. Đã lưu các dữ liệu đó dưới dạng khung dữ liệu mới.

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 

Bây giờ bạn có thể thêm vào các tên khung dữ liệu quan sát. Quan trọng là sử dụng order() vì dữ liệu trong khung dữ liệu mới được sắp xếp.

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

Bây giờ vẽ khung dữ liệu mới như bình thường và thay vì geom_point() cung cấp geom_text().

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

enter image description here

+0

(+1) sử dụng tuyệt vời 'ggplot_build()'. Một câu hỏi: Tôi có thể đọc về điều khiển cấp thấp hơn của 'ggplot2' như thế nào, bất kỳ ý tưởng nào ?? – Arun

+1

@Arun Tôi không chắc chắn nơi để tìm thông tin - Tôi đã học được điều này bằng cách nhìn vào các câu hỏi SO khác –

+0

Oh alright, đó là tốt đẹp. Tôi sẽ tiếp tục tìm kiếm câu trả lời của bạn sau đó! :) – Arun

5

Các điểm quá gần. Tôi sẽ làm một cái gì đó như thế này:

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

Điều này cho phép:

enter image description here

Nếu bạn nhấn mạnh vào việc có nhãn bên trong cốt truyện, sau đó, bạn có thể thử một cái gì đó như:

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

Bạn có thể chơi xung quanh với các tọa độ xy và nếu bạn muốn, bạn luôn có thể loại bỏ tính thẩm mỹ màu.

+0

+1 Màu sắc cầu vồng đẹp :) Tôi nghĩ mã cho âm mưu thứ hai của bạn bị thiếu? – juba

+0

@juba, oopsy! quên dán nó.cảm ơn vì đã chỉ ra! – Arun

+0

Cảm ơn bạn đã đề xuất. Tôi nghĩ về giải pháp cuối cùng, nhưng muốn làm mà không cần tạo thêm dữ liệu 'rnorm' chỉ cho cốt truyện. –

Các vấn đề liên quan