PIB - 20191204: GNU R - ggplot2 - coord_flip() 時に項目を下へ向かって昇順に並べる

状況

x 軸の項目の順番

coord_flip() で x,y 軸を入れ替えると、
y 軸は上向きが正なので、項目の表示順が上へ向かって昇順に並んでしまう。

項目を下に向かって昇順に並べる方法としては、
軸の正負を逆転させるという方法も使えそうな気がするのだが、
coord_trans(xtrans="reverse") ってやる方法は coord_flip() と競合するので使えない。
また、xtrans は deprecated なので代わりに x を使えと言われて機能しない。
> g = g + coord_trans(xtrans="reverse")
Error: `xtrans` arguments is deprecated; please use `x` instead. (Defunct; last used in version 1.0.1)
xtrans ではなく x を与えるとこちらは機能する。
g = g + coord_trans(x="reverse")
しかし、そもそもの問題として coord_flip() と競合 coord_flip() が解除されてしまうため今回の場合意味がない。

coord_flip() でも同様な設定が出来ないかと
g = g + coord_flip(x="reverse")
を試してみたが以下のようなエラーが生じた。
> plot(g)
Error in range + c(-1, 1) * (width * mul + add) : 
  non-numeric argument to binary operator

scale_x_reverse() というのもあるが、こちらは scale_x_continuous() の仲間なので「Error: Continuous value supplied to discrete scale」が出る。
ひょっとすると、scale_x_discrete() で limits に levels を逆転して与えるという方法はあるかも?

doodge と凡例の順番

fill と position="doodge" で複数系列並べる場合は、doodge も下から上の順で配置される。
また、doodge と凡例の並びも反対担ってしまう。

解決方法

x 軸が factor なのであれば levels を降順ソートして作り直しておくのが正解のようだ。

doodge と凡例の方は、
fill に用いる系列の順は x 軸同様、factor の levels を降順ソートして作り直しておけば良い。
factor の levels を逆順にしても凡例はやはりその逆順に並ぶので、
こちらは guides() に fill=guide_legend(reverse=T)) を与えることで凡例の並びを逆順にしてしまうと良い。

参考

関連