ggplot2: исправление цветов для уровней факторов с длинными именами факторов - PullRequest
1 голос
/ 31 марта 2020

Я создаю несколько фигур с помощью ggplot2 и хочу назначить фиксированные цвета различным группам. Для этого я использую подход, показанный в вопросе ggplot2: исправить цвета на уровнях фактора , как это предусмотрено alistaire .

То есть я определил свой собственный масштабируется следующим образом

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 символами в строке.

Это, однако, позволяет избежать назначения цветов моим факторам, имеющим разрыв строки. Если я сокращу имена факторов, подход будет работать хорошо. У вас есть идея, как я могу назначить фиксированные цвета моим «длинным» именам факторов, чтобы подход, описанный выше, работал?

Большое спасибо!

1 Ответ

0 голосов
/ 31 марта 2020

В качестве обходного пути вы можете использовать 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()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...