【问题标题】:Change order of values in the legend but keep the colors更改图例中值的顺序但保留颜色
【发布时间】:2019-12-19 16:22:39
【问题描述】:

我正在构建一个绘图,并且对 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)


它可以完成工作,但我想知道是否有更清洁的方法......

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    您可以尝试以下方法,这不需要您考虑品牌列。不知道会不会短很多。您根据需要的顺序分配颜色,并使用 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-26
      • 1970-01-01
      相关资源
      最近更新 更多