Làm cách nào để bạn thêm nhãn chung cho các khía cạnh trong ggplot2?


82

Tôi thường có các giá trị số cho các khía cạnh. Tôi muốn cung cấp đầy đủ thông tin để giải thích các giá trị khía cạnh này trong tiêu đề bổ sung, tương tự như tiêu đề trục. Các tùy chọn người ghi nhãn 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.

Bất kỳ đề xuất?

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)

nhập mô tả hình ảnh ở đây

Điều tôi thích:

nhập mô tả hình ảnh ở đây

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

nhập mô tả hình ảnh ở đây

Như được chỉ ra bởi @Hendy, tương tự như: thêm trục y phụ vào các ô ggplot2 - làm cho nó hoàn hảo


1
Chúa ơi. Tôi chỉ tìm kiếm cái này, tìm thấy cái này qua google ... và bây giờ thấy nó đã được hỏi một phút trước. Câu hỏi này dường như đang hỏi điều tương tự dựa trên nhận xét của anh ấy, 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 - sẽ rất tuyệt nếu tôi không phải giải thích các danh mục khía cạnh số của mình. Biểu đồ phải tự nói lên bằng một nhãn đơn giản giải thích các biến khía cạnh là gì.
Hendy

3
Tôi đã hỏi Winston Chang (không biết tay cầm SO của anh ấy), một trong những nhà phát triển ggplot chính, qua email. Anh ấy không nghĩ rằng đây hiện là một lựa chọn nhưng có thể cân nhắc thêm nó. Anh ấy đề nghị tôi thêm một vấn đề trên github, vì vậy tôi đã làm
Hendy

1
Có vẻ như điều này đã xuất hiện trong danh sách gửi thư và Winston đã cho tôi biết. Anh ấy đã tạo một nhánh với cách triển khai chung cho các nhãn hàng đầu. Xem chủ đề tại đây . @hadley: bạn nói đúng. Tôi không biết nó khó làm như thế nào nói chung. Nếu đây không bao giờ xảy ra ... tỏ lòng biết ơn của tôi đối với ggplot vẫn chiếm ưu thế :)
Hendy

1
Tại một số thời điểm, tôi ngừng cố gắng kết thúc R / ggplot2 và thực hiện một số sửa đổi mong muốn bằng trình chỉnh sửa hình ảnh.
Andy

2
bất kỳ cập nhật nào về phương pháp hay nhất ở đây?
Arthur Yip

Câu trả lời:


49

Vì phiên bản mới nhất được ggplot2sử dụng gtabletrong nội bộ nên việc sửa đổi một figure khá dễ dàng:

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)

nhập mô tả hình ảnh ở đây

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


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

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

1
Nếu tôi không nhầm thì giải pháp này không còn hợp lệ nữa vì một số hàm hiện không được dùng nữa.
Remi.b

1
@ Remi.b hãy thử ngay bây giờ
rawr

3
Điều này không hoạt động với ggplot2 3.2.1 và R 3.6.1. Không có thông báo lỗi nhưng tôi không nhận được các nhãn trên biểu đồ kết quả.
Calimo

5

Có thể có một cách tốt hơn để làm điều đó, 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

1

Ngoài phương pháp được nêu bởi kohske, bạn có thể thêm đường viền vào các hộp được thêm bằng cách thay đổi

col=NA

đến

col=gray(0.5), linetype=1

Ngoài ra, hãy thay đổi

fill=gray(0.5)

cho

fill=grey(0.8)

gp=gpar(col=gray(1))

đến

gp=gpar(col=gray(0))

Nếu bạn muốn các thanh mới khớp với các nhãn khía cạnh

I E

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)))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.