我有一个自定义的功能,我用于我的所有情节而不是平原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)
恐怕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)
通过遵循此模式,您应该能够使用自定义调色板实现相同的效果。