为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用ggplot2上的标识控制堆积条形图的顺序

/ 猿问

如何使用ggplot2上的标识控制堆积条形图的顺序

米脂 2019-12-03 10:13:55

使用这个假人 data.frame


ts <- data.frame(x=1:3, y=c("blue", "white", "white"), z=c("one", "one", "two"))

我尝试在顶部绘制“蓝色”类别。


ggplot(ts, aes(z, x, fill=factor(y, levels=c("blue","white" )))) + geom_bar(stat = "identity")

http://img1.sycdn.imooc.com/5de5c4f30001948805960446.jpg

在上面给我“白色”。和


ggplot(ts, aes(z, x, fill=factor(y, levels=c("white", "blue")))) + geom_bar(stat = "identity")

http://img2.sycdn.imooc.com/5de5c4fb00010cd605960446.jpg

反转颜色,但顶部仍给我“白色”。我怎样才能在顶部获得“蓝色”?



查看完整描述

3 回答

?
慕盖茨4494581

我以前也遇到过同样的问题。ggplot似乎根据条形在数据框中的出现来堆叠条形。因此,解决问题的方法是按照填充因子对数据进行排序,其填充顺序应与您希望其在图例中显示的顺序相反:数据框顶部的底部项目,底部的顶部项目:


ggplot(ts[order(ts$y, decreasing = T),],

       aes(z, x, fill=factor(y, levels=c("blue","white" )))) + 

  geom_bar(stat = "identity")

//img3.sycdn.imooc.com/5de5c509000119f018001800.jpg

编辑:更多插图

使用示例数据,我创建了三个具有不同数据帧顺序的图,我认为更多的填充变量会使情况更清晰。


set.seed(123)

library(gridExtra)

df <- data.frame(x=rep(c(1,2),each=5),

                 fill_var=rep(LETTERS[1:5], 2),

                 y=1)

#original order   

p1 <- ggplot(df, aes(x=x,y=y,fill=fill_var))+

  geom_bar(stat="identity") + labs(title="Original dataframe")



#random order

p2 <- ggplot(df[sample(1:10),],aes(x=x,y=y,fill=fill_var))+

  geom_bar(stat="identity") + labs(title="Random order")

#legend checks out, sequence wird


#reverse order

p3 <- ggplot(df[order(df$fill_var,decreasing=T),],

             aes(x=x,y=y,fill=fill_var))+

  geom_bar(stat="identity") + labs(title="Reverse sort by fill")


plots <- list(p1,p2,p3)


do.call(grid.arrange,plots)

//img3.sycdn.imooc.com/5de5c5100001d94004800480.jpg

查看完整回答
反对 2019-12-03
?
守着星空守着你

值得一提的是,在ggplot2版本2.2.1中,堆栈的顺序不再由data.frame中的行顺序确定。取而代之的是,它与图例的顺序匹配,该顺序由因子中的级别顺序决定。


d <- data.frame(

  y=c(0.1, 0.2, 0.7),

  cat = factor(c('No', 'Yes', 'NA'), levels = c('NA', 'Yes', 'No')))


# Original order

p1 <- ggplot(d, aes(x=1, y=y, fill=cat)) +

  geom_bar(stat='identity')


# Change order of rows

p2 <- ggplot(d[c(2, 3, 1), ], aes(x=1, y=y, fill=cat)) +

  geom_bar(stat='identity')


# Change order of levels

d$cat2 <- relevel(d$cat, 'Yes')

p3 <- ggplot(d, aes(x=1, y=y, fill=cat2)) +

  geom_bar(stat='identity') 


grid.arrange(p1, p2, p3, ncol=3)

结果如下图:

//img2.sycdn.imooc.com/5de5c51e0001debe08680493.jpg

查看完整回答
反对 2019-12-03
?
幕布斯6054654

group在ggplot()通话中使用美感。这样可以确保所有层以相同的方式堆叠。


series <- data.frame(

  time = c(rep(1, 4),rep(2, 4), rep(3, 4), rep(4, 4)),

  type = rep(c('a', 'b', 'c', 'd'), 4),

  value = rpois(16, 10)

)


ggplot(series, aes(time, value, group = type)) +

  geom_col(aes(fill = type)) +

  geom_text(aes(label = type), position = "stack")


查看完整回答
反对 2019-12-03
  • 3 回答
  • 0 关注
  • 773 浏览

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信