Я создал функцию ColourPalleteMulti
, которая позволяет вам создавать многоцветную палитру на основе подгрупп в ваших данных:
ColourPalleteMulti <- function(df, group, subgroup){
# Find how many colour categories to create and the number of colours in each
categories <- aggregate(as.formula(paste(subgroup, group, sep="~" )), df, function(x) length(unique(x)))
category.start <- (scales::hue_pal(l = 100)(nrow(categories))) # Set the top of the colour pallete
category.end <- (scales::hue_pal(l = 40)(nrow(categories))) # set the bottom
# Build Colour pallette
colours <- unlist(lapply(1:nrow(categories),
function(i){
colorRampPalette(colors = c(category.start[i], category.end[i]))(categories[i,2])}))
return(colours)
}
По сути, функция определяет, сколько у вас разных групп, а затем подсчитывает количество цветов в каждой из этих групп. Затем он объединяет все различные цветовые палитры.
Чтобы использовать палитру, проще всего добавить новый столбец group
, который объединяет два значения, используемые для создания цветовой палитры:
library(ggplot2)
# Create data
df <- diamonds
df$group <- paste0(df$color, "-", df$clarity, sep = "")
# Build the colour pallete
colours <-ColourPalleteMulti(df, "color", "clarity")
# Plot resultss
ggplot(df, aes(color)) +
geom_bar(aes(fill = group), colour = "grey") +
scale_fill_manual("Subject", values=colours, guide = "none")
Изменить:
Если вы хотите, чтобы полосы внутри каждой полосы были разного цвета, вы можете просто изменить способ, которым переменная используется для построения графика:
# Plot resultss
ggplot(df, aes(cut)) +
geom_bar(aes(fill = group), colour = "grey") +
scale_fill_manual("Subject", values=colours, guide = "none")
Предупреждение. Честно говоря, набор данных, который вы хотите построить, вероятно, содержит слишком много подкатегорий, чтобы это сработало.
Кроме того, хотя это визуально очень приятно, я бы посоветовал избегать использования такой цветовой шкалы. Это больше о том, чтобы график выглядел красиво, а разные цвета избыточны, поскольку мы уже знаем, в какой группе находятся данные по оси X.
person
Michael Harper
schedule
14.04.2018