2015-04-09 20 views
9

Làm cách nào để tạo ggplot2 cho một chú thích riêng biệt cho các vị trí khác nhau. Tôi muốn 3 truyền thuyết, một cho z, ab, nhưng & b dường như được kết hợp thành huyền thoại đơn ngay cả khi & b đại diện cho các biến khác nhau. Tôi cũng muốn có thể kiểm soát màu sắc trong mỗi huyền thoại.ggplot2: Gán màu cho 2 loại khác nhau và nhận 2 chú thích khác nhau

dat <- data.frame(
    y = rnorm(200), 
    x = sample(c("A", "B"), 200, TRUE), 
    z = sample(100:200, 200, TRUE), 
    a = sample(c("male", "female"), 200, TRUE), 
    b = factor(sample(1:2, 200, TRUE)) 
) 

ggplot(dat, aes(y = y, x = x)) + 
    geom_point(aes(color = a, size = z)) + 
    geom_boxplot(fill = NA, size=.75, aes(color=b)) + 
    scale_color_manual(values = c("#F8766D", "#00BFC4", "orange", "purple")) 

enter image description here

+0

Có lẽ một cách dễ dàng hơn nhưng bạn có thể làm hai lô và sau đó kết hợp những huyền thoại ... http://stackoverflow.com/questions/26727741/how-to-show-a-legend -on-kép-y-axis-ggplot/26742226 # 26742226 – user20650

+0

@ user20650 Tôi đã nghĩ về điều đó và sẽ đi tuyến đường đó nếu cần nhưng có vẻ như sẽ có một cách dễ dàng hơn. –

+0

Tôi có thể thấy lý do tại sao bạn muốn có riêng biệt, nhưng đối với bất kỳ thẩm mỹ khác, (minh bạch, kích thước, hình dạng, thanh màu, vv), nó không có ý nghĩa để tách chúng ra. ví dụ, độ trong suốt 0-25 là một biến và biến số khác là 26-50, nó là cùng một tỷ lệ. tất nhiên màu sắc có thể rời rạc hơn, vì vậy đó là cách nó có thể có ý nghĩa hơn .. chỉ là ý tưởng của tôi là tại sao điều này không thẳng thắn. hadley là rất cụ thể về ggplot của mình – rawr

Trả lời

10

Nếu bạn sử dụng một biểu tượng âm mưu đầy, bạn có thể ánh xạ một yếu tố để điền và khác màu, sau đó tách chúng thành hai quy mô và, do đó, huyền thoại.

ggplot(dat, aes(y = y, x = x)) + 
    geom_point(aes(fill = a, size = z), pch = 21) + 
    geom_boxplot(fill = NA, size=.75, aes(color=b)) + 
    scale_color_manual(values = c("orange", "purple")) + 
    scale_fill_manual(values = c("#F8766D", "#00BFC4")) 

enter image description here

+0

Cảm ơn. Đối với tình huống cụ thể này, tôi nghĩ rằng phương pháp này là đơn giản và những gì hầu hết mọi người sẽ lựa chọn. –

2

vẻ như là cách tiếp cận chụp huyền thoại là khái quát nhất trong các tình huống tương tự, mặc dù trong cụ thể này trên @ jennybryan là đơn giản và có lẽ những gì hầu hết mọi người muốn. Tôi cũng ghi lại cách tiếp cận truyền thuyết ở đây. Lần đầu tiên tôi học cách tiếp cận này từ @Sandy Muspratt HERE.

enter image description here

dat <- data.frame(
    y = rnorm(200), 
    x = sample(c("A", "B"), 200, TRUE), 
    z = sample(100:200, 200, TRUE), 
    a = sample(c("male", "female"), 200, TRUE), 
    b = factor(sample(1:2, 200, TRUE)) 
) 

if (!require("pacman")) install.packages("pacman") 
pacman::p_load(ggplot2, grid, gridExtra, gtable) 

coldot <- ggplot(dat, aes(y = y, x = x)) + 
    geom_point(aes(color = a, size = z)) + 
    #geom_boxplot(fill = NA, size=.75, aes(color=b)) + 
    scale_color_manual(values = c("#F8766D", "#00BFC4")) 

colbox <- ggplot(dat, aes(y = y, x = x)) + 
    #geom_point(aes(color = a, size = z)) + 
    geom_boxplot(fill = NA, size=.75, aes(color=b)) + 
    scale_color_manual(values = c("orange", "purple")) 



leg1 <- gtable_filter(ggplot_gtable(ggplot_build(coldot)), "guide-box") 
leg1Grob <- grobTree(leg1) 

leg2 <- gtable_filter(ggplot_gtable(ggplot_build(colbox)), "guide-box") 
leg2Grob <- grobTree(leg2) 


noleg <- ggplot(dat, aes(y = y, x = x)) + 
    geom_point(aes(color = a, size = z)) + 
    geom_boxplot(fill = NA, size=.75, aes(color=b), position=position_dodge(1)) + 
    scale_color_manual(values = c("orange", "purple", "#F8766D", "#00BFC4")) + 
    theme(
     plot.margin = unit(c(5.1, 4.1, 4.1, 2.1), "pt"), 
     legend.position=c(1.3, 0.87) 
    ) + 
    guides(color = FALSE) 

legs <- ggplot(data = data.frame(x=1, y=1)) + 
    geom_blank(aes(x=x, y=y)) + 
    theme_minimal() + 
    ylab(NULL) + xlab(NULL) + 
    theme(
     axis.text = element_blank(), 
     axis.ticks = element_blank(), 
     panel.grid.major = element_blank(), 
     panel.grid.minor = element_blank() 
    ) + 
    annotation_custom(leg1Grob, xmin=1, xmax=1, ymin=.95, ymax=1.3) + 
    annotation_custom(leg2Grob, xmin=.6, xmax=.8, ymin=.75, ymax=1) 

out <- arrangeGrob(noleg, legs, ncol=2, widths=c(.85, .15)) 
print(out) 
Các vấn đề liên quan