2015-08-12 12 views
18

Tôi đang làm việc trên một gói phối hợp sử dụng ggplot2. Ngay bây giờ tôi đang xây dựng biplots theo cách truyền thống, với tải trọng được đại diện với mũi tên. Tôi cũng sẽ được quan tâm mặc dù sử dụng các trục được hiệu chuẩn và đại diện cho các trục tải như các đường thẳng qua gốc, và với các nhãn tải được hiển thị bên ngoài khu vực ô. Trong cơ sở R này được thực hiện trongR: thêm trục đã hiệu chỉnh vào PCA biplot trong ggplot2

library(OpenRepGrid) 
biplot2d(boeker) 

enter image description here

nhưng tôi đang tìm kiếm một giải pháp ggplot2. Có ai có bất kỳ suy nghĩ làm thế nào để đạt được một cái gì đó như thế này trong ggplot2? Việc thêm các tên biến ngoài vùng biểu đồ có thể được thực hiện like here Tôi cho rằng, nhưng làm thế nào các đoạn đường bên ngoài vùng biểu đồ được vẽ?

Hiện nay những gì tôi có là

install.packages("devtools") 
library(devtools) 
install_github("fawda123/ggord") 
library(ggord) 
data(iris) 
ord <- prcomp(iris[,1:4],scale=TRUE) 
ggord(ord, iris$Species) 

enter image description here

Các tải trọng là trong ord$rotation

    PC1   PC2  PC3  PC4 
Sepal.Length 0.5210659 -0.37741762 0.7195664 0.2612863 
Sepal.Width -0.2693474 -0.92329566 -0.2443818 -0.1235096 
Petal.Length 0.5804131 -0.02449161 -0.1421264 -0.8014492 
Petal.Width 0.5648565 -0.06694199 -0.6342727 0.5235971 

Làm thế nào tôi có thể thêm những dòng qua gốc, các ve bên ngoài và các nhãn bên ngoài vùng trục (có thể bao gồm cả sự rung lên mát mẻ được áp dụng ở trên cho các nhãn chồng lên nhau)?

NB Tôi không muốn tắt clipping, vì một số yếu tố cốt truyện của tôi đôi khi có thể đi ra ngoài các ranh giới hộp

EDIT: Someone else apparently asked a similar question before, mặc dù câu hỏi là vẫn không có câu trả lời. Nó chỉ ra rằng để làm một cái gì đó như thế này trong cơ sở R (mặc dù trong một cách xấu xí) người ta có thể làm ví dụ

plot(-1:1, -1:1, asp = 1, type = "n", xaxt = "n", yaxt = "n", xlab = "", ylab = "") 
abline(a = 0, b = -0.75) 
abline(a = 0, b = 0.25) 
abline(a = 0, b = 2) 
mtext("V1", side = 4, at = -0.75*par("usr")[2]) 
mtext("V2", side = 2, at = 0.25*par("usr")[1]) 
mtext("V3", side = 3, at = par("usr")[4]/2) 

enter image description here

Minimal dụ hoàn toàn khả thi trong ggplot2 sẽ

library(ggplot2) 
df <- data.frame(x = -1:1, y = -1:1) 
dfLabs <- data.frame(x = c(1, -1, 1/2), y = c(-0.75, -0.25, 1), labels = paste0("V", 1:3)) 
p <- ggplot(data = df, aes(x = x, y = y)) + geom_blank() + 
    geom_abline(intercept = rep(0, 3), slope = c(-0.75, 0.25, 2)) + 
    theme_bw() + coord_cartesian(xlim = c(-1, 1), ylim = c(-1, 1)) + 
    theme(axis.title = element_blank(), axis.text = element_blank(), axis.ticks = element_blank(), 
     panel.grid = element_blank()) 
p + geom_text(data = dfLabs, mapping = aes(label = labels)) 

enter image description here

nhưng như bạn có thể thấy không có may mắn với các nhãn, và tôi đang tìm kiếm một giải pháp mà không yêu cầu một để tắt cắt.

EDIT2: bit của câu hỏi có liên quan là cách tôi có thể thêm dấu ngắt tùy chỉnh/dấu tick và nhãn, nói màu đỏ, ở trên cùng của trục X và bên phải của trục Y, để hiển thị hệ tọa độ của hệ số tải? (trong trường hợp tôi sẽ mở rộng tỷ lệ tương ứng với điểm số yếu tố để làm cho các mũi tên rõ ràng hơn, thường được kết hợp với một vòng tròn đơn vị)

+1

Có lẽ sử dụng 'geom_path()' để có được đường của bạn? và sau đó cũng sử dụng trục tùy chỉnh? [Xem tại đây] (http://www.cookbook-r.com/Graphs/Axes_ (ggplot2) /) để biết các mẹo về điều đó. Tuy nhiên, Hadley không thích nhiều lô trên đầu trang của nhau, do đó bạn có thể không thể thực hiện những gì bạn muốn một cách dễ dàng (xem câu trả lời của Hadley [ở đây] (http://stackoverflow.com/questions/3099219/how-to-use -ggplot2-make-plot-với-2-y-trục-một-y-trục-trên-trái-và-một)). –

+0

Có cho các dòng tôi nghĩ rằng tôi có thể quản lý (mặc dù tôi sẽ chạy vào vấn đề tôi nghĩ rằng nếu tôi sẽ để cho các dòng chạy bên ngoài khu vực cốt truyện, vì tôi không muốn vô hiệu hóa cắt trong trường hợp của tôi). Đối với các nhãn bạn sẽ đề nghị để đặt chúng tại các thời điểm cụ thể sau đó, nhưng chỉ đơn giản là sử dụng các dấu tick tiêu chuẩn cho họ? (không hoàn toàn là những gì tôi muốn, vì chúng lý tưởng nên xiên) Và làm cách nào tôi có thể nhận được các dấu ngắt và nhãn khác nhau trên tất cả 4 mặt của biểu đồ? –

+0

Và có lại. Hadleys khăng khăng không muốn hỗ trợ các quy mô khác nhau: điều đó khiến tôi gặp rắc rối với biplots, vì tôi vẫn không quản lý thêm các dấu ngắt và nhãn cụ thể bằng màu khác ở đầu Y và bên phải trục X - nếu bạn sẽ xảy ra để biết làm thế nào để làm điều đó cho tôi biết; bit của một vấn đề liên quan .... –

Trả lời

6

Có thể thay thế, bạn có thể loại bỏ toàn bộ hộp và trục màn hình và vẽ một hình chữ nhật nhỏ hơn trong khu vực cốt truyện thay thế. Cắt bớt các dòng không đụng độ với các nhãn văn bản là một chút khó khăn, nhưng điều này có thể làm việc.

enter image description here

df <- data.frame(x = -1:1, y = -1:1) 
dfLabs <- data.frame(x = c(1, -1, 1/2), y = c(-0.75, -0.25, 1), 
        labels = paste0("V", 1:3)) 
p <- ggplot(data = df, aes(x = x, y = y)) + 
    geom_blank() + 
    geom_blank(data=dfLabs, aes(x = x, y = y)) + 
    geom_text(data = dfLabs, mapping = aes(label = labels)) + 
    geom_abline(intercept = rep(0, 3), slope = c(-0.75, 0.25, 2)) + 
    theme_grey() + 
    theme(axis.title = element_blank(), 
     axis.text = element_blank(), 
     axis.ticks = element_blank(), 
     panel.grid = element_blank()) + 
    theme() 

library(grid) 
element_grob.element_custom <- function(element, ...) { 
    rectGrob(0.5,0.5, 0.8, 0.8, gp=gpar(fill="grey95")) 
} 

panel_custom <- function(...){ # dummy wrapper 
    structure(
    list(...), 
    class = c("element_custom","element_blank", "element") 
) 

} 

p <- p + theme(panel.background=panel_custom()) 


clip_layer <- function(g, layer="segment", width=1, height=1){ 
    id <- grep(layer, names(g$grobs[[4]][["children"]])) 
    newvp <- viewport(width=unit(width, "npc"), 
        height=unit(height, "npc"), clip=TRUE) 
    g$grobs[[4]][["children"]][[id]][["vp"]] <- newvp 

    g 
} 

g <- ggplotGrob(p) 
g <- clip_layer(g, "segment", 0.85, 0.85) 
grid.newpage() 
grid.draw(g) 
+0

Rất cám ơn vì điều đó! Chắc chắn sẽ hữu ích, vì vậy +1! Vẫn còn một chút chưa quyết định mặc dù trong số hai tùy chọn ở đây để đi cho, vì vậy tôi vẫn sẽ chờ đợi một chút để xem những gì mọi người đến với! Xử lý các nhãn chồng chéo cũng có thể hơi phức tạp ... –

+0

có một vài chức năng R để thử và tránh các xung đột (bố cục theo hướng lực lượng, gói trực tiếp, v.v.) và có thể dễ dàng sử dụng hơn với các nhãn bên trong bảng điều khiển cốt truyện (vô hình ở đây), vì không gian có sẵn thực tế hơn so với lề. – baptiste

1

gì về điều này:

enter image description here

sử dụng đoạn mã sau. Nếu bạn muốn các nhãn cũng trên đỉnh và bên phải có một cái nhìn tại địa chỉ: http://rpubs.com/kohske/dual_axis_in_ggplot2

require(ggplot2) 

data(iris) 
ord <- prcomp(iris[,1:4],scale=TRUE) 

slope <- ord$rotation[,2]/ord$rotation[,1] 

p <- ggplot() + 
    geom_point(data = as.data.frame(ord$x), aes(x = PC1, y = PC2)) + 
    geom_abline(data = as.data.frame(slope), aes(slope=slope)) 

info <- ggplot_build(p) 

x <- info$panel$ranges[[1]]$x.range[1] 
y <- info$panel$ranges[[1]]$y.range[1] 

p + 
    scale_x_continuous(breaks=y/slope, labels=names(slope)) + 
    scale_y_continuous(breaks=x*slope, labels=names(slope)) + 
    theme(axis.text.x = element_text(angle=90, vjust=0.5), 
     panel.grid.major = element_blank(), 
     panel.grid.minor = element_blank(), 
     axis.title.x=element_blank(), 
     axis.title.y=element_blank()) 
+0

Rất cám ơn vì điều đó - chắc chắn là một giải pháp rất thanh lịch - +1! Và cảm thấy tự do để thêm một ví dụ với các nhãn trên tất cả 4 mặt của biểu đồ! (Lưu ý rằng nhãn sẽ phải được đặt ở bên cạnh mũi tên đang trỏ - tôi nghĩ ngay bây giờ không phải là những gì được thực hiện ở đây, nghĩ rằng trục X và Y cũng được lật tròn - nhưng đây chỉ là những chi tiết dễ dàng sửa) –

+0

Chỉ cần Lật tọa độ. Ofc bạn nói đúng, trục x và y là sai. Bạn cũng đúng (trong ví dụ này) tất cả các nhãn trục 3 y phải đi về phía bên phải. Nhưng tôi rời khỏi trục ggplot tinh chỉnh cho những người muốn hack ggplot – Rentrop

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