ggplot ручная легенда scale_fill_manual для отдельных цветовых коэффициентов

Я просмотрел несколько тем, но пока не нашел решения.

У меня есть график geom_bar с более чем 40 переменными. Я создал отдельный df, чтобы пометить каждую переменную в соответствии с определенной категорией, и присвоил категории цвет. Из более чем 40 переменных в график включены 4 цвета / категории.

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

Вот пример, где df - это данные, нанесенные на график, а df_cols сродни моей категории / цвету df. В идеале в легенде должно быть указано «A = красный, B = синий, C = оранжевый», а не имена переменных.

variable = c("abc", "def", "ghi", "jkl","mno", "pqr", "stu")
tag = c("A", "B", "C", "A","B", "A", "B")
colours = as.character(c("red", "blue", "orange", "red", "blue", "red", "blue"))

# Create colour reference df 
df_cols = data.frame(variable, tag, colors = as.character(colours))
cols = df_cols$colors
cols = as.character(cols)
names(cols) = as.character(names(cols))

# Plotting df
df = data.frame(variable, value=c(1:7))

ggplot(df)+
  geom_bar(aes(x=variable, y=value, fill=variable),stat = "identity")+
  scale_fill_manual(values = cols)

Вот копия реального сюжета, который я делаю:  введите описание изображения здесь


person VickiB    schedule 19.05.2020    source источник
comment
Меня немного смущает ваше описание. Не могли бы вы создать пример того, чего пытаетесь достичь?   -  person jdobres    schedule 20.05.2020


Ответы (1)


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

library(ggplot2)


# Plotting df
df <- data.frame(variable = c("abc", "def", "ghi", "jkl","mno", "pqr", "stu"),
                 tag = c("A", "B", "C", "A","B", "A", "B"),
                 value = c(1:7))

Поскольку вы наносите значения на ось y, вы можете упростить геометрию до geom_col, который разработан для этого случая и позволяет избежать обращения к stat

ggplot(df)+
  geom_col(aes(x = variable, y = value, fill = tag)) +
  scale_fill_discrete(breaks = c("A", "B", "C"),
                      values = c("red", "blue", "orange"),
                      labels  = c("red", "blue", "orange"),
                      name = "Colour")

Создано 20 мая 2020 г. пакетом REPEX (v0.3.0)

person Peter    schedule 19.05.2020
comment
Привет, Питер, я отредактировал свой вопрос выше, добавив копию образца сюжета. Я пытаюсь избежать ввода всех имен переменных в вызове ggplot. Я пытаюсь найти решение, в котором я могу использовать отдельный df со всеми метриками, тегами и цветами в нем, если это вообще возможно. - person VickiB; 21.05.2020
comment
Я не думаю, что вам нужно вводить все имена переменных в вызове ggplot. Важно изменить аргумент fill = variable на fill = tag. - person Peter; 21.05.2020
comment
Это правда, я только что видел, что вы сделали это в своем примере с scale_fill_discrete(), но вы правы, что в этом нет необходимости. Я пытаюсь избежать добавления столбцов в дополнительный df и получить все из ссылки df_cols. - person VickiB; 22.05.2020