Как получить общую легенду для сложенных geom_bar и geom_point в ggplot2? - PullRequest
0 голосов
/ 17 января 2019

Итак, я строю график со следующей информацией:

  • Компоненты дохода одиночного домохозяйства (заработная плата, социальные трансферты, налоги), отображаемые в виде диаграммы geom_bar в виде столбцов и деленные на страну ;
  • Чистый доход каждой страны домохозяйства после уплаты налогов и трансфертов, отображаемый на диаграмме geom_point.

Это расположено в следующем фрейме данных:

example <- data.frame(country = c("Arcadia", "Asgard", "Atlantis", "Avalon"),
            wage = c(80, 70, 55, 40),
            transfers = c(15, 15, 5, 20),
            tax = c(-10, -5, -5, 0),
            net = c(85, 80, 65, 60)) %>% gather(icom, euro, wage:net)

Затем он выглядит так:

income_graph <- ggplot(filter(example, icom != "net"), aes(x = country, y = euro, fill = factor(icom, levels = c("transfers", "wage", "tax")))) +
  geom_bar(stat = "identity", colour = "black") +
  geom_point(data = filter(example, icom == "net"), colour = "black", shape = 5) +
  labs(fill = "Income components") +
  scale_fill_brewer(palette = "Greys", labels=(c("Social transfers", "Wage", "Tax"))) 
income_graph 

Это приводит к следующему графику.

enter image description here

Здесь мне нужна помощь: график делает то, что мне нужно, но я не могу понять, как заставить графики geom_bar и geom_point использовать комбинированную легенду (т.е. раунд) показатель "net" под тем же заголовком "Компоненты дохода"). Исходя из того, что я обнаружил при чтении других записей, решение может состоять в том, чтобы отобразить и geom_bar, и geom_point на «fill», но, похоже, это просто приводит к тому, что «чистый» ромб перекрывает другие записи icom. [*]

Заранее спасибо и надеюсь, что вопрос не является дубликатом - я не смог найти подходящее решение для StackOverflow, но, к счастью, будет перенаправлен на одно, если ответ очевиден.

LS

[*] = (Отдельно и в гораздо меньшем масштабе возможно ли заставить «чистые» индикаторы заполняться белым и черным контуром? Это, вероятно, имеет логическое решение, но я почесал голову на это.)

Ответы [ 2 ]

0 голосов
/ 17 января 2019

geom_point(shape=21) + scale_color_manual спасает жизнь для таких случаев

income_graph <- ggplot(filter(example, icom != "net"), aes(x = country,
 y = euro, fill = factor(icom, levels = c("transfers", "wage", "tax",'net')))) +
  geom_bar(stat = "identity", colour = "black") +
  geom_point(data = filter(example, icom == "net"),aes(color=icom), 
  shape = 21, size = 1.5, stroke = 1,fill='white') +
  labs(fill = "Income components") +
  scale_fill_brewer(palette = "Greys", labels=(c("Social transfers", "Wage", "Tax"))) +
  scale_colour_manual("", values='black', label='Net')
income_graph 

enter image description here

0 голосов
/ 17 января 2019

Я переместил эстетику заполнения в бар, оставив его в вызове ggplot, он пытается применить его ко всем гемам.Я добавил к вызову geom_point эстетику, которая отображает фигуру в столбце icom, и сопоставил это позже с scale_shape_manual.

Надеюсь, это то, что вы хотите!

income_graph <- ggplot(filter(example, icom != "net"),
                       aes(x = country, y = euro)) +
  geom_bar(aes(fill = factor(icom, levels = c("transfers", "wage", "tax"))),
           stat = "identity", colour = "black") +
  geom_point(data = filter(example, icom == "net"),
             aes(shape = icom),
             colour = "black") +
  labs(fill = "Income components", shape = "") +
  guides(shape = guide_legend(order = 2),
         fill = guide_legend(order = 1)) +
  scale_fill_brewer(palette = "Greys", labels=(c("Social transfers", "Wage", "Tax"))) +
  scale_shape_manual(values = c("net" = 5), labels="Net")
income_graph

Участок

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...