2012-07-05 38 views
66

Tôi thường có các giá trị số cho faceting. Tôi muốn cung cấp đầy đủ thông tin để diễn giải các giá trị này trong tiêu đề bổ sung, tương tự như tiêu đề trục. Tùy chọn labeller lặp lại nhiều văn bản không cần thiết và không sử dụng được cho các tiêu đề biến dài hơn.Làm cách nào để thêm nhãn chung vào các khía cạnh trong ggplot2?

Mọi đề xuất?

Giá trị mặc định:

test<-data.frame(x=1:20, y=21:40, facet.a=rep(c(1,2),10), facet.b=rep(c(1,2), each=20)) 
qplot(data=test, x=x, y=y, facets=facet.b~facet.a) 

enter image description here

Những gì tôi rất thích:

enter image description here

Điều tốt nhất tôi có thể làm trong ggplot:

qplot(data=test, x=x, y=y)+facet_grid(facet.b~facet.a, labeller=label_both) 

enter image description here

Như đã nêu bởi @Hendy, tương tự như: add a secondary y axis to ggplot2 plots - make it perfect

+1

Bò thánh. Tôi đã * chỉ * tìm kiếm điều này, tìm thấy điều này thông qua google ... và bây giờ nhìn thấy nó đã được hỏi một phút trước đây. [Câu hỏi này] (http: // stackoverflow.com/questions/9096671/add-a-trung-y-axis-to-ggplot2-lô-làm-nó-hoàn hảo) dường như được hỏi cùng một điều dựa trên bình luận của mình, mặc dù tiêu đề có thể ngụ ý khác. Mô hình tuyệt vời để minh họa. Đây chính xác là vấn đề của tôi - thật tuyệt nếu tôi không phải giải thích các khía cạnh về khía cạnh số của tôi. Đồ thị nên nói cho chính nó với một nhãn đơn giản giải thích những biến số faceting là gì. – Hendy

+0

Tôi hỏi một [câu hỏi tương tự trong quá khứ.] (Http://stackoverflow.com/q/7603949/707145) – MYaseen208

+3

Tôi hỏi với Winston Chang (không biết xử lý SO của mình), một trong những nhà phát triển ggplot chính, qua email. Anh ta không nghĩ rằng đây là một lựa chọn nhưng có thể xem xét thêm nó. Ông đề nghị tôi thêm một vấn đề trên github, [vì vậy tôi đã làm] (https://github.com/hadley/ggplot2/issues/612) – Hendy

Trả lời

43

Khi mới nhất ggplot2 sử dụng gtable nội bộ, nó là khá dễ dàng để thay đổi một con số:

library(ggplot2) 
test <- data.frame(x=1:20, y=21:40, 
        facet.a=rep(c(1,2),10), 
        facet.b=rep(c(1,2), each=20)) 
p <- qplot(data=test, x=x, y=y, facets=facet.b~facet.a) 

# get gtable object 
z <- ggplotGrob(p) 

library(grid) 
library(gtable) 
# add label for right strip 
z <- gtable_add_cols(z, unit(z$widths[[7]], 'cm'), 7) 
z <- gtable_add_grob(z, 
        list(rectGrob(gp = gpar(col = NA, fill = gray(0.5))), 
          textGrob("Variable 1", rot = -90, gp = gpar(col = gray(1)))), 
        4, 8, 6, name = paste(runif(2))) 

# add label for top strip 
z <- gtable_add_rows(z, unit(z$heights[[3]], 'cm'), 2) 
z <- gtable_add_grob(z, 
        list(rectGrob(gp = gpar(col = NA, fill = gray(0.5))), 
          textGrob("Variable 2", gp = gpar(col = gray(1)))), 
        3, 4, 3, 6, name = paste(runif(2))) 

# add margins 
z <- gtable_add_cols(z, unit(1/8, "line"), 7) 
z <- gtable_add_rows(z, unit(1/8, "line"), 3) 

# draw it 
grid.newpage() 
grid.draw(z) 

enter image description here

Tất nhiên, bạn có thể viết một hàm tự động thêm nhãn dải. Phiên bản tương lai của ggplot2 có thể có chức năng này; không chắc chắn mặc dù.

+0

- Tôi tự hỏi liệu đây có phải là cách tiếp cận sạch sẽ nhất, như phiên bản 0.9.3.1 hay không. Tôi không nhìn thấy một cái gì đó trông giống như "fuctionality này" trong tài liệu mới nhất http://docs.ggplot2.org/0.9.3.1/ – yosukesabai

+1

Phiên bản 0.9.3.1 cung cấp 'ggplotGrob()' giống như 'ggplot_gtable (ggplot_build ()) '. Tôi nghĩ đây vẫn là cách tốt nhất. – kohske

+0

Cách tiếp cận này sẽ ghi đè chú thích khi có. Tôi tự hỏi nếu có một cách để ngăn chặn điều này. – papirrin

1

Ngoài các phương pháp vạch ra bởi kohske, bạn có thể thêm một biên giới để các hộp thêm vào bằng cách thay đổi

col=NA 

để

col=gray(0.5), linetype=1 

Ngoài ra, thay đổi

fill=gray(0.5) 

cho

fill=grey(0.8) 

gp=gpar(col=gray(1)) 

để

gp=gpar(col=gray(0)) 

Nếu bạn muốn các thanh mới để phù hợp với khía cạnh nhãn

tức

z <- gtable_add_grob(z, 
     list(rectGrob(gp = gpar(col = gray(0.5), linetype=1, fill = gray(0.8))), 
     textGrob("Variable 1", rot = -90, gp = gpar(col = gray(0)))), 
     4, 8, 6, name = paste(runif(2))) 
0

Có thể có một cách tốt hơn để làm nhưng bạn có thể:

fac1 = factor(rep(c('a','b'),10)) 
fac2 = factor(rep(c('a','b'),10)) 
data = data.frame(x=1:10, y=1:10, fac1=fac1, fac2=fac2) 
p = ggplot(data,aes(x,y)) + ggplot2::geom_point() + 
facet_grid(fac1~fac2) 
p + theme(plot.margin = unit(c(1.5,1.5,0.2,0.2), "cm")) 
grid::grid.text(unit(0.98,"npc"),0.5,label = 'label ar right', rot = 270) # right 
grid::grid.text(unit(0.5,"npc"),unit(.98,'npc'),label = 'label at top', rot = 0) # top 
Các vấn đề liên quan