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

nac*_*cab 5 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
}
Run Code Online (Sandbox Code Playgroud)

现在我可以这样做:

my_ggplot(molten_df, aes(timepoint,count,group=gene_symbol)) +
    geom_line(aes(color=gene_symbol), lwd=1.5)
Run Code Online (Sandbox Code Playgroud)

这给了我不错的标签字体大小和我自己的色标.不幸的是,我必须手动将调色板大小(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)
  }
}
Run Code Online (Sandbox Code Playgroud)

krl*_*mlr 5

恐怕scale_colour_manual不是去这里的路。让我们看看幕后:它是如何工作的,比如 Brewer 秤?

如果您查看 的定义scale_colour_brewer,您会发现它只是对

discrete_scale("colour", "brewer", brewer_pal(type, palette), ...)
Run Code Online (Sandbox Code Playgroud)

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

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

有趣,对吧?一种返回带有一个参数的(绑定)函数的函数n——这是创建绘图时将传递级别数的地方。反过来,brewer.pal(in RColorBrewer) 仅返回颜色列表:

> brewer.pal(3, 'YlOrRd')
[1] "#FFEDA0" "#FEB24C" "#F03B20"
Run Code Online (Sandbox Code Playgroud)

通过遵循此模式,您应该能够使用自定义调色板实现相同的效果。