使用ggplot2对堆积条形图中的分类数据进行排序 [英] Order categorical data in a stacked bar plot with ggplot2

查看:149
本文介绍了使用ggplot2对堆积条形图中的分类数据进行排序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个包含以下条目的矩阵:

  dput(MilDis [1:200,])
结构(列表(hhDomMil = c(HED,ETB,HED,ETB,PER,
BUM,EXP,TRA,TRA,PMA MAT,MAT,KON,ETB,
,PMA,PMA,HED,BUM,BUM,HED,PMA, PMAHED
TRABUMEXPBUMPMAETBMATETBETB
KON,MAT,TRA,BUM,BUM,TRA,TRA,PMA,PMA,
PMA,MAT ETB,TRA,BUM,TRA,MAT,BUM,ETB,
,TRA,TRA,BUM,KON,ETB ETBETBBUMKON
ETBETBPMATRAPERPERMAT HED,KON,
,TRA,TRA,TRA,EXP,TRA,BUM,MAT,MAT,TRA,
PMA,HED,PER,TRA,PER,EXP,PER,BUM,KON,
BUM,ETB, ETBTRAPERETBKONKONBUM
ETBBUMMATBUMKON ,KON,ETB,MAT,KON,
PER,ETB,ETB,KON,PMA,PER,HED, HED,PMA,
MA T,PMA,PER,PMA,TRA,TRA,MAT,BUM,BUM,bb, ,ETB,PMA,TRA,TRA,PMA,PER,
KON,PER,BUM,KON,ETB ETB,BUM,TRA,ETB,
,PMA,HED,MAT,TRA,BUM,PMA,BUM,ETB, ,TRA,TRA,PER,EXP,HED,BUM,EXP,HED,BUM,b $ b, MAT,BUM,MAT,KON,HED,HED,TRA,BUM,
PMA,PMA,PMA ,KON,KON,MAT,ETB,MAT,TRA,
,MAT,ETB,ETB,TRA,MAT, ETBTRAHEDBUM
MATTRAPMABUMBUMEXPETBEXP ,EXP,
MAT,TRA,KON,BUM,BUM,HED),kclust = c(1L,2L,
15L,4L, 5L,6L,5L,7L,8L,5L,6L,5L,11L,6L,5L,1L,9L,
10L,2L,1L,9L,8L,4L,11L,14L,5L,8L, 11L,12L,5L,5L,
14L,15L,2L,10L,6L,8L,4L,6L,8L,14L,14L,16L,10L,5L,
1L,12L, 12L,16L,16L,5L,10L,14L,8L,19L,5L,4L,4L,
14L,2L,14L,9L,7L,1L,14L,4L,15L, 18L,16L,9L,14L,6L,
14L,12L,11L,4L,7L,8L,12L,9L,16L,2L,6L,15L,1L, 5L,5L,9L,14L,6L,5L,14L,15L,2L,14L,2L,1L,
8L,5L,10L,1L,1L,16L,5L,2L,9L,9L, 12L,10L,1L,4L,
1L,9L,8L,8L,5L,10L,1L,10L,2L,6L,15L,2L,2L,10L,5L,
6L,10L, 19L,19L,6L,5L,6L,7L,7L,8L,5L,16L,5L,6L,6L,
1L,10L,12L,4L,7L,19L,7L,8L,16L,10L, 5L,16L,12L,7L,
7L,19L,4L,6L,1L,15L,7L,8L,16L,4L,10L,15L,11L,10L,
1L,10L,17L, 1L,2L,1L,14L,8L,8L,14L,10L,8L,6L,6L,
8L,5L,7L,5L,1L,5L,7L,9L,2L,1L,9L,14L) ,order = c(9,
1,9,1,3,7,10,5,5,2,8,8,4,1,2,2,9,7,7,9,2 ,
2,9,5,7,10,7,2,1,8,1,4,8,5,7,7,5,5,2,2,
2 ,8,1,5,7,5,8,7,1,5,5,7,4,1,1,1,7,4,1,1,2,
5,3,3 ,8,9,4,5,5,10,5,7,8,8,5,2,9,3,5,3,$ b $ 10,3,7,4,7,1 ,1,5,3,1,4,4,7,1,7,8,7,4,4,1,1,b,b,3,4,3,1,1, 4个,2个,3个,9个,9个,2个,8个,2个,3个,2,5,5,8,7,7,4个,
1,1,1,2,5,5,2, 3,4,3,7,4,1,1,7,5,1,2,9,8,5,
7,2,7,1,5,5,5,3,10, 9,7,8,4,9,
9,5,7,2,2, 8个,1个,5个,8个,1,5,9,7个,
8个,5个,2个,7个,7个,10个,10个,10个,8个,5个,4个,7个, 9)),.Names = c(hhDomMil,
kclust,order),row.names = c(NA,200L),class =data.frame)

我想创建一个像这样的堆积条形图。



唯一的问题是,我想让堆栈的顺序适合这个(ETB, PMA,PER,KON,TRA,DDR,BUM,MAT,HED,EXP) - 矩阵中的订货号,我也有一些美学问题。我在这里搜索了一个解决方案,但没有任何订购建议为我工作...:-\


  1. 如何绘制这样的订单图?

  2. 如何设置x以便每个栏位都在一个数字上?

  3. 如何分隔酒吧 - 此处我试图用白色边框...?

  4. 如何在x中打印所有kclust数字?

非常感谢您的帮助!
Dominik





更新

下面是我用来绘制我的情节的代码:

  mycols<  -  c('#FFFD00', '#97CB00','#3168FF','#FF0200','#FB02FE',\ 
'#CCFCCC','#FE9900','#98CBF8','#00CCFF','#00FD03' )#设置环境颜色


ggplot(MilDis)+
geom_bar(aes(kclust,fill = factor(hhDomMil),\
color = mycols), position ='fill',binwidth = 1,color ='white')+
scale_fill_manual(values = mycols)






更新2: 这就是我现在的做法:'#3168FF','#00CCFF','#98CBF8','#CCFCCC','#CCCF',' #00FD03',\
'#97CB00','#FFFD00','#FE9900','#FB02FE','#FF0200')#设置环境颜色

ggplot(MilDis )+
geom_bar(aes(factor(kclust),fill = reorder( hhDomMil,order)),\
position ='fill')+
scale_fill_manual(values = mycols)

有了这个结果:

$ b

谢谢大家的帮助!

解决方案

我看到您的数据框中有一个订单列,我收集的是您的订单。因此,你可以简单地做。

  p0 = qplot(factor(kclust),fill = reorder(hhDomMil,order),position ='fill',
data = df1)

这段代码的元素可以解决您的问题 p>


  1. 如何绘制这样的有序图? reorder

  2. 如何设置x以便每个小节在一个数字上开? 因素(kclust)

  3. 我如何分离横条?

  4. 如何打印x中的所有kclust数字? 因素(kclust)

我记得你以前的问题, hhDomMil 对应不同的群组,我怀疑您的订购是在分组之后进行的。在这种情况下,您可能想要使用该信息来选择一个调色板,使其更易于遵循图形。

  mycols = c(brewer.pal(3,'Oranges'),brewer.pal (3,'Greens'),
brewer.pal(2,'Blues'),brewer.pal(2,'PuRd'))

p0 + scale_fill_manual(values = mycols)


I have a matrix with the following entries:

dput(MilDis[1:200,])
structure(list(hhDomMil = c("HED", "ETB", "HED", "ETB", "PER", 
"BUM", "EXP", "TRA", "TRA", "PMA", "MAT", "MAT", "KON", "ETB", 
"PMA", "PMA", "HED", "BUM", "BUM", "HED", "PMA", "PMA", "HED", 
"TRA", "BUM", "EXP", "BUM", "PMA", "ETB", "MAT", "ETB", "ETB", 
"KON", "MAT", "TRA", "BUM", "BUM", "TRA", "TRA", "PMA", "PMA", 
"PMA", "MAT", "ETB", "TRA", "BUM", "TRA", "MAT", "BUM", "ETB", 
"TRA", "TRA", "BUM", "KON", "ETB", "ETB", "ETB", "BUM", "KON", 
"ETB", "ETB", "PMA", "TRA", "PER", "PER", "MAT", "HED", "KON", 
"TRA", "TRA", "TRA", "EXP", "TRA", "BUM", "MAT", "MAT", "TRA", 
"PMA", "HED", "PER", "TRA", "PER", "EXP", "PER", "BUM", "KON", 
"BUM", "ETB", "ETB", "TRA", "PER", "ETB", "KON", "KON", "BUM", 
"ETB", "BUM", "MAT", "BUM", "KON", "KON", "ETB", "MAT", "KON", 
"PER", "ETB", "ETB", "KON", "PMA", "PER", "HED", "HED", "PMA", 
"MAT", "PMA", "PER", "PMA", "TRA", "TRA", "MAT", "BUM", "BUM", 
"KON", "ETB", "ETB", "ETB", "PMA", "TRA", "TRA", "PMA", "PER", 
"KON", "PER", "BUM", "KON", "ETB", "ETB", "BUM", "TRA", "ETB", 
"PMA", "HED", "MAT", "TRA", "BUM", "PMA", "BUM", "ETB", "TRA", 
"TRA", "TRA", "PER", "EXP", "HED", "BUM", "EXP", "HED", "BUM", 
"MAT", "DDR", "BUM", "MAT", "KON", "HED", "HED", "TRA", "BUM", 
"PMA", "PMA", "PMA", "KON", "KON", "MAT", "ETB", "MAT", "TRA", 
"MAT", "ETB", "ETB", "TRA", "MAT", "ETB", "TRA", "HED", "BUM", 
"MAT", "TRA", "PMA", "BUM", "BUM", "EXP", "ETB", "EXP", "EXP", 
"MAT", "TRA", "KON", "BUM", "BUM", "HED"), kclust = c(1L, 2L, 
15L, 4L, 5L, 6L, 5L, 7L, 8L, 5L, 6L, 5L, 11L, 6L, 5L, 1L, 9L, 
10L, 2L, 1L, 9L, 8L, 4L, 11L, 14L, 5L, 8L, 11L, 12L, 5L, 5L, 
14L, 15L, 2L, 10L, 6L, 8L, 4L, 6L, 8L, 14L, 14L, 16L, 10L, 5L, 
1L, 12L, 17L, 12L, 16L, 16L, 5L, 10L, 14L, 8L, 19L, 5L, 4L, 4L, 
14L, 2L, 14L, 9L, 7L, 1L, 14L, 4L, 15L, 18L, 16L, 9L, 14L, 6L, 
14L, 12L, 11L, 4L, 7L, 8L, 12L, 9L, 16L, 2L, 6L, 15L, 1L, 1L, 
3L, 14L, 5L, 5L, 9L, 14L, 6L, 5L, 14L, 15L, 2L, 14L, 2L, 1L, 
8L, 5L, 10L, 1L, 1L, 16L, 5L, 2L, 9L, 9L, 1L, 12L, 10L, 1L, 4L, 
1L, 9L, 8L, 8L, 5L, 10L, 1L, 10L, 2L, 6L, 15L, 2L, 2L, 10L, 5L, 
6L, 10L, 19L, 19L, 6L, 5L, 6L, 7L, 7L, 8L, 5L, 16L, 5L, 6L, 6L, 
1L, 10L, 12L, 4L, 7L, 19L, 7L, 8L, 16L, 10L, 5L, 16L, 12L, 7L, 
7L, 19L, 4L, 6L, 1L, 15L, 7L, 8L, 16L, 4L, 10L, 15L, 11L, 10L, 
1L, 10L, 17L, 1L, 2L, 1L, 14L, 8L, 8L, 14L, 10L, 8L, 6L, 6L, 
8L, 5L, 7L, 5L, 1L, 5L, 7L, 9L, 2L, 1L, 9L, 14L), order = c(9, 
1, 9, 1, 3, 7, 10, 5, 5, 2, 8, 8, 4, 1, 2, 2, 9, 7, 7, 9, 2, 
2, 9, 5, 7, 10, 7, 2, 1, 8, 1, 1, 4, 8, 5, 7, 7, 5, 5, 2, 2, 
2, 8, 1, 5, 7, 5, 8, 7, 1, 5, 5, 7, 4, 1, 1, 1, 7, 4, 1, 1, 2, 
5, 3, 3, 8, 9, 4, 5, 5, 5, 10, 5, 7, 8, 8, 5, 2, 9, 3, 5, 3, 
10, 3, 7, 4, 7, 1, 1, 5, 3, 1, 4, 4, 7, 1, 7, 8, 7, 4, 4, 1, 
8, 4, 3, 1, 1, 4, 2, 3, 9, 9, 2, 8, 2, 3, 2, 5, 5, 8, 7, 7, 4, 
1, 1, 1, 2, 5, 5, 2, 3, 4, 3, 7, 4, 1, 1, 7, 5, 1, 2, 9, 8, 5, 
7, 2, 7, 1, 5, 5, 5, 3, 10, 9, 7, 10, 9, 7, 8, 6, 7, 8, 4, 9, 
9, 5, 7, 2, 2, 2, 4, 4, 8, 1, 8, 5, 8, 1, 1, 5, 8, 1, 5, 9, 7, 
8, 5, 2, 7, 7, 10, 1, 10, 10, 8, 5, 4, 7, 7, 9)), .Names = c("hhDomMil", 
"kclust", "order"), row.names = c(NA, 200L), class = "data.frame")

I want to create a stacked bar plot like this one .

The only problem is, that I would like to have the order of the stacks to fit this (ETB,PMA,PER,KON,TRA,DDR,BUM,MAT,HED,EXP) - the order numbers in the matrix and I have also some aesthetic problems. I searched for a solution here but none of the ordering suggestions worked for me... :-\

  1. How do I plot such a ordered plot?
  2. How do I set up x so that each bar is "on" one number?
  3. How do I seperate the bars - here I tried that with a white border...?
  4. How do I print all kclust numbers in x?

Thanks a lot for your help! Dominik


UPDATE

Here is the code I used to draw my plot:

mycols <- c('#FFFD00', '#97CB00', '#3168FF', '#FF0200', '#FB02FE', \
'#CCFCCC', '#FE9900', '#98CBF8', '#00CCFF', '#00FD03') # Set milieu colors


ggplot(MilDis) +
 geom_bar(aes(kclust, fill=factor(hhDomMil), \
 colour=mycols), position='fill', binwidth=1, colour='white') +
 scale_fill_manual(values = mycols)


UPDATE 2:

That's how I did it now:

    mycols <- c('#3168FF', '#00CCFF', '#98CBF8', '#CCFCCC', '#00FD03',\
   '#97CB00', '#FFFD00', '#FE9900', '#FB02FE', '#FF0200') # Set milieu colors

    ggplot(MilDis) +
      geom_bar(aes(factor(kclust), fill=reorder(hhDomMil,order)),\
      position='fill') +
      scale_fill_manual(values = mycols)

With this result:

Thank you all for your help!

解决方案

I see that you have an order column in your data frame which I gather is your order. Hence you can simply do.

p0 = qplot(factor(kclust), fill = reorder(hhDomMil, order), position = 'fill', 
       data = df1)

Here are the elements of this code that take care of your questions

  1. How do I plot such a ordered plot? reorder
  2. How do I set up x so that each bar is "on" one number? factor(kclust)
  3. How do I seperate the bars?
  4. How do I print all kclust numbers in x? factor(kclust)

I remember from a previous question of yours that the hhDomMil corresponded to different groups, and I suspect your ordering follows the grouping. In that case, you might want to use that information to choose a color palette that makes it simpler to follow the graph. Here is one way to do it.

mycols = c(brewer.pal(3, 'Oranges'), brewer.pal(3, 'Greens'), 
           brewer.pal(2, 'Blues'), brewer.pal(2, 'PuRd'))

p0 + scale_fill_manual(values = mycols)

这篇关于使用ggplot2对堆积条形图中的分类数据进行排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆