7

我有一个自定义函数,用于所有绘图而不是普通函数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)
  }
}
4

1 回答 1

4

恐怕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(in RColorBrewer) 只返回一个颜色列表:

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

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

于 2012-12-21T19:24:33.890 回答