2015-02-21 40 views
5

Khi sử dụng facet_grid, ggplot2 chia các danh mục chính tạo nên các biến khía cạnh với một đường trắng rộng hơn bình thường. Điều này phục vụ hầu hết các mục đích tốt. Đôi khi tôi muốn hiển thị rõ ràng hơn các phân chia giữa các phân loại chính này và muốn làm bóng phân chia khía cạnh với một màu khác. Có cách nào làm được việc này không? Cảm ơn.Làm thế nào để thay đổi màu sắc của các đường viền khía cạnh khi sử dụng facet_grid

Trả lời

6

Mặc dù một năm cuối, tôi thấy đây là một sửa chữa dễ dàng:

ggplot(mpg, aes(cty, hwy, color = factor(year)))+ 
    geom_point()+ 
    facet_grid(cyl ~ drv) + 
    theme(panel.margin=unit(.05, "lines"), 
     panel.border = element_rect(color = "black", fill = NA, size = 1), 
     strip.background = element_rect(color = "black", size = 1)) 

facet wrap example

+0

Điều này trông giống như một giải pháp đơn giản, nhưng tôi không nghĩ rằng nó có thể khái quát hóa cho tất cả các tình huống. Điều gì sẽ xảy ra nếu bạn muốn có thêm không gian giữa các bảng? Hoặc thậm chí là biên lợi nhuận mặc định? Kích thước đường biên của bảng điều khiển cần phải được tăng lên. Nhưng sau đó các đường biên dày hơn được vẽ bên trong và bên ngoài bảng điều khiển.Không chỉ cốt truyện trông xấu xí, người ta cuối cùng cũng mất thông tin; ví dụ, với một dòng đủ dày, các điểm trên cùng bên phải trong bảng điều khiển giữa ở hàng trên cùng biến mất dưới đường ranh giới. –

+0

Hoặc, người ta muốn một màu khác với màu đen? –

+0

ok, có một số điều bạn có thể làm bằng cách điều chỉnh các biến trong chủ đề **() **: * Thay đổi màu trong element_rect (color = "black" ...) cho cả ** panel.border ** và * * strip.background ** * Tăng khoảng cách bằng cách tăng ** panel.margin = unit (.05, "lines") ** Để giải quyết vấn đề đường dày bao phủ các điểm, bạn có thể thay đổi x & y giới hạn của các ô – yake84

0

Hãy thử điều này - bạn có thể kiểm soát điều này với strip.background, được định dạng bằng cuộc gọi element_rect.

qplot (Hwy, cty, data = mpg) + facet_grid (. ~ Nhà sản xuất) +
chủ đề (strip.text.x = element_text (size = 8, color = "red", góc = 90), strip.background = element_rect (điền = "DARKBLUE", color = NA))

+0

Đó độc đáo màu sắc của nền hình chữ nhật nơi nhãn khía cạnh xuất hiện nhưng không thay đổi khoảng trống giữa các loại - các đường màu trắng chạy chiều dài của ô tách các nhóm mặt. –

2

Bạn có thể cần phải sử dụng ggplot 's bảng bố trí và gtable chức năng.

library(ggplot2) 
library(gtable) 
library(grid) 

p <- ggplot(mtcars, aes(mpg, wt)) + geom_point() + 
    facet_grid(am ~ cyl) 
## Get the plot grob 
gt <- ggplotGrob(p) 

## Check the layout 
gtable_show_layout(gt) # Vertical gaps are in columns 5 and 7 
         # and span rows 4 to 9 
         # Horizontal gap is in row 8 
         # and spans columns 4 to 9 


## To automate the selection of the relevant rows and columns: 
## Find the panels in the layout 
## (t, l, b, r refer to top, left, bottom, right); 
## The gaps' indices are one to the right of the panels' r index (except the right most panel); 
## and one below the panels' b index (except the bottom most panel); 
## Rmin and Rmax give the span of the horizontal gap; 
## Bmin and Bmax give the span of the vertical gap; 
## cols and rows are the columns and row indices of the gaps. 

panels = subset(gt$layout, grepl("panel", gt$layout$name), t:r) 

# The span of the horizontal gap 
Rmin = min(panels$r) 
Rmax = max(panels$r) + 1 

#The span of the vertical gap 
Bmin = min(panels$t) - 1 
Bmax = max(panels$t) 

# The columns and rows of the gaps 
cols = unique(panels$r)[-length(unique(panels$r))] + 1 
rows = unique(panels$t)[-length(unique(panels$t))] + 1 

# The grob - orange rectangle 
g = rectGrob(gp = gpar(col = NA, fill = "orange")) 

## Add orange rectangles into the vertical and horizontal gaps 
gt <- gtable_add_grob(gt, 
     rep(list(g), length(cols)), 
     t=Bmin, l=cols, b=Bmax) 

gt <- gtable_add_grob(gt, 
     rep(list(g), length(rows)), 
     t=rows, l=Rmin, r=Rmax) 

## Draw it 
grid.newpage() 
grid.draw(gt) 

enter image description here

+0

Điều này thực sự tuyệt vời. Tôi tự hỏi nếu cách tiếp cận này sẽ cho phép sửa đổi một đối tượng 'ggplot' sẽ dẫn đến một đối tượng' ggplot' khác có thể có các lớp 'ggplot' được thêm vào trong một bước sau. Trên một lưu ý không liên quan, tôi đã gặp rắc rối khi thêm các chú thích trong các đối tượng 'ggplot' và giữ chúng là lớp' ggplot'. Tôi đã thử tất cả các phương pháp được liệt kê ở nơi khác trên stackoverflow. Có thể 'gtable' là một cách tiếp cận thay thế? –

+1

Tôi nghĩ câu trả lời cho câu hỏi của bạn sẽ là "có". 'gtable' cho phép một số sửa đổi phức tạp đối với các ggplots ban đầu. Ví dụ: người ta có thể thêm hàng và cột vào bố cục ggplot, sau đó chèn các cột vào chúng. @baptiste đã tổng hợp một số ghi chú tại [https://github.com/baptiste/gtable/wiki/Description](https://github.com/baptiste/gtable/wiki/Description) –

+0

Nói chung tôi sẽ có các ô với số lượng các hàng/cột khía cạnh khác nhau. Bạn có thể nghĩ ra một cách nhạy cảm với dữ liệu để chỉ định 'Rmin' và' Bmin' không? –

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