Составная гистограмма с цветовыми градиентами для каждой полосы

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

Пример:

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

library(ggplot2)

ggplot(diamonds, aes(color)) + 
  geom_bar(aes(fill = clarity), colour = "grey")

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

В моей реальной проблеме у меня гораздо больше групп каждой из них: требуется 18 разных полос с 39 разными цветами градиента.


person nicole    schedule 13.04.2018    source источник
comment
Можете ли вы предоставить свой фрейм данных с помощью dput ()? Это должно быть выполнимо!   -  person Luke Hayden    schedule 13.04.2018
comment
Я новичок в R, но попробую. Пройдет несколько дней.   -  person nicole    schedule 13.04.2018
comment
Используйте это: dput (Rome) и скопируйте и вставьте то, что выводится в консоли   -  person Luke Hayden    schedule 13.04.2018


Ответы (2)


Я создал функцию 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
comment
Спасибо за помощь, но это изменило смысл моего первоначального вопроса. Мне не нужен родительский цвет для 18 полосок. У меня 88 столбцов, а внутри столбцов 18 групп (18 различных типов) и 39 подгрупп (классов). Я пытаюсь сделать Phyla родительскими цветами, а классы - разными градиентами Phyla. - person nicole; 16.04.2018
comment
@nicole Извините за изменение значения: это было довольно запутанно, поэтому моя интерпретация была такой. Это решение не должно быть адаптировано, чтобы это работало: см. Мое редактирование - person Michael Harper; 16.04.2018
comment
Спасибо, выглядит действительно хорошо! Есть ли способ рандомизировать родительские цвета 18 групп в стеке, а не следовать палитре радуги? Их сложно различить, потому что у меня очень много цветов. Было бы здорово, например, если бы темно-красная группа была рядом со светло-синим и желтым, а не между темно-синим и светло-синим. - person nicole; 16.04.2018
comment
Цветовая палитра выбирается аргументом scales::hue_pal(l = 100)(nrow(categories)) в функции. Вы можете заменить это вектором цветов, которые вам нравятся, той же длины, что и количество разных категорий, то есть c (фиолетовый, синий, розовый). Смотрите здесь больше цветов. sape.inf.usi.ch/quick-reference/ggplot2/colour Пожалуйста, проголосуйте и примите мой ответ, если вы довольны :) - person Michael Harper; 16.04.2018

Более простой подход к достижению цветового градиента - использовать alpha для изменения прозрачности цвета. Однако это может иметь непредвиденные последствия, поскольку прозрачность означает, что вы можете видеть руководящие принципы через график.

library(ggplot2)

ggplot(diamonds, aes(color, alpha = clarity)) + 
  geom_bar(aes(fill = color), colour = "grey") +
  scale_alpha_discrete(range = c(0,1))

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

person Michael Harper    schedule 14.04.2018