Подтвердить что ты не робот

Ручная настройка групповых цветов для ggplot2

У меня есть набор данных, из которого я должен сделать несколько десятков графиков. Данные состоят из 30 групп и нескольких измерений в каждой группе.

Большинство графиков не будут использовать сразу все группы.

Моя цель состоит в том, чтобы для набора групп была одна единственная цветовая палитра, так что любая заданная группа имеет один и тот же цвет на всех графиках. В приведенном ниже примере это означает, что Group C имеет тот же цвет в Plot 1 и в Plot 2.

Мой вопрос - как это сделать.

Я пробовал несколько вариантов scale_fill_manual (и scal_color_manual, когда это необходимо). Хотя цвета выбраны из назначенного палитры, Кажется, я не могу индексировать палитру группой или каким-либо другим способом "пропускать" цвета, соответствующие отсутствующей группе.

Я также попытался добавить информацию о цвете в качестве столбца данных, которые были построены, но я не уверен, как использовать этот столбец в качестве цвета для группы.

Plot Example

# SAMPLE DATA: 
DT1 <- data.table(Name=c("C_sub1", "A_sub1", "A_sub2"), Value=c(2,5,3), Group=c("C", "A", "A"), key="Group")
DT2 <- data.table(Name=c("A_sub1", "B_sub1", "C_sub1", "C_sub2"), Value=c(4,3,6,3), Group=c("A", "B", "C", "C"), key="Group")

# SAMPLE Color Pallette  
ColorsDT <-  data.table(Group=LETTERS[1:5], Color=c("#333BFF", "#CC6600", "#9633FF", "#E2FF33", "#E3DB71"), key="Group")

# Add a column for Color, according to the Group
DT1[ColorsDT, Color := i.Color]
DT2[ColorsDT, Color := i.Color]

# A Basic Plot
simplePlot <- function(DT, tit) 
  ggplot(DT ,aes(x=Name, y=Value, fill=Group)) +
   geom_bar(stat="identity") + xlab("") + ggtitle(tit)
    # Tried sevearl variations of: 
    #  + scale_fill_manual(values=ColorsDT$Color)


# Plot Them
grid.arrange(ncol=2,  simplePlot(DT1, tit="Plot 1"),  simplePlot(DT2, tit="Plot 2"))
4b9b3361

Ответ 1

Вы можете связать каждую из ваших групп с цветом, а затем перейти к функции:

group.colors <- c(A = "#333BFF", B = "#CC6600", C ="#9633FF", D = "#E2FF33", E = "#E3DB71")

simplePlot <- function(DT, tit) 
  ggplot(DT ,aes(x=Name, y=Value, fill=Group)) +
  geom_bar(stat="identity") + xlab("") + ggtitle(tit) +
  #Specify colours
  scale_fill_manual(values=group.colors)

Затем используйте ваши графики:

grid.arrange(ncol=2,  simplePlot(DT1, tit="Plot 1"), 
  simplePlot(DT2, tit="Plot 2"))

enter image description here

Я думаю, что проблема с вашим подходом заключалась в том, что цвета не были названы, поэтому scale_fill_manual() не может их использовать. Для сравнения:

ColorsDT <-  data.table(Group=LETTERS[1:5], Color=c("#333BFF", "#CC6600", "#9633FF", "#E2FF33", "#E3DB71"), key="Group")
ColorsDT
#   Group   Color
#1:     A #333BFF
#2:     B #CC6600
#3:     C #9633FF
#4:     D #E2FF33
#5:     E #E3DB71

с:

ColorsDT.name <-  data.table(A = "#333BFF", B = "#CC6600", C = "#9633FF", D = "#E2FF33", E =  "#E3DB71")
ColorsDT.name
#          A       B       C       D       E
# 1: #333BFF #CC6600 #9633FF #E2FF33 #E3DB71