我正在构建一个绘图,并且对ggplot定义的默认颜色顺序完全满意,例如:
library(ggplot2)
data(mtcars)
mtcars$brand <- gsub(' .*','',row.names(mtcars))
ggplot(mtcars,aes(x=mpg, y=hp, col=brand)) +
geom_point()
现在假设我想更改图例中的颜色顺序(在我的示例中,根据级别的频率-但可以是任何其他自定义顺序)。我知道的唯一方法是手动定义级别顺序:
df.freq <- as.data.frame(table(mtcars$brand))
neworder <- order(-df.freq$Freq)
mtcars$brand <- factor(mtcars$brand, levels=df.freq$Var1[neworder])
进行所需的顺序,但也会更改颜色。
如果我绝对想保留原始颜色怎么办?
目前,我只是遇到了一个尴尬的解决方法,即手动重新创建默认调色板,然后对其重新排序并将这些颜色提供给scale_color_manual()
:
gg_color_hue <- function(n) { # code from https://stackoverflow.com/questions/8197559/
hues = seq(15, 375, length = n + 1)
hcl(h = hues, l = 65, c = 100)[1:n]
}
newcolors <- gg_color_hue(length(levels(mtcars$brand)))
newcolors <- newcolors[neworder]
ggplot(mtcars,aes(x=mpg, y=hp, col=brand)) +
geom_point()+
scale_color_manual(values = newcolors)
答案 0 :(得分:3)
您可以尝试以下操作,不需要将品牌列考虑在内。我不知道它是否那么短。您可以根据所需的顺序分配颜色,并使用scale_manual_color中的中断来定义顺序:
library(scales)
mtcars$brand <- gsub(' .*','',row.names(mtcars))
legend_order = names(sort(-table(mtcars$brand)))
COLS = hue_pal()(length(lvl))
# sort alphabetically
names(COLS) = sort(legend_order)
ggplot(mtcars,aes(x=mpg, y=hp, col=brand)) +
geom_point()+
scale_color_manual(values = COLS,breaks=legend_order)
如果您对默认颜色感到满意,请执行以下操作:
ggplot(mtcars,aes(x=mpg, y=hp, col=brand)) +
geom_point()+
scale_color_manual(values=hue_pal()(length(legend_order)),
breaks=legend_order)