我正在尝试制作堆积条形图,我想根据单个类别的数据对x轴上的变量进行重新排序。在下面的示例中,有三个x值,每个值具有对应于三个类别的值。如何在对名称值进行排序时绘制图形以增加“bb”的丰度。
虽然此问题类似于有关reordering categorical variables的其他问题,但这里的区别在于排序基于一列数据的子集。任何建议表示赞赏。
#create the dataframe
name = c('a', 'a', 'a', 'b', 'b', 'b','c','c','c')
cat = c("aa", "bb", "cc", "aa", "bb", "cc","aa", "bb", "cc")
percent = c( 5 , 5, 90, 40, 40 , 20, 90,5,5)
df = data.frame(name, cat, percent)
#stacked barchart with default ordering
ggplot(df, aes(x=name,y=percent, fill=cat)) + geom_bar(position="fill")
#I'm looking to reorder the x-axis by the `percent` values for category "bb"
vals = df[ df$cat == 'bb', ] #subset
xvals = vals[with(vals, order(percent)), ]$name #get values
ggplot(df, aes(x =reorder(name, xvals ), y = percent, fill=cat])) + geom_bar(position="fill") #order with new values
答案 0 :(得分:2)
df$name2 <- factor(df$name, levels = xvals)
ggplot(df, aes(x = name2, y = percent, fill = cat)) +
geom_bar(stat = "identity", position = "fill")
答案 1 :(得分:1)
这里有两个问题。首先,您要根据bb
中的百分比求助。第二个是ggplot
始终按字母顺序对分类x轴进行排序,因此您需要绕过它。
首先,要使用数据,具有讽刺意味的是,您需要转换为宽格式,排序,然后重新转换为长格式:
zz <- dcast(df,name~cat) # columns for aa, bb, cc
yy <- zz[order(zz$bb),] # order by bb
yy <- cbind(id=1:nrow(yy),yy) # add an id column; will need later
gg <- melt(yy,id.vars=c("id","name"),variable.name="cat",value.name="percent")
然后:
ggplot(gg, aes(x=factor(id),y=percent, fill=cat))+
geom_bar()+
scale_x_discrete(labels=gg$name)+
labs(x="name")
产生这个:
答案 2 :(得分:0)
df$name2 = factor(df$name, levels = levels(df$name), labels = xvals)
ggplot(df, aes(x = name2, y = percent, fill=cat)) + geom_bar(position="fill")