[R] reorder函数和ggplot2绘图中坐标轴的属性排序

####今天在经管之家碰到个新问题,花了俩小时才解决。记个笔记安慰下受伤的心灵。

  • 问题:ggplot2堆叠条形图按一种颜色的数值大小排序X轴?初始数据data,三个列属性’a’,‘b’,‘c’。前两个是因子变量,后一个是数值。做一个柱状图,横坐标是因子’a’有三个因子’a1a2a3’,纵坐标是’c’,'b’用来分组堆叠。要求是,x轴因子’a1a2a3’的排序不能是默认的,要按照’b’中因子’b4’对应的’c’列的值进行排序。~~~解释起来好复杂,还是去原帖看图吧。我果然语言能力还需要加强么
  • 过程1:一开始当然是不知道答案的。百度了下‘ggplot,坐标轴排序’发现这么个老问题:R语言 菜鸟紧急求助:ggplot2画图,如何让纵坐标按照规定的顺序显示?里面有提到reorder函数。
  • 过程2:果断help('reorder')。拿着下面的examples试验。
    • bymedian <- with(InsectSprays, reorder(spray, count, median))
    • 看下结果。bymedian
      • [1] A A A A A A A A A A A A B B B B B B B B B B B B C C C C C C C C C C C C D D D D D D D D D D D D E E E E E E E E E
        [58] E E E F F F F F F F F F F F F
        attr(,“scores”)
        A B C D E F
        14.0 16.5 1.5 5.0 3.0 15.0
        Levels: C E D A F B
    • 可以看到下面的levels次序变成了CEDAFB,这个次序参照了attr(,‘scores’)的结果,也就是median函数分组计算的值。
    • reorder的三个参数中,第一个是被排序的因子序列,第二个是等长度的作为排序参考的序列,第三个是构造排序标准的加工函数。这里要对不同spray分组,按照其组内count值的中位数大小对spray排序,因此三个变量分别是spray,count,median。
  • 过程3:了解了reorder函数的机制,开始试着解决问题。原题目要求按照’b4’参量对应的’c’列的值对因子序列’a’排序。因此reorder函数第一参数应该是data$a,第二个参数应该用data$c构造,只不过只关注data$b=='b4'的部分。可以使用as.numeric(data$b=='b4')*data$c构造一个去除b1~b3对应值的序列作为第二个因子。第三个参数就简单了,使用sum也好,mean也好,其实省略也行。
  • 总结:现在看,问题的关键是构造reorder函数的第二个参数和选择第三个参数作为排序标准。 as.numeric(data$b=='b4')*data$c的方法其实我很早就想到了,只是R语言代码不熟练,吭哧了半天才敲出来可以运行的代码。最特么坑的是,原数据’b’列名是’class’,我打成了’calss’然后报错,然后以为是不支持我写的计算方式就又换别的方法去了,折腾了一个小时绕回来才发现是拼写错误。
  • 心好累,细心?不存在的

你可能感兴趣的:([R] reorder函数和ggplot2绘图中坐标轴的属性排序)