创建堆积条形图每个条形图使用一个变量,使用melt和ggplot

时间:2018-05-24 19:05:01

标签: r ggplot2 melt geom-bar stacked-chart

这个问题提出了我昨天发布的一个不同点,有更好的描述,所以我希望你的理解。我有以下数据:

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之间的所有值。 更准确地说,我正在寻找这样的东西:
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 :(得分:0)

你可以到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

答案 1 :(得分:0)

要对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

希望这会有所帮助!!

答案 2 :(得分:0)

这是你在寻找关于第一部分的内容吗? (我建议你改变颜色以防止癫痫发作。)

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

对于第二部分,可重现的示例很有用,但您可以添加“组”变量(gatherggplot之间)并使用facet_grid或{{1} }。

---在有关群组的信息---

之后编辑

facet_wrap中缺少列选择,变量名称与DataG[Data_IlA$G1_ID == 2]中的变量名称不同,因此无法创建DataG_1。

下面的建议之一是否符合您想要的数字?

DataG

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 = 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 ~ .) 之前执行此操作:

ggplot

答案 3 :(得分:-1)

由于非常有用的答案,我能够汇总以下代码来回答我最初提出的第一个问题:

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,它是一个组标识符 - 每个响应者都属于两个组中的一个。 我想为每个组的值显示单独的条形图。 正如您在代码中看到的那样,我正在添加&#34; [Data_IlA $ G1_ID == 2]&#34;在源数据DataG之后,为了让R只考虑属于属于组2的观察值。但是,对代码的这种添加根本不会改变任何东西。 这是为什么?我可以使用哪些其他代码来区分这两个组?我应该求助于Facet_grid()吗?

非常感谢你的评论,

安德烈亚斯