2016-08-26 20 views
6

Có thể có các chủ đề dải độc lập cho mỗi biến được sử dụng trong ggplot2 facet_wrap không?Chủ đề dải độc lập cho ggplot2 facet_wrap sử dụng nhiều hơn một biến

Đi đoạn mã này là một ví dụ:

p1 <- ggplot(mpg, aes(displ, hwy)) + 
    geom_point() + 
    facet_wrap(c("cyl", "drv"), labeller = "label_both") 
plot(p1) 

Plot output

tôi muốn có dải trên ('cyl') với một chủ đề khác nhau - chẳng hạn, in đậm. Ngoài ra, tôi có thể muốn làm cho 'drv' nghiêng và với một loại phông chữ khác nhau và kích thước. Làm thế nào tôi có thể làm điều đó?

Tôi đã suy nghĩ điều gì đó trong dòng:

p1 <- p1 + theme(strip.text.variable1 = element_text(face = 'bold'), 
        strip.text.variable2 = element_text(face = 'italic', size = 8) 
       ) 

Thật không may, tôi không thể tìm thấy bất cứ điều gì như thế này trong các tài liệu hoặc các câu hỏi trước.

Cheers

Edit: Tôi đã hỏi một chút tổng quát hơn để được giúp đỡ hơn nữa cho cộng đồng.

+2

[Làm thế nào để sử dụng cỡ chữ khác nhau trong nhãn khía cạnh bọc ggplot?] (Http://stackoverflow.com/questions/36334486/how-to-use-different-font-sizes- in-ggplot-facet-wrap-labels) có vẻ có liên quan. – Henrik

Trả lời

3

Bề ngoài bạn sẽ có thể để thực hiện một chức năng mới dựa trên label_both trở nhãn đậm, nhưng cho đến nay những nỗ lực của tôi đã kết thúc với sự sợ hãi Error in variable[[i]] : subscript out of bounds.

Một giải pháp thay thế cho điều này là tạo một hàm để tạo nhãn bạn muốn. Điều này giống như this answer. Trong hàm này, bạn thêm tiền tố vào các giá trị của biến và làm cho chúng đậm.

make_labels = function(string, prefix = "cyl: ") { 
    x = paste0(prefix, as.character(string)) 
    do.call(expression, lapply(x, function(y) bquote(bold(.(y))))) 
} 

Bây giờ hãy sử dụng hàm này trong vòng as_labeller cho biến "cyl" trong facet_wrap. Bạn muốn thay đổi labeller mặc định trong phạm vi as_labeller thành label_parsed để biểu thức được phân tích cú pháp chính xác. Sử dụng label_both cho biến số khác.

ggplot(mpg, aes(displ, hwy)) + 
    geom_point() + 
    facet_wrap(c("cyl", "drv"), 
       labeller = labeller(cyl = as_labeller(make_labels, default = label_parsed), 
            drv = label_both)) 

enter image description here

+0

Đó chắc chắn là một lối thoát, cảm ơn. Tuy nhiên, tôi bị mắc kẹt với việc sử dụng tham số 'label_both' cho" cyl "để neo cuộc gọi' prefix = "cyl:" '. Sẽ rất thú vị khi sử dụng hàm này miễn phí các ràng buộc (ví dụ: với 'label_value', thay vào đó). –

+0

Tôi đồng ý rằng sẽ không tốt nếu bạn không viết mã cho labeller của mình (mặc dù bạn không phải sử dụng '" cyl: "', sử dụng tên biến của bạn). Tôi không hoàn toàn tuân theo câu thứ hai của bạn, vì hàm tôi viết đặc biệt có nghĩa là được sử dụng với 'label_parsed' để sử dụng' bold'. – aosmith

+0

Vâng, ý tôi là '" cyl: "' chỉ là một ví dụ (trong trường hợp của tôi là '" phương thức: "'). Xin lỗi nếu tôi không rõ về câu thứ hai. Những gì tôi có nghĩa là để nói rằng giải pháp này chỉ hoạt động nếu chúng ta đặt tên một biến rõ ràng trong hàm (và nó được bao gồm trong dải chính nó) - nó sẽ là tốt cho nó để làm việc nếu tôi không muốn "cyl : 4 "," cyl: 5 "," cyl 6 "," cyl: 8 "trong văn bản dải, chỉ" 4 "," 5 "," 6 "và" 8 ". –

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