Если вы не против вручную установить палитру, вы можете сделать что-то вроде этого:
library(ggplot2)
library(colorspace)
df <- data.frame(diamonds)
df$binary_dummy <- sample(c(0,1), nrow(df), replace = T)
pal <- scales::brewer_pal(palette = "Set1")(nlevels(df$color))
pal <- c(rbind(pal, darken(pal, amount = 0.2)))
ggplot(df, aes(x = cut, fill = interaction(binary_dummy, color))) +
geom_bar(position = "fill") +
scale_fill_manual(values = pal)
Создано в 2020-04-14 с помощью представьте пакет (v0.3.0)
РЕДАКТИРОВАТЬ: Чтобы исправить отношения цвета взаимодействия, вы можете установить именованную палитру, например:
pal <- setNames(pal, levels(interaction(df$binary_dummy, df$color)))
# Miss a level
df <- df[!(df$binary_dummy == 0 & df$color == "E"),]
ggplot(df, aes(x = cut, fill = interaction(binary_dummy, color))) +
geom_bar(position = "fill") +
scale_fill_manual(values = pal)
В качестве альтернативы, Вы также можете установить разрывы шкалы:
ggplot(df, aes(x = cut, fill = interaction(binary_dummy, color))) +
geom_bar(position = "fill") +
scale_fill_manual(values = pal, breaks = levels(interaction(df$binary_dummy, df$color)))