ggplot2で凡例を並び替えたい

**(2016/03/06追記 ggplot2 v2.1.0でも以下のコードが動作することを確認しました)**

## Q1
`ggplot2`を使って積み重ねの縦棒グラフを描くと、このようになります:


```R:NG_example.R
require(ggplot2)
p <- ggplot(diamonds, aes(cut, fill = clarity)) + 
  geom_bar()
p
```

![NG_example1.R-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/d5f861d8-6c36-1eda-6acf-9dc1d39f17f3.png)

しかし、これだと積み重ねの順番と凡例の順番が逆になります。凡例を逆順にしたいのですがどうすればいいでしょうか?

## A1
`guide_legend(reverse = TRUE)`を活用すると逆順になります:

```r:OK_example1.R
p <- ggplot(diamonds, aes(cut, fill = clarity)) + 
  geom_bar() +
  guides(fill = guide_legend(reverse = TRUE))
p
```

![OK_example1.R-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/f4485177-e2ed-e086-1843-017693f728f1.png)

この`guides(fill = guide_legend(reverse = TRUE))`によって、`aes(fill = )`で指定したfactorの順番が逆順となります。`aes(colour = )`で指定したfactorについては、以下のようにしてください:

```r:OK_example1b.R
p <- ggplot(diamonds, aes(cut, colour = clarity)) + 
  geom_bar(fill = "white") +
  guides(colour = guide_legend(reverse = TRUE))
p
```

![OK_example1b.R-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/6bda0d13-48cd-1a84-9902-a6bf1305d14b.png)

これらは棒グラフ以外でも有効です。ただし、凡例(legend)内の順序が反転するだけです。

## Q2
`ggplot2`で、「色と形」というように凡例に表示させるものが2種類以上ある場合、その変数の順番は変更できるのでしょうか。例えば以下のような場合です:

```r:NG_example2.R
p <- ggplot(diamonds, aes(carat, price, colour = clarity, shape = cut)) +
  geom_point() +
  theme(legend.position = "top")
p
```

![NG_examle2.R-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/c9587ce5-1253-cf18-0b96-b2d183f3c295.png)

このとき、オプションを指定する順番を入れ替えたり、`shape`と`colour`で指定する変数を入れ替えたりしても、必ずcutが上にくるようになります。これを入れ替える方法はあるのでしょうか?

## A2
version 0.9.2より、`guide_legend(order = )`で順番を指定することができます:

```r:OK_example2.R
p <- ggplot(diamonds, aes(carat, price, colour = clarity, shape = cut)) +
  geom_point() +
  theme(legend.position = "top") +
  guides(shape = guide_legend(order = 2),
         colour = guide_legend(order = 1))
p
```

![OK_example2.R-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/27b54318-6c43-ca04-2680-f360ab4bbff8.png)

```r:OK_example2b.R
p + guides(shape = guide_legend(order = 1),
         colour = guide_legend(order = 2))
```

![OK_example2.R-2.png](https://qiita-image-store.s3.amazonaws.com/0/35118/55eff607-cbe9-87e2-7fcb-0b81b66db917.png)


なお`guide_legend`としているように、設定があたるのは凡例(legend)だけです。

## Q3 (コメント指摘より2015/8/2に追記)
上の内容は離散的な変数の凡例ですが、連続的な変数の凡例(colourbar)ではできますか?

```r:NG_example3.R
p <- ggplot(iris, aes(x = Species, y = Sepal.Length, colour = Sepal.Width)) + 
  geom_point()
p
```

![NG_example3.R-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/e2a920d3-316f-24da-f795-d35261d13361.png)

## A3
可能です。Q1の`reverse = TRUE`やQ2の`order = hoge`のオプションは`guide_colourbar`も対応しています。まず`reverse`での例はこちらです:


```r:OK_example3.R
p <- ggplot(iris, aes(x = Species, y = Sepal.Length, colour = Sepal.Width)) + 
  geom_point() +
  guides(colour = guide_colourbar(reverse = TRUE))
p
```

![OK_example3.R-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/d557aa2f-522d-4974-5ee9-7df527024a75.png)

`order`での例はこちらです:

```r:OK_example4.R
p <- ggplot(diamonds, aes(carat, price, colour = depth, shape = cut)) +
  geom_point() +
  theme(legend.position = "top") +
  guides(shape = guide_legend(order = 1),
         colour = guide_colourbar(order = 2))
p
```

![OK_example4.R-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/5d8ec97e-947e-8885-be28-540d0c85f389.png)

`guides`をつけていないと、`colourbar`のdepthが優先されて上に来ますが、このコードのように設定すると下に来ます。

## 参考
- [guide_legend. ggplot2 0.9.3.1](http://docs.ggplot2.org/current/guide_legend.html)
- [guide_colourbar. ggplot2 0.9.3.1](http://docs.ggplot2.org/current/guide_colourbar.html) (Q3に対応して追加, 2015/8/2)
- [R: sort legend in ggplot2 - Stack Overflow](http://stackoverflow.com/questions/9577680/r-sort-legend-in-ggplot2)
- [r - Controlling ggplot2 legend display order - Stack Overflow](http://stackoverflow.com/questions/11393123/controlling-ggplot2-legend-display-order)