scale_color_manual неправильно работает с geom_pointrange ggplot2

#r #ggplot2

Вопрос:

scale_color_manual, когда заданные цвета не генерируют ожидаемый результат. Минимальный воспроизводимый код приведен ниже:

 statsSomeSet <- read.table(header=TRUE, text="
 methods    min max mean
<fct>   <dbl>   <dbl>   <dbl>
    Method1_LR  40  80  60
    Method2_LR  50  90  70
    Method3_LR  30  70  50
    Method1_RF  50  90  70
    Method2_RF  40  80  60
    Method3_RF  30  70  50
")

statsSomeSet$methods <- factor(statsSomeSet$methods, levels = statsSomeSet$methods)
p <- ggplot(data = statsSomeSet, mapping = aes(x = methods, y = mean))  
    geom_pointrange(mapping = aes(ymin = min, ymax = max))   
    scale_color_manual(values = c("green", "red", "blue","green", "red", "blue" ))
p   labs(title = "Methods")

 

Комментарии:

1. Попробуйте сопоставить переменную с эстетикой цвета, например aes(..., color=methods) . (;

2. @стефан Спасибо, это работает, но почему он дает один и тот же цвет для разных имен (что я все равно хотел). Мне любопытно, как и почему он это делает. Но в легенде перечислены 6 различных методов

3. У вас есть шесть методов и прошло шесть цветов. Следовательно, по умолчанию ggplot2 упорядочивает методы в алфавитном порядке и также назначает цвета в этом порядке. Вероятно, существуют более простые способы достижения желаемого результата. Вместо передачи шести цветов вы можете добавить в свой df столбец, содержащий только название метода, т. Е. без суффикса, сопоставляющего этот столбец с цветовой эстетикой. В этом случае было бы достаточно передать только три цвета в scale_color_manual.

Ответ №1:

Основываясь на комментарии @stefan, вы можете использовать separate функцию from tidyr , чтобы разделить столбец «Методы» на два столбца, а затем сопоставить первый с цветовой эстетикой.

 library(tidyverse)

statsSomeSet <- read.table(header=TRUE, text="
 methods    min max mean
    Method1_LR  40  80  60
    Method2_LR  50  90  70
    Method3_LR  30  70  50
    Method1_RF  50  90  70
    Method2_RF  40  80  60
    Method3_RF  30  70  50
")

statsSomeSet_separated <- statsSomeSet %>%
  separate(methods, c('method_a', 'method_b'), sep="_")

p <- ggplot(data = statsSomeSet_separated, mapping = aes(x = paste(method_a, method_b), y = mean, color = method_a))  
  geom_pointrange(mapping = aes(ymin = min, ymax = max))
p   labs(x = 'Methods', title = "Methods")
 

введите описание изображения здесь