ggplot:如何创建一个自动适合数据的离散调色板?

时间:2012-12-21 18:26:08

标签: r ggplot2

我有一个自定义的功能,我用于所有情节而不是普通ggplot

my_ggplot <- function(...){
    ggplot(...) +
    theme_bw() +
    scale_colour_manual(values=get_palette(20)) +
    theme(axis.text.x=element_text(size=15),
          axis.text.y=element_text(size=15),
          axis.title.y=element_text(vjust=-.5, size=15, face="bold"),
          axis.title.x=element_text(vjust=-.5, size=15, face="bold"),
          plot.title=element_text(vjust=1, size=18, face="bold"),
          legend.title=element_text(size=15, face="bold"),
          plot.margin=unit(c(2,1,2,2), "lines")) # T R B L
}

现在我可以这样做:

my_ggplot(molten_df, aes(timepoint,count,group=gene_symbol)) +
    geom_line(aes(color=gene_symbol), lwd=1.5)

这给了我体面的标签字体大小和我自己的色标。不幸的是,我必须手动将调色板大小(20)编码为我的get_palette函数,该函数根据我传递的数字返回不同的调色板。

我的问题:有没有办法推断出颜色美学会有多少级别,所以当我需要绘制21种颜色时,my_ggplot不会崩溃?我猜这是ggplot的方式,但我似乎无法在源代码中找到相关的功能。

@ user946850 回答 这就是我最终做的事情:

my_ggplot <- function(...){
    ggplot(...) +
    theme_bw() +
    discrete_scale("colour", "my_scale", dyn_palette()) +
    theme(axis.text.x=element_text(size=15),
          axis.text.y=element_text(size=15),
          axis.title.y=element_text(vjust=-.5, size=15, face="bold"),
          axis.title.x=element_text(vjust=-.5, size=15, face="bold"),
          plot.title=element_text(vjust=1, size=18, face="bold"),
          legend.title=element_text(size=15, face="bold"),
          plot.margin=unit(c(2,1,2,2), "lines")) # T R B L
}

dyn_palette <- function(){
  function(n){
    get_palette(n)
  }
}

1 个答案:

答案 0 :(得分:3)

我担心scale_colour_manual不是去这里的方式。让我们一起来看看幕后:比如布鲁尔量表是如何工作的?

如果你看一下scale_colour_brewer的定义,你会发现它只是对

的调用
discrete_scale("colour", "brewer", brewer_pal(type, palette), ...)

现在让我们看一下brewer_pal(在scales包中):

> brewer_pal
function (type = "seq", palette = 1) 
{
    pal <- pal_name(palette, type)
    function(n) {
        brewer.pal(n, pal)[seq_len(n)]
    }
}

有意思,对吧?返回带有一个参数n的(绑定)函数的函数 - 这是创建绘图时要传递的级别数的位置。反过来,brewer.pal(在RColorBrewer中)只会返回一个颜色列表:

> brewer.pal(3, 'YlOrRd')
[1] "#FFEDA0" "#FEB24C" "#F03B20"

按照此模式,您应该可以使用自定义调色板实现相同的效果。