####今天在经管之家碰到个新问题,花了俩小时才解决。记个笔记安慰下受伤的心灵。
- 问题: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
- [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
- 可以看到下面的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来实现堆叠条形图中X轴按照某一颜色数值大小排序的问题。作者通过实例展示了reorder函数的工作原理,以及如何根据需求调整排序依据,强调了细心和正确理解函数参数的重要性。
6172





