Создание столбчатой ​​диаграммы с накоплением с одной переменной для каждого столбца с использованием melt и ggplot - PullRequest
0 голосов
/ 24 мая 2018

Этот вопрос поднимает разные вопросы, как тот, который я опубликовал вчера, с лучшим описанием, поэтому я надеюсь на ваше понимание.У меня есть следующие данные:

Data <- data.frame(LMX = c(1.92, 2.33, 3.52, 5.34, 6.07, 4.23, 3.45, 5.64), Thriving = c(4.33, 6.54, 6.13, 4.85, 4.26, 6.32, 5.63, 4.55), Wellbeing = c(1.92, 2.33, 3.52, 2.34, 4.07, 3.23, 3.45, 4.64))
rownames(Data) <- 1:8

Теперь моя цель - создать перевернутую гистограмму, которая показывает один столбец для каждой переменной, все столбцы суммируются до 100% и делятся в соответствии со значениями.- желтый для всех значений от 0 до 1,99, оранжевый для всех значений от 2 до 3,99, красный для всех значений от 4 до 5,99 и зеленый для всех значений от 6 до 7. Точнее, я ищу что-то подобное.1004 * More precisely, I am looking for something like this.

Теперь я попробовал следующий код:

Data_A <- melt(cbind(Data, ind = rownames(Data)), id.vars = c('ind'))

ggplot(Data_A, aes(x = variable, y = value, fill = factor(value))) + 
geom_bar(position = "fill", stat = "identity") + 
scale_y_continuous(labels = percent_format())  + 
coord_flip()

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

Не могли бы вы дать мне несколько рекомендаций, как получить изображение, как показано выше?

Кроме того, есть еще одна проблема: каждый из этих 8 человек принадлежит к одной из двух групп, и я хотел бы выделить ценности в свете этих двух групп.Однако включение этой дополнительной переменной в мой код просто растопит ее вместе с другими переменными.Так что я не вижу здесь никакого способа учета групп, используя, например, facet_grid () , чтобы добавить идентификатор группы.У вас есть предложение здесь?Должен ли я использовать совершенно другой подход / код?

Ответы [ 4 ]

0 голосов
/ 25 мая 2018

, благодаря очень полезным ответам, я смог собрать следующий код, чтобы ответить на первый вопрос, который я изначально задал:

DataG <- data.frame(LMX = c(1.92, 2.33, 3.52, 5.34, 6.07, 4.23, 3.45, 5.64), Thriving = c(4.33, 6.54, 6.13, 4.85, 4.26, 6.32, 5.63, 4.55), Wellbeing = c(1.92, 2.33, 3.52, 2.34, 4.07, 3.23, 3.45, 4.64) , Group_ID = c(1, 2, 1, 2, 2, 2, 1, 1))
rownames <- 1:8


DataG[Data_IlA$G1_ID == 2] %>%
  select("Leader-Member-Exchange" = LMX, "Thriving" = Thriving, "Wellbeing" = Wellbeing) %>% 
  na.omit -> DataG_1

DataG_1 %>%
  mutate_all(cut, c(0, 1.99, 3.99, 5.99, 7) ) %>%
  gather(key = "variable", value = "value") %>%
  ggplot(aes(x = variable, fill = value)) +
  geom_bar(position = position_fill(reverse = TRUE)) +
  scale_y_continuous(labels = percent_format()) +
  coord_flip() +
  scale_fill_manual(values=c("#19557E","#6E3B60", "#EA916A", "#EFC76C")) +
  theme(panel.background = element_blank())

Теперь, касательно второго вопроса, который я первоначально задал: как вы можетесм. выше в источнике данных (DataG), я добавил другую переменную G1_ID, которая является идентификатором группы - каждый респондент принадлежит к одной из двух групп.Я хотел бы показать отдельные гистограммы для значений для каждой группы.Как вы можете видеть в коде, я добавил «[Data_IlA $ G1_ID == 2]» за DataG исходных данных, чтобы R рассматривал только те значения, которые принадлежат наблюдениям, относящимся к группе 2. Однако это добавлениек коду ничего не меняет вообще.Это почему?Какой другой код я могу использовать, чтобы различать две группы?Должен ли я вместо этого прибегнуть к Facet_grid ()?

Большое спасибо за ваши комментарии,

Andreas

0 голосов
/ 24 мая 2018

Для группировки multiple numeric fills необходимо использовать функцию cut().Он сгруппирует числа в нужные вам значения от -Inf до +Inf.Затем эти группы могут быть окрашены специально, используя scale_fill_manual().

. Используйте этот код:

ggplot(Data_A, aes(x = variable, y = value)) +
  scale_y_continuous(labels = percent_format())+coord_flip()+ 
  geom_bar(position = "fill", stat = "identity",aes(fill=cut(value,c(0,2,4,6,7))))+
  scale_fill_manual(values=c("#F8F668","#F8BA5B","#F66053","#82F653"))+
  labs(fill="")+theme(panel.background = element_blank())

Вывод этого графика представлен ниже: Output Plot

Надеюсь, это поможет !!

0 голосов
/ 24 мая 2018

Это то, что вы ищете относительно первой части?(Я советую вам изменить цвета, чтобы предотвратить эпилептические припадки.)

Data %>%
  mutate_all(cut, c(0, 2, 4, 6, 7), right = F, ) %>% 
  gather(key = "variable", value= "value") %>% 
  ggplot(aes(x = variable, fill = value)) + 
  geom_bar(position = position_fill(reverse = TRUE)) +
  coord_flip() +
  scale_fill_manual(values=c("yellow", "orange", "red", "green"))

enter image description here

Для второй части будет полезен воспроизводимый пример, но вы можетевероятно, добавьте переменную «group» (от gather до ggplot) и используйте facet_grid или facet_wrap.

--- Отредактировано ниже после информации о группах ---

Выбор столбца отсутствует в DataG[Data_IlA$G1_ID == 2], а имена переменных не совпадают с именами в DataG, поэтому DataG_1 не может быть создан.

Делает ли одно из приведенных ниже предложений фигуруВы хотите?

DataG %>%
  gather(key = "variable", value = "value", -Group_ID) %>%
  mutate(value = cut(value, c(0, 1.99, 3.99, 5.99, 7))) %>%
  ggplot(aes(x = variable, fill = value)) +
  geom_bar(position = position_fill(reverse = TRUE)) +
  scale_y_continuous(labels = scales::percent) +
  coord_flip() +
  scale_fill_manual(values=c("#19557E","#6E3B60", "#EA916A", "#EFC76C")) +
  theme(panel.background = element_blank()) +
  xlab("") + ylab("") +
  facet_grid(Group_ID ~ .)

enter image description here

DataG %>%
  gather(key = "variable", value = "value", -Group_ID) %>%
  mutate(value = cut(value, c(0, 1.99, 3.99, 5.99, 7))) %>%
  ggplot(aes(x = Group_ID, fill = value)) +
  geom_bar(position = position_fill(reverse = TRUE)) +
  scale_x_discrete(limits = c("Group 1","Group 2")) +
  scale_y_continuous(labels = scales::percent) +
  coord_flip() +
  scale_fill_manual(values=c("#19557E","#6E3B60", "#EA916A", "#EFC76C")) +
  theme(panel.background = element_blank()) +
  xlab("") + ylab("") +
  facet_grid(variable ~ .)

enter image description here

-- Отредактировано ниже после комментария к группам ---

Если вам нужно изменить категории для любой переменной, самый простой способ может быть сделать это перед вызовом ggplot:

DataG %>%
  mutate(Group_ID = case_when(
    Group_ID == 1 ~ "1st group's name",
    Group_ID == 2 ~ "2nd group's name"
  )) %>% 
  gather(key = "variable", value = "value", -Group_ID) %>%
  mutate(value = cut(value, c(0, 1.99, 3.99, 5.99, 7))) %>%
  ggplot(aes(x = variable, fill = value)) +
  geom_bar(position = position_fill(reverse = TRUE)) +
  scale_y_continuous(labels = scales::percent) +
  coord_flip() +
  scale_fill_manual(values=c("#19557E","#6E3B60", "#EA916A", "#EFC76C")) +
  theme(panel.background = element_blank()) +
  xlab("") + ylab("") +
  facet_grid(Group_ID ~ .)
0 голосов
/ 24 мая 2018

Вы в порядке до melt.Это делает то, что вы после?

ggplot(Data_A, aes(x = variable, y = value, fill = cut(value,breaks = c(0,2,4,6,7)))) + 
  geom_bar(position = "fill", stat = "identity") + 
  scale_y_continuous(labels = percent_format())  +
  scale_fill_manual(name="answer",values=c("yellow","orange","red","green")) +
  coord_flip()

enter image description here

...