【问题标题】:ggplot2: Fix colors to factor levels with long factor namesggplot2:将颜色固定到具有长因子名称的因子水平
【发布时间】:2020-07-11 14:43:39
【问题描述】:

我正在使用 ggplot2 创建几个图形,并希望将固定颜色分配给不同的组。为此,我使用alistaire 提供的问题ggplot2: Fix colors to factor levels 中显示的方法。

也就是说,我定义了自己的自定义比例如下

library(ggplot2)

scale_fill_ind <- function(...){
    ggplot2:::manual_scale(
        'fill', 
        values = setNames(c('green', 'blue', 'red', 'orange'), LETTERS[1:4]), 
        ...
    )
}

df1 <- data.frame(Value = c(40, 20, 10, 60), 
                  Type = c("A", "B", "C", "D"))

ggplot(df1, aes(x = Type, y = Value, fill = Type)) + 
    geom_col() + 
    scale_fill_ind()

df2 <- data.frame(Value = c(40, 20, 60), 
                  Type = c("A", "B", "D"))

ggplot(df2, aes(x = Type, y = Value, fill = Type)) + 
    geom_col() + 
    scale_fill_ind()

但是,在我自己的代码中,因子名称明显长于“A”、“B”、...,因此我必须在图例中使用str_wrap()“强制”换行,最大每行 25 个字符。

但是,这避免了将颜色分配给具有换行符的因子。如果我缩短因子名称,则该方法效果很好。您有什么想法吗,如何将固定颜色分配给我的“长”因子名称,以便上述方法有效?

非常感谢!

【问题讨论】:

  • 我正在尝试复制此问题,但我无法理解您要实现的目标。因子名称超过 25 个字符很好,并且使用上面的代码可以毫无问题地绘制;强制换行纯粹是出于文体原因吗?

标签: r ggplot2 colors


【解决方案1】:

作为一种解决方法,您可以使用paste:

library(ggplot2)

list_of_factors <- list(paste("Aaljdfgneopghpihj", "wgwgvldjnfgpwghiwg", sep = "\n"),
                     paste("Baodjfwapigaafgja", "3jgamdgvaksmngvaksn", sep = "\n"),
                     paste("Cskndvlsnvljengwlan", "kgaksnbvalsknbsfblskn", sep = "\n"),
                     paste("Dafsnjljbipenbvmdsvs", "mvslkbndfbkndfb", sep = "\n")) 

scale_fill_ind <- function(...){
  ggplot2:::manual_scale(
    'fill', 
    values = setNames(c('green', 'blue', 'red', 'orange'), list_of_factors), 
    ...
  )
}

df1 <- data.frame(Value = c(40, 20, 10, 60), 
                  Type = c(paste("Aaljdfgneopghpihj", "wgwgvldjnfgpwghiwg", sep = "\n"),
                           paste("Baodjfwapigaafgja", "3jgamdgvaksmngvaksn", sep = "\n"),
                           paste("Cskndvlsnvljengwlan", "kgaksnbvalsknbsfblskn", sep = "\n"),
                           paste("Dafsnjljbipenbvmdsvs", "mvslkbndfbkndfb", sep = "\n")))

ggplot(df1, aes(x = Type, y = Value, fill = Type)) + 
  geom_col() + 
  scale_fill_ind()

【讨论】:

    猜你喜欢
    • 2017-09-12
    • 1970-01-01
    • 1970-01-01
    • 2014-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-06
    相关资源
    最近更新 更多