Мне понадобится помощь, чтобы добавить пугающие цвета в график geom_bar из рисунка ggplot2.

Вот что мне пока удается:

    head(data)
  x  y group Axis_color
1 A 25     F         G1
2 A 88     G         G1
3 A 88     H         G1
4 A 22     I         G1
5 A 18     J         G1
6 B 54     F         G3

color_list<- c("F"="orange", "G"="darkgreen", "H"="grey", "I"="pink", "J"="purple", "G1"="blue","G2"="red","G3"="green")
ggplot(data, aes(x = x, y = y, fill = group, label = y)) + 
  coord_flip()+
  geom_bar(stat = "identity")

Который дает:

enter image description here

Но я хотел бы добавить столбец «Axis_color», чтобы добавить цвета, хранящиеся в color_list, например:

enter image description here

Как видите, у меня также есть две разные оси легенд.

Вот данные, если они могут помочь:

structure(list(x = c("A", "A", "A", "A", "A", "B", "B", "B", 
"B", "B", "C", "C", "C", "C", "C", "D", "D", "D", "D", "D", "E", 
"E", "E", "E", "E"), y = c(25, 88, 88, 22, 18, 54, 25, 37, 68, 
72, 36, 84, 17, 64, 48, 15, 17, 72, 61, 25, 66, 10, 18, 99, 63
), group = c("F", "G", "H", "I", "J", "F", "G", "H", "I", "J", 
"F", "G", "H", "I", "J", "F", "G", "H", "I", "J", "F", "G", "H", 
"I", "J"), Axis_color = c("G1", "G1", "G1", "G1", "G1", "G3", 
"G3", "G3", "G3", "G3", "G1", "G1", "G1", "G1", "G1", "G2", "G2", 
"G2", "G2", "G2", "G3", "G3", "G3", "G3", "G3")), row.names = c(NA, 
-25L), class = "data.frame")
0
chippycentra 25 Сен 2021 в 15:30

2 ответа

Лучший ответ

Одним из вариантов достижения желаемого результата было бы использование geom_tile и пакета ggnewscale, подобного этому.

  1. Для geom_tile я использую упрощенный набор данных, содержащий только уникальные или отдельные категории и значения цвета оси. В зависимости от желаемого результата вы можете настроить ширину плиток с помощью аргумента width.
  2. Поскольку geom_tile по умолчанию приведет к несколько иному виду ключей легенды, я использую аргумент override.aes для guide_legend, чтобы ключи легенды были такими же, как для geom_col

Обратите внимание, что я переключился на geom_col и поменял роль эстетики x и y, что позволяет избавиться от coord_flip.

library(ggplot2)
library(ggnewscale)

color_list<- c("F"="orange", "G"="darkgreen", "H"="grey", "I"="pink", "J"="purple", "G1"="blue","G2"="red","G3"="green")
ggplot(data, aes(x = y, y = x, fill = group, label = y)) + 
  geom_col() +
  scale_x_continuous(expand = c(.025, 0)) +
  scale_fill_manual(values = color_list[unique(data$group)], guide = guide_legend(order = 1)) +
  new_scale_fill() +
  geom_tile(data = dplyr::distinct(data, x, Axis_color), aes(x = -15, y = x, fill = Axis_color), 
            height = .9, width = 15, inherit.aes = FALSE) +
  scale_fill_manual(values = color_list[sort(unique(data$Axis_color))], 
                    guide = guide_legend(order = 2, override.aes = list(lwd = .5, color = NA)))

1
stefan 25 Сен 2021 в 14:03
library(ggnewscale)
library(tidyverse)

data <- structure(list(x = c(
  "A", "A", "A", "A", "A", "B", "B", "B",
  "B", "B", "C", "C", "C", "C", "C", "D", "D", "D", "D", "D", "E",
  "E", "E", "E", "E"
), y = c(
  25, 88, 88, 22, 18, 54, 25, 37, 68,
  72, 36, 84, 17, 64, 48, 15, 17, 72, 61, 25, 66, 10, 18, 99, 63
), group = c(
  "F", "G", "H", "I", "J", "F", "G", "H", "I", "J",
  "F", "G", "H", "I", "J", "F", "G", "H", "I", "J", "F", "G", "H",
  "I", "J"
), Axis_color = c(
  "G1", "G1", "G1", "G1", "G1", "G3",
  "G3", "G3", "G3", "G3", "G1", "G1", "G1", "G1", "G1", "G2", "G2",
  "G2", "G2", "G2", "G3", "G3", "G3", "G3", "G3"
)), row.names = c(
  NA,
  -25L
), class = "data.frame")

color_list <- c("F" = "orange", "G" = "darkgreen", "H" = "grey", "I" = "pink", "J" = "purple", "G1" = "blue", "G2" = "red", "G3" = "green")


data %>%
  as_tibble() %>%
  ggplot(aes(x, y)) +
  geom_bar(aes(fill = group), stat = "identity") +
  scale_fill_manual(
    values = color_list[names(color_list) %>% discard(~ .x %>% str_starts("G[0-9]"))]
  ) +
  new_scale_fill() +
  geom_bar(aes(fill = Axis_color, y = -10), stat = "identity") +
  scale_fill_manual(
    values = color_list[names(color_list) %>% keep(~ .x %>% str_starts("G[0-9]"))]
  ) +
  coord_flip()

Создано 25 сентября 2021 года пакетом REPEX (v2.0.1)

1
danlooo 25 Сен 2021 в 13:57