2012-05-08 38 views
19

Tôi đã viết một hàm trả về một vector của tên màu:thay đổi bảng màu mặc định trong ggplot

custom.colors <- function(n) { 
    palette <- c("dodgerblue1", "skyblue4", "chocolate1", "seagreen4", 
       "bisque3", "red4", "purple4", "mediumpurple3", 
       "maroon", "dodgerblue4", "skyblue2", "darkcyan", 
       "darkslategray3", "lightgreen", "bisque", 
       "palevioletred1", "black", "gray79", "lightsalmon4", 
       "darkgoldenrod1") 
    if (n > length(palette)) 
    warning('palette has duplicated colours') 
    rep(palette, length.out=n) 
} 

Tôi muốn ggplot để sử dụng chức năng trên để tạo ra các bảng theo mặc định. Có lẽ chỉ cho các quy mô rời rạc. Sử dụng scale_manual() mỗi lần kéo quá nhiều. Có thể không?

+6

[này bài đăng] (http://groups.google.com/group/ggplot2-dev/browse_thread/thread/fc838059c281e835?pli=1) sẽ hữu ích. – baptiste

+0

Cảm ơn. Tôi sẽ giữ nó cho sau này, nhưng bây giờ tôi đang mắc kẹt với phiên bản 0.8.9. –

Trả lời

5

@baptiste chỉ cho tôi một bài đăng trên bảng thông báo đề cập đến chức năng set_default_scale có thể được sử dụng để đặt bảng màu mặc định. Tuy nhiên, giải pháp sau chỉ hoạt động với các phiên bản cũ của ggplot2.

Trước tiên, chúng tôi cần một hàm sản xuất tên hoặc mã màu. Tôi gọi tôi magazine.colours:

magazine.colours <- function(n, set=NULL) { 
    set <- match.arg(set, c('1', '2')) 
    palette <- c("red4", "darkslategray3", "dodgerblue1", "darkcyan", 
       "gray79", "black", "skyblue2", "dodgerblue4", 
       "purple4", "maroon", "chocolate1", "bisque3", "bisque", 
       "seagreen4", "lightgreen", "skyblue4", "mediumpurple3", 
       "palevioletred1", "lightsalmon4", "darkgoldenrod1") 
    if (set == 2) 
    palette <- rev(palette) 
    if (n > length(palette)) 
    warning('generated palette has duplicated colours') 
    rep(palette, length.out=n) 
} 

(Nó chấp nhận một tùy chọn set tranh luận chỉ để chứng minh rằng bạn không bị giới hạn vào một bảng duy nhất.) Ok, bây giờ chúng ta tạo ra một "quy mô", mà tôi gọi là magazine. Nó dựa trên quy mô bia ggplot và mã là khá xấu xí:

ScaleMagazine <- proto(ScaleColour, expr={ 
    objname <- 'magazine' 
    new <- function(., name=NULL, set=NULL, na.colour='yellowgreen', 
        limits=NULL, breaks = NULL, labels=NULL, 
        formatter = identity, variable, legend = TRUE) { 
    b_and_l <- check_breaks_and_labels(breaks, labels) 
    .$proto(name=name, set=set, .input=variable, .output=variable, 
      .labels = b_and_l$labels, breaks = b_and_l$breaks, 
      limits= limits, formatter = formatter, legend = legend, 
      na.colour = na.colour) 
    } 
    output_set <- function(.) { 
    missing <- is.na(.$input_set()) 
    n <- sum(!missing) 
    palette <- magazine.colours(n, .$set) 
    missing_colour(palette, missing, .$na.colour) 
    } 
    max_levels <- function(.) Inf 
}) 
scale_colour_magazine <- ScaleMagazine$build_accessor(list(variable = '"colour"')) 
scale_fill_magazine <- ScaleMagazine$build_accessor(list(variable = '"fill"')) 

Điều quan trọng ở đây là xác định output_set đó là chức năng mà ggplot cuộc gọi để có được tên màu/mã. Ngoài ra, nếu bạn cần thêm đối số, những đối số đó phải được bao gồm trong new và sau đó có thể được truy cập dưới dạng .$argument_name. Trong ví dụ trên, output_set chỉ cần gọi magazine.colours.

Bây giờ, kiểm tra quy mô mới không thực sự làm việc:

qplot(mpg, wt, data=mtcars, shape=21, 
     colour=factor(carb), fill=factor(carb)) + 
    scale_colour_magazine(set='1') + 
    scale_fill_magazine(set='1') 

Để làm cho nó mặc định, chỉ cần sử dụng set_default_scale.

set_default_scale("colour", "discrete", "magazine") 
set_default_scale("fill", "discrete", "magazine") 

Và đó sẽ là nó.

> qplot(mpg, wt, data=mtcars, colour=factor(carb), fill=factor(carb)) 

plot showing the new palette

15

Để xác định lại quy mô màu mặc định, bạn cũng có thể chỉ xác định lại chức năng ggplot:

ggplot <- function(...) ggplot2::ggplot(...) + scale_color_brewer(palette="Spectral") 

Các công trình tương tự cho các quy mô điền.

+0

Đơn giản và đẹp mắt. – Peque

+6

có thể sẽ gây ra sự cố khi bạn ánh xạ biến liên tục thành màu – baptiste

3

Đơn giản chỉ cần gán một biến với tên của quy mô mong muốn của bạn:

scale_colour_discrete <- function(...) 
    scale_colour_manual(..., values = c('dodgerblue1', *)) 

này hoạt động từ năm ggplot sẽ mất cân mặc định của nó từ môi trường toàn cầu nếu có thể, tương tự như:

get('scale_colour_discrete', envir = globalenv()) 
Các vấn đề liên quan