Разные цвета для каждого столбца с надписью? - PullRequest
1 голос
/ 07 мая 2020

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

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

MRE + попытки на данный момент

library(tidyverse)

df <- structure(list(discipline = c("Dev Ops", "Dev Ops", "Dev Ops", 
"Dev Ops", "Data Engineering", "Data Engineering", "Data Engineering"
), work_type = c("Casual/Vacation", "Contract/Temp", "Full Time", 
"Part Time", "Casual/Vacation", "Contract/Temp", "Full Time"), 
    n = c(3L, 117L, 581L, 9L, 1L, 297L, 490L)), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -7L))

# A tibble: 7 x 3
  discipline       work_type           n
  <chr>            <chr>           <int>
1 Dev Ops          Casual/Vacation     3
2 Dev Ops          Contract/Temp     117
3 Dev Ops          Full Time         581
4 Dev Ops          Part Time           9
5 Data Engineering Casual/Vacation     1
6 Data Engineering Contract/Temp     297
7 Data Engineering Full Time         490

Это дает правильную диаграмму с накоплением столбцов, но с одинаковыми цветами для обоих столбцов с накоплением

df %>% 
  ggplot(aes(x = discipline, y = n, fill = work_type)) +
    geom_col(position = "Stack")

enter image description here

Это применяет уникальные цвета к каждому составному столбцу, но применяет тот же к обоим уложенным столбцам

cols <- c("#5E4FA2", "#5E4FA2CC", "#5E4FA299", "#5E4FA266", "#9E0142", 
"#9E0142CC", "#9E014299")
df %>% 
  ggplot(aes(x = discipline, y = n, fill = work_type)) +
    geom_col(position = "Stack") +
  scale_fill_manual(values = cols[1:4])

enter image description here

Это позволяет получить разные цвета для обеих составных полос, но неправильные цвета (и неправильная легенда)

df %>% 
  ggplot(aes(x = discipline, y = n, fill = cols)) +
    geom_col(position = "Stack")

enter image description here

Это основано на этот подход , но обратите внимание, что высота столбцов соответствует сумме для всех столбцов (а не для каждого столбца), а также имеет одинаковые цвета в обоих столбцах, расположенных друг над другом.

df %>% 
  pivot_longer(cols = discipline:work_type) %>% 
  ggplot(aes(x = name, y = n)) + 
  geom_col(fill = c(cols, cols))

enter image description here

1 Ответ

1 голос
/ 07 мая 2020

Если вы хотите, чтобы два объединили два фактора, обычный трюк заключается в использовании interaction(), поэтому ваш код будет:

# Data 
df <- structure(list(discipline = c("Dev Ops", "Dev Ops", "Dev Ops", 
"Dev Ops", "Data Engineering", "Data Engineering", "Data Engineering"
), work_type = c("Casual/Vacation", "Contract/Temp", "Full Time", 
"Part Time", "Casual/Vacation", "Contract/Temp", "Full Time"), 
    n = c(3L, 117L, 581L, 9L, 1L, 297L, 490L)), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -7L))

# Colours
cols <- c("#5E4FA2", "#5E4FA2CC", "#5E4FA299", "#5E4FA266", "#9E0142", 
"#9E0142CC", "#9E014299")

# Plot
df %>% 
  ggplot(aes(x = discipline, y = n, fill = interaction(work_type, discipline))) +
  geom_col(position = "Stack") +
  scale_fill_manual(name="Whatever", values = cols)

Code output plot

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

...