2011-12-14 29 views
16

Tôi đang cố gắng để phù hợp với màu sắc ngoại thất của boxplot với màu tô được thiết lập bởi thẩm mỹ (scale_colour_discrete).Boxplot, làm thế nào để phù hợp với màu sắc của các ngoại lệ để lấp đầy thẩm mỹ?

Đây là một ví dụ.

m <- ggplot(movies, aes(y = votes, x = factor(round(rating)), 
    fill=factor(Animation))) 
m + geom_boxplot() + scale_y_log10() 

Điều này tạo ra cốt truyện bên dưới. Làm cách nào để thay đổi những chấm đen đó thành màu đỏ/xanh lục được sử dụng trong cơ thể? outlier.colour tùy chọn của boxplot dường như chọn một màu trên, và không phải là thẩm mỹ, nếu tôi hiểu một cách chính xác. Tôi không nhớ bằng cách sử dụng màu thẩm mỹ nếu điều đó giúp.

Original Version


Edit:

Phỏng this solution (Changing whisker definition in geom_boxplot). Dodging ngang được thiết lập lại bởi stats_summary và tôi không thể tìm ra cách để lấy lại nó. Tôi muốn thả roi ra ngoài và ria da căng khi cần thiết vì tôi biết làm thế nào bây giờ.

# define the summary function 
f <- function(x) { 
    r <- quantile(x, probs = c(0.05, 0.25, 0.5, 0.75, 0.95)) 
    names(r) <- c("ymin", "lower", "middle", "upper", "ymax") 
    r 
} 
# define outlier function, beyound 5 and 95% percentiles 
o <- function(x) { 
    subset(x, x < quantile(x,probs=c(0.05))[1] | quantile(x,probs=c(0.95))[1] < x) 
} 

m <- ggplot(movies, aes(y = votes, x = factor(round(rating)), 
    colour=factor(Animation))) 
m <- m + stat_summary(fun.data=f, geom='boxplot') 
m <- m + stat_summary(fun.y=o, geom='point', aes(colour=factor(Animation))) 
m + scale_y_log10() 

Failed attempt

+1

này là không thể với bản phát hành hiện tại nhưng sẽ có thể có trong phiên bản tiếp theo. – kohske

+0

@kohske, có thể bạn vẫn có thể đưa ra câu trả lời trong nhận xét của mình. Nếu yosukesabai chấp nhận câu trả lời này thì rõ ràng đối với cộng đồng SO rằng câu hỏi này được giải quyết. (và nó nhận được của bạn một số đại diện :)). –

+0

Thực ra tôi đã tìm thấy câu trả lời của kohske ["Thay đổi định nghĩa râu trong geom_boxplot"] (http://stackoverflow.com/questions/4765482/changing-whisker-definition-in-geom-boxplot), có thể được điều chỉnh để giải quyết vấn đề của tôi. Hy vọng nó sẽ không được quá khó chịu ... – yosukesabai

Trả lời

9

Như @koshke nói, có giá trị ngoại biên có màu giống như các dòng của hộp (không phải là màu fill) bây giờ đã dễ dàng có thể bằng cách thiết lập outlier.colour = NULL:

m <- ggplot(movies, aes(y = votes, x = factor(round(rating)), 
    colour = factor(Animation))) 
m + geom_boxplot(outlier.colour = NULL) + scale_y_log10() 

boxplot with coloured outliers

  • outlier.colour phải được viết với "ou"
  • outlier.colour phải bên ngoài aes()

Tôi gửi bài này như một câu trả lời muộn vì tôi thấy mình tìm kiếm này lên một lần nữa và một lần nữa, và tôi cũng đã đăng nó cho câu hỏi liên quan Coloring boxplot outlier points in ggplot2?.

+0

tôi đã cố kiểm tra câu trả lời của bạn hoạt động trước khi tôi chấp nhận câu trả lời của bạn, nhưng bằng cách nào đó, cài đặt R của tôi bị vặn. tôi tin tưởng bạn và chỉ làm cho nó chấp nhận câu trả lời! – yosukesabai

+0

@yosukesabai: không vội vàng chấp nhận câu trả lời muộn cho câu hỏi cũ. Hy vọng bạn đã cài đặt của bạn hoạt động trở lại. – cbeleites

+0

Lưu ý rằng điều này không phù hợp với màu tô, vì tiêu đề của OP sẽ gợi ý, nhưng nó phù hợp với màu đường viền/đường kẻ - đó là những gì tôi cần. +1 – RyanStochastic

4

Tôi tìm thấy một cách để làm điều này, chỉnh sửa đối tượng lưới thô.

library(ggplot2) 

match.ol.col <- function(plt,aes.cp='fill') { 
    # matches outliers' color to either fill or colour aesthetics 
    # plt: ggplot layer object having boxplot 
    # aes.cp: aetsthetic from which copy color. must be either 'fill' or 'col' 
    # returns grid objects, so print it wigh grid.draw(), not print() 
    if (aes.cp %in% c('color', 'colour')) aes.cp <- 'col' 
    grob <- ggplotGrob(plt) 
    bps <- getGrob(grob, 'boxplots', grep=T) 
    for (bp in bps$children) { 
    p <- getGrob(bp, 'point', grep=T) 
    if (is.null(p)) next 
    r <- getGrob(bp, 'rect', grep=T) 
    grob <- geditGrob(grob, p$name, gp=gpar(col=r$gp[[aes.cp]])) 
    } 
    return(grob) 
} 


m <- ggplot(movies, aes(y = votes, x = factor(round(rating)), 
    colour=factor(Animation))) 
p <- m + geom_boxplot() + scale_y_log10() 

grob <- match.ol.col(p, aes.cp='colour') 
grid.draw(grob) 

kết quả:

demobox.png

5

Tôi đã tìm thấy giải pháp cho việc cài đặt geom_boxplot(outlier.colour = NULL) không hoạt động nữa trong các phiên bản mới nhất của R (@jonsnow nói về phiên bản 1.0.0 của ggplot2).

Để tái tạo các hành vi đó @cbeleites propsed bạn chỉ cần sử dụng đoạn mã sau:

update_geom_defaults("point", list(colour = NULL)) 
m <- ggplot(movies, aes(y = votes, x = factor(round(rating)), 
      colour = factor(Animation))) 
m + geom_boxplot() + scale_y_log10() 

như mong đợi này tạo ra âm mưu với điểm phù hợp với màu đường.

Dĩ nhiên ta nên nhớ để khôi phục lại mặc định nếu anh ta cần phải vẽ nhiều lô:

update_geom_defaults("point", list(colour = "black")) 

Các giải pháp đã được tìm thấy bằng cách đọc các ggplot2 changelog trên github:

Các giá trị ngoại biên của geom_boxplot() sử dụng màu, kích thước và hình dạng mặc định từ geom_point(). Thay đổi các giá trị mặc định của geom_point() bằng update_geom_defaults() sẽ áp dụng các thay đổi tương tự cho các ngoại lệ của geom_boxplot(). Thay đổi các giá trị mặc định cho các ngoại lệ trước đây không phải là . (@ThierryO, # 757)

văn ở đây cũng như: Coloring boxplot outlier points in ggplot2?

1

Tôi đã có một vấn đề rất giống nhau. Tôi muốn phù hợp với phong cách với một cốt truyện trước đó, vì vậy muốn viền màu đen với màu tô, và phù hợp với ngoại lệ.

giải pháp của tôi là quá mức in, một lần với color = và điểm vòng tròn rắn mặc định, và một lần với fill = và một vòng tròn mở điểm hình dạng

p <- ggplot(mtcars, aes(factor(cyl), mpg)) 
p + geom_boxplot(aes(colour=factor(cyl))) + 
    geom_boxplot(aes(fill=factor(cyl)), outlier.shape=21) 

boxplot with coloured fill, and black borders and median line

+0

bạn cũng có thể thực hiện 'outlier.colour = NA' trong lệnh gọi' geom_boxplot' thứ hai. – bmayer

+0

Với 'ggplot2' 2.2.1, tôi thấy rằng không cần in quá mức. 'p + geom_boxplot (aes (fill = factor (cyl)), outlier.hình dạng = 21) 'là đủ để có được một màu điền vào các chấm bên ngoài phù hợp với điền vào ô. –

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