Правильное указание коэффициента для предотвращения упорядочения легенды ggplot в алфавитном порядке (я знаю, что об этом уже спрашивали) - PullRequest
0 голосов
/ 29 октября 2018

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

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

Я указал порядок факторной переменной Group, но цвета меняются в алфавитном порядке, в отличие от факторного порядка . Так как я указываю Группу как фактор и указываю порядок уровней («B» всегда сначала как «group_1»), я бы подумал, что цвет был бы неизменным для «B», но он меняется.

Если бы кто-то мог сообщить мне, что мне не хватает, я был бы очень признателен!

Воспроизводимый пример

library(tidyverse)

# Sample data
Group <- c("A", "B", "C")
Value <- c(3, 3, 5)

# Create data frame
mydata   <- data.frame(Group, Value)

# Create variable for group selected for plotting
group_1 <- "B"
group_2 <- "A"

# Make a pyramid plot, making one group negative numbers for bar chart
pyramid <- mydata %>%
  filter(Group == group_1 | Group == group_2) %>%
  mutate(Value = ifelse(Group == group_2, Value * -1, Value)) %>%
    # Thought this would keep color ordering consistent
  mutate(Group = factor(Group, levels = c(group_1, group_2)))         


pyramid_plot <- ggplot(pyramid, aes(x    = Group,
                                    y    = Value,
                                    fill = Group)
                       ) +
  geom_bar(data = subset(pyramid, Group == group_1),
           stat  = "identity"
           ) +
  geom_bar(data = subset(pyramid, Group == group_2),
           stat  = "identity"
           ) +
  coord_flip() +
  scale_fill_manual(name = "Group",
                    values = c("#1f78b4", "#33a02c"),   # blue, green
                    breaks = c(group_1, group_2),
                    labels = c(group_1, group_2)
                    )
pyramid_plot

plot1

# Now do another plot, keeping group_1 the same but changing group_2
group_1 <- "B"
group_2 <- "C"

pyramid <- mydata %>%
  filter(Group == group_1 | Group == group_2) %>%
  mutate(Value = ifelse(Group == group_2, Value * -1, Value)) %>%
  # Thought this would keep color ordering consistent
  mutate(Group = factor(Group, levels = c(group_1, group_2)))         


pyramid_plot2 <- ggplot(pyramid, aes(x    = Group,
                                    y    = Value,
                                    fill = Group)
                       ) +
  geom_bar(data = subset(pyramid, Group == group_1),
           stat  = "identity"
           ) +
  geom_bar(data = subset(pyramid, Group == group_2),
           stat  = "identity"
           ) +
  coord_flip() +
  scale_fill_manual(name = "Group",
                    values = c("#1f78b4", "#33a02c"),   # blue, green
                    breaks = c(group_1, group_2),
                    labels = c(group_1, group_2)
                    )
pyramid_plot2

plot2

1 Ответ

0 голосов
/ 29 октября 2018
Group <- c("A", "B", "C")
Value <- c(3, 3, 5)

mydata   <- data.frame(Group, Value)

group_1 <- "B"
group_2 <- "A"

pyramid <- mydata %>%
  filter(Group == group_1 | Group == group_2) %>%
  mutate(Value = ifelse(Group == group_2, Value * -1, Value)) %>%
  mutate(Group = factor(Group, levels = c(group_1, group_2)))         


ggplot(pyramid, aes(x    = Group, y = Value, fill = Group)) +
  geom_bar(stat  = "identity") +
  coord_flip() +
  scale_fill_manual(name = "Group",
                    values = c("#1f78b4", "#33a02c"))

Выход:

enter image description here

group_1 <- "B"
group_2 <- "C"

pyramid <- mydata %>%
  filter(Group == group_1 | Group == group_2) %>%
  mutate(Value = ifelse(Group == group_2, Value * -1, Value)) %>%
  mutate(Group = factor(Group, levels = c(group_1, group_2)))         


ggplot(pyramid, aes(x = Group, y = Value, fill = Group)) +
  geom_bar(stat  = "identity") +
  coord_flip() +
  scale_fill_manual(name = "Group",
                    values = c("#1f78b4", "#33a02c"))

Второй выход:

enter image description here

B всегда синий.

Я думаю, что проблема была в том, чтобы дважды вызвать geom_bar и установить подмножество данных. Fill уже делает это для вас, поэтому нет необходимости дополнительно разрезать данные.

...