改变ggplot默认调色板(change the default colour palette in

2019-06-24 06:53发布

我写了返回颜色名称的载体的功能:

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)
}

我想ggplot使用上述函数生成默认的调色板。 也许只有离散尺度。 使用scale_manual()每次都是太多阻力。 可能吗?

Answer 1:

要重新定义默认的颜色刻度,你也可以只重新定义ggplot功能:

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

用于填充缩放同样的作品。



Answer 2:

@baptiste向我指出出现提及功能的留言板帖子set_default_scale其可用于设置默认调色板。 下面的解决方案只能用旧版本GGPLOT2的工作的。

首先,我们需要产生的颜色名称或代码的功能。 我打电话给我的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)
}

(它接受一个可选的set说法只是为了显示你不是局限于单一的调色板。)好了,现在我们创建了一个“规模”,我把它叫做magazine 。 它是基于ggplot的啤酒规模和代码是相当难看:

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"'))

这里最重要的是确定output_set这是ggplot调用获得颜色名称/代码的功能。 另外,如果你需要额外的参数,这些必须包含在new和更高版本可以为被访问.$argument_name 。 在上面的例子, output_set简单地调用magazine.colours

现在,检查新的规模不实际工作:

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

为了使它的默认,只需使用set_default_scale

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

而这将是它。

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



Answer 3:

只要将你想要的规模的名称的变量:

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

这工作,因为ggplot会从全球环境如果可能的话它的默认尺度,类似于:

get('scale_colour_discrete', envir = globalenv())


文章来源: change the default colour palette in ggplot
标签: r ggplot2