2016-07-15 30 views
7

Tôi có một âm mưu ggplot2 như sau:Khoảng cách giữa các yếu tố truyền thuyết ngang gpplot2

library(ggplot2) 

ggplot(mtcars, aes(factor(cyl), fill=factor(cyl))) + 
    geom_bar() + 
    coord_flip() + 
    theme(legend.position = 'top') + 
    guides(fill = guide_legend(title=NULL)) 

Tôi muốn thêm khoảng cách giữa các yếu tố điền như sau:

enter image description here

+2

Có vẻ như bạn có thể đặt nó bằng thứ gì đó như 'chủ đề (legend.text = element_text (margin = margin (r = 2, unit = 'in')))', nhưng điều đó dường như không làm bất cứ gì. Một cách hacky (nhưng hiệu quả) để làm điều đó là chỉ cần thêm dấu cách vào các mục: 'fill = factor (paste (cyl, ''))' – alistaire

+0

@alistaire, đơn giản hơn nhiều so với hack của tôi. Bạn nên thêm nó làm câu trả lời. – eipi10

+1

Có thể trùng lặp của [Có cách nào để thay đổi khoảng cách giữa các mục chú giải trong ggplot2 không?] (Http://stackoverflow.com/questions/11366964/is-there-a-way-to-change-the-spacing-between -legend-items-in-ggplot2) – user20650

Trả lời

3

Nó thực sự có vẻ giống như theme(legend.text = element_text(margin = margin(r = 2, unit = 'in'))) sẽ là đúng cách để hoàn thành nhiệm vụ, nhưng điều đó không làm gì cả.

Thay vào đó, (và không phải là lần đầu tiên) Tôi rơi trở lại vào phong cách Microsoft Word của sự liên kết-hack, tức là chỉ cần thêm không gian:

ggplot(mtcars, aes(factor(cyl), fill=factor(paste(cyl, '     ')))) + 
    geom_bar() + 
    coord_flip() + 
    theme(legend.position = 'top') + 
    guides(fill = guide_legend(title=NULL)) 

plot with spaced legend

Bởi vì có không gian trên 8 cũng vậy, đó là một chút trung tâm, nhưng nếu bạn chỉ dán chúng vào các nhãn trước đó bạn có thể di chuyển chúng xung quanh như bạn muốn.

Xin lỗi vì bất kỳ cơn ác mộng nào gây ra cho các nhà thiết kế đồ họa.

+2

Có [vấn đề mở về việc sử dụng 'margin' trong' legend.text'] (https://github.com/hadley/ggplot2/issues/1502). – Henrik

+0

Tôi sẽ đánh dấu điều này nhưng âm thanh như thế này sẽ được sửa trong phiên bản ggplot2 trong tương lai. Cảm ơn! –

+0

Tôi tin rằng có một số vấn đề liên quan mở trên github. – lmo

1

Đây là một hack , nhưng ...

Hãy thêm một số mức yếu tố trống trong cyl giữa các cấp thực. Sau đó, chúng tôi sẽ đảm bảo chúng được bao gồm trong cốt truyện (sử dụng drop=FALSE) cho khoảng cách trong chú giải, nhưng sẽ đặt màu và nhãn của chúng thành giá trị trống để bạn không thể nhìn thấy chúng trong chú giải. Tôi thấy rằng tôi cũng cần phải bao gồm override.aes=list(color="white") để tránh các hộp khóa chú giải trống vẫn được hiển thị thường xuyên trong chú giải.

mtcars$cyl = factor(mtcars$cyl, levels=c(4, 11:15, 6, 16:20, 8)) 
cols = hcl(seq(15,375,length.out=4)[1:3], 100, 65) 

ggplot(mtcars, aes(cyl, fill=cyl)) + 
    geom_bar() + 
    coord_flip() + 
    scale_fill_manual(values=c(cols[1], rep("white",5), cols[2], rep("white",5), cols[3]), 
        labels=c(4, rep("",5), 6, rep("",5), 8), drop=FALSE) + 
    theme(legend.position = 'top') + 
    guides(fill = guide_legend(title=NULL, nrow=1, override.aes=list(color="white"))) 

enter image description here

1

Đây là một hack khác nhưng một mà tôi thích, vì nó cho biết thêm không gian màu trắng ở cuối mỗi nhãn theo số lượng ký tự. Thay thế fill = factor(cyl) bằng

fill = sprintf("%-20s", factor(cyl)).

Miếng đệm này tất cả các chuỗi trong vectơ có các ký tự trắng ở bên phải để đạt tổng số 20 ký tự. Điều này là hoàn hảo nếu bạn có nhãn văn bản có độ dài khác nhau. Bạn có thể thay đổi 20 thành bất kỳ số nào bạn muốn hoặc xóa dấu trừ để thêm dấu cách ở bên trái thay vì bên phải. Nói chung, sprintf() là một chức năng tốt để khám phá và sử dụng để định dạng văn bản và số như mong muốn.

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