这个问题提出了我昨天发布的一个不同点,有更好的描述,所以我希望你的理解。我有以下数据:
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之间的所有值。
更准确地说,我正在寻找这样的东西:
现在,我尝试了以下代码:
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()来添加组标识符。你在这里也有建议吗? 我应该使用完全不同的方法/代码吗?
答案 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()
答案 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())
希望这会有所帮助!!
答案 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"))
对于第二部分,可重现的示例很有用,但您可以添加“组”变量(gather
和ggplot
之间)并使用facet_grid
或{{1} }。
---在有关群组的信息---
之后编辑 facet_wrap
中缺少列选择,变量名称与DataG[Data_IlA$G1_ID == 2]
中的变量名称不同,因此无法创建DataG_1。
下面的建议之一是否符合您想要的数字?
DataG
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 ~ .)
---在评论群组后编辑以下
如果您需要更改任何变量的类别,最简单的方法可能是在调用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()吗?
非常感谢你的评论,
安德烈亚斯