我有一个自定义的功能,我用于所有情节而不是普通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)
}
}
答案 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"
按照此模式,您应该可以使用自定义调色板实现相同的效果。