不同的填充订单
我有这个ggplot:不同的填充订单
我想要做的是改变的cat2
顺序在每个不同的cat1
-category递减的顺序share
:
- 对于CAT1 == Z:
i
将是第一位的,因为它在cat1
最大的份额,其次是k
,然后j
等 - 对于CAT1 == Y:
j
将是第一位的,因为它在cat1
最大的份额,其次是h
,k
,f
,g
- 等所有CAT1类别。
我知道我可以通过定义因子水平来控制顺序,但是由于我需要不同的cat1类别中的不同顺序,所以我不确定如何执行此操作。
有人能够启发我吗?
df <- structure(list(cat2 = c("i", "k", "j", "h", "g", "j", "h", "k",
"f", "g", "j", "h", "k", "f", "g", "i", "k", "j", "h", "f"),
cat1 = c("Z", "Z", "Z", "Z", "Z", "Y", "Y", "Y", "Y", "Y",
"X", "X", "X", "X", "X", "W", "W", "W", "W", "W"), share = c(0.254318086442458,
0.217254586570476, 0.13303361614456, 0.107317457057957, 0.0796390207719751,
0.255762968963295, 0.198921069216629, 0.177295815678624,
0.100770340584133, 0.0971042138291394, 0.222007778896866,
0.177174367182501, 0.156891912894117, 0.097677432116308,
0.0975337223454565, 0.503295513011454, 0.154491050393999,
0.114284166914891, 0.0802892036069214, 0.0549053589320047
), pos = c(0.477447245936265, 0.108627293285238, 0.283771394642756,
0.658265017686473, 0.751743256601439, 0.305177300160272,
0.532519319250233, 0.088647907839312, 0.779469237979754,
0.680531960773118, 0.26789580234255, 0.467486875382234, 0.0784459564470585,
0.702446497377094, 0.604840920146212, 0.520422973814617,
0.0772455251969995, 0.211633133851444, 0.812215332123805,
0.879812613393268)), .Names = c("cat2", "cat1", "share",
"pos"), class = "data.frame", row.names = c(NA, -20L))
library(ggplot2)
ggplot(df, aes(cat1, share)) +
geom_bar(stat = "identity", aes(fill = cat2)) +
geom_text(aes(label = cat2, y = pos)) +
coord_flip()
注:我目前的想法是,或许可以使用带有设置为1,第2,第3,第4,第5级别的新类别来完成,但如果我用的填充,例如i
对于Z
和j
的不同cat2值(例如i
对于Y
将具有相同的填充颜色,因为它们在我不想要的相应cat1类别中是第一的。
您可以通过创建一个新的因子列,我们称之为cat3
,基于cat1
和cat2
。根据cat1
和share
设置此列的因子排序。然后使用这个新的cat3
因子列作为group
唯美性来设置条的堆叠顺序。
在下面的代码中,arrange
设置了排序。我们在cat1
的每个级别内分别排列数据帧share
。现在数据框是按照我们想要的顺序。然后我们通过粘贴cat1
和cat2
创建cat3
,并将级别的顺序设置为数据帧的当前排序顺序。最后,在ggplot
内,我们使用cat3
作为group
唯美性来设置geom_bar
中的堆叠顺序。
另一个补充是使用position_stack(vjust=0.5)
来设置标签的位置,而不是y
美学。
library(tidyverse)
df %>%
arrange(cat1, share) %>%
mutate(cat3 = factor(paste(cat1, cat2), levels=paste(cat1, cat2))) %>%
ggplot(aes(cat1, share, group=cat3)) +
geom_bar(stat = "identity", aes(fill = cat2)) +
geom_text(aes(label = cat2), position=position_stack(vjust=0.5)) +
coord_flip()
完美,谢谢! (也用于介绍'position_stack') –
[订购通过尺寸堆叠在一个堆叠GGPLOT2条形图]的可能的复制(https://stackoverflow.com/questions/9227389/ordering-stacks-by-size-in-a -ggplot2-stacked-bar-graph) – Mako212
@ Mako212,谢谢你的链接。我可能是错的,但不会定义一个“静态”的顺序,将以同样的方式应用在所有堆积的酒吧? –