2016-03-01 17 views
6

Có cách nào để thay đổi chiều cao/độ dài của trục y cho các mặt riêng lẻ trong một facet_grid hoặc facet_wrap không?Điều chỉnh không gian tương đối của các bảng trong một mặt lưới/facet_wrap trong ggplot2

Ví dụ,

library(ggplot2) 
ggplot(economics_long[economics_long$variable %in% c("pop", "uempmed"),], aes(date, value)) + 
    geom_line() + 
    facet_grid(variable~., scales = "free_y") + 
    theme(strip.background = element_blank()) 

enter image description here

Trong cốt truyện trên, tôi muốn thời gian pop chiều cao loạt trục y/chiều dài là, nói, hai lần lớn như các uempmed y- chiều dài trục (2: 1), bất kể thực tế hai chuỗi thời gian có thang y trục khác nhau.

Giống như những gì Kohske làm ở đây, trong một phiên bản cũ hơn của ggplot2, mà không làm việc trong ggplot> = 2.0.0:

https://kohske.wordpress.com/2010/12/25/adjusting-the-relative-space-of-a-facet-grid/

Tôi biết tôi có thể xác định đối số space = "free" trong facet_grid , nhưng tôi không nghĩ rằng đối số có thể được sử dụng để thiết lập một tỷ lệ trục y 2: 1?

Tôi cũng không muốn sử dụng giải pháp "grid.arrange" để xếp các gg được tạo riêng biệt (nơi tôi có thể tạo 2 ô riêng biệt với độ dài trục y khác nhau), vì tôi lý tưởng muốn làm sử dụng các tính năng ggplot2 tương tác của Shiny trong một ô facet_wrap đơn lẻ này (ví dụ: ví dụ về mặt bóng sáng tương tác với bàn chải nằm cách nửa trang dưới đây: http://shiny.rstudio.com/articles/selecting-rows-of-data.html).

+1

Bạn đã bao giờ tìm thấy một giải pháp cho vấn đề của bạn? Tôi hỏi khi tôi có cùng một câu hỏi. Và phải làm gì khi bạn có 3 lưới và bạn muốn chúng theo tỷ lệ (2, 1, 1). Nó là khá dễ dàng để làm với grid_extra và tham số chiều cao, nhưng họ không sắp xếp tốt theo chiều dọc – Franky

+0

Thật không may chưa. Có lẽ có một cách để nó, đặc biệt là với các bản cập nhật để ggplot2 trong năm qua hay như vậy nhưng tôi không nhận thức được nó. Đoán của tôi là có lẽ vẫn cần triển khai trong nguồn ggplot2, điều mà tôi không hề quen thuộc. – FXQuantTrader

Trả lời

1

Có nhiều tùy chọn.

Với facets, bạn có thể sử dụng facet_grid(..., space='free_y') để có chiều cao của mỗi hàng được điều chỉnh theo chiều dài của thang y. Tuy nhiên, trong tập dữ liệu của bạn, hàng dưới cùng được thu nhỏ thành một dòng đơn (0-25 so với 200.000 - 320.000).

Khi đối tượng ggplot2 được vẽ/in, đầu tiên chúng được chuyển đổi thành gtable đối tượng. Lưu âm mưu của bạn dưới dạng p, chúng tôi có thể gọi ggplotGrob để nhận đối tượng gtable. Đây là thủ tục một chiều; sau khi chuyển đổi, bạn không thể chuyển đổi gtable trở lại đối tượng ggplot2!

(g <- ggplotGrob(p)) 
TableGrob (12 x 8) "layout": 18 grobs 
    z   cells  name         grob 
1 0 (1-12, 1- 8) background  rect[plot.background..rect.3766] 
2 1 (6- 6, 4- 4) panel-1-1    gTree[panel-1.gTree.3696] 
3 1 (8- 8, 4- 4) panel-1-2    gTree[panel-2.gTree.3711] 
4 3 (5- 5, 4- 4) axis-t-1       zeroGrob[NULL] 
5 3 (9- 9, 4- 4) axis-b-1 absoluteGrob[GRID.absoluteGrob.3725] 
6 3 (6- 6, 3- 3) axis-l-1 absoluteGrob[GRID.absoluteGrob.3733] 
7 3 (8- 8, 3- 3) axis-l-2 absoluteGrob[GRID.absoluteGrob.3741] 
8 3 (6- 6, 6- 6) axis-r-1       zeroGrob[NULL] 
9 3 (8- 8, 6- 6) axis-r-2       zeroGrob[NULL] 
10 2 (6- 6, 5- 5) strip-r-1       gtable[strip] 
11 2 (8- 8, 5- 5) strip-r-2       gtable[strip] 
12 4 (4- 4, 4- 4)  xlab-t       zeroGrob[NULL] 
13 5 (10-10, 4- 4)  xlab-b titleGrob[axis.title.x..titleGrob.3714] 
14 6 (6- 8, 2- 2)  ylab-l titleGrob[axis.title.y..titleGrob.3717] 
15 7 (6- 8, 7- 7)  ylab-r       zeroGrob[NULL] 
16 8 (3- 3, 4- 4) subtitle zeroGrob[plot.subtitle..zeroGrob.3763] 
17 9 (2- 2, 4- 4)  title  zeroGrob[plot.title..zeroGrob.3762] 
18 10 (11-11, 4- 4) caption zeroGrob[plot.caption..zeroGrob.3764] 

Tất cả các yếu tố được thiết lập trong bố cục giống như lưới. Chiều cao của mỗi hàng trong cách bố trí được cho bởi g$heights:

> g$heights 
[1] 5pt     0cm     0cm     0cm     0cm     1null    5pt     1null    0.396281911581569cm 1grobheight   
[11] 0cm     5pt  

trận đấu tọa độ của 'bảng điều khiển-1-1' và 'bảng điều khiển-1-2' đến những tầm cao, và bạn sẽ tìm thấy 6 và yếu tố thứ 8 đều là 1null. Bạn có thể thay đổi chúng thành bất kỳ đơn vị, cm, in, pt, ... Các 1null chỉ đơn giản là những gì còn lại sau khi các yếu tố khác, và chia cho chúng. Vì vậy, chúng ta có thể thay đổi heigth 6 đến 2null (chú ý sử dụng dấu ngoặc kép):

> g$heights[[6]] <- unit(2, 'null') 
> grid.draw(g) 

enter image description here

+0

Cảm ơn, tôi biết cách tiếp cận này để tạo các ggplots (tôi đã đề cập đến các giải pháp kiểu 'grid.arrange' trong câu hỏi). Nhưng tôi không nghĩ rằng điều này thực sự trả lời câu hỏi cụ thể của tôi ... Tôi muốn cuối cùng có thể điều chỉnh trục y trong facet_wrap, vì vậy tôi có thể sử dụng các biểu đồ ggplot2 tương tác trong Shiny ... Xem ví dụ về điểm được đánh dấu với 'facet_wrap' trong liên kết rstudio tôi có trong câu hỏi. Tôi không nhận thức được một cái gì đó như thế này thậm chí có thể sử dụng 'grob's – FXQuantTrader

+0

Nó không rõ ràng làm thế nào brushedPoints hoạt động; tôi đoán là nó không nhận ra các điểm riêng lẻ trên cốt truyện, nhưng ngoại suy các toạ độ x và y được bao phủ, và trả về bất kỳ điểm nào từ data.frame đã cho nằm trong vùng đó. Lưu ý rằng hàm không đọc data.frame từ đối tượng ggplot, nhưng phải được cho nó một cách rõ ràng; ngoài ra bạn phải xác định các khía cạnh nào đang được sử dụng. Bạn sẽ có rất nhiều công việc cắt giảm cho bạn nếu bạn cố gắng kết hợp hai chức năng này theo cách bạn đang cố gắng; thay vào đó hãy thử sử dụng hai tiện ích âm mưu đầu ra riêng biệt. – MrGumble

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