通过对数据子集进行排序来重新排序x轴变量

时间:2013-12-05 21:49:32

标签: r ggplot2

我正在尝试制作堆积条形图,我想根据单个类别的数据对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

3 个答案:

答案 0 :(得分:2)

df$name2 <- factor(df$name, levels = xvals)
ggplot(df, aes(x = name2, y = percent, fill = cat)) +
  geom_bar(stat = "identity", position = "fill")

enter image description here

答案 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")