Rのsuperheatで色々なヒートマップを描く（クラスタリングやグラフ付加）

Rのライブラリ「superheat」について簡単にまとめてみました。
このライブラリは、ヒートマップをきれいに描けるだけでなく、簡単なクラスタリングができたり、グラフや階層構造の図を併せて描くことができたりします。

※本家のドキュメントを参考にさせて頂きました。
https://rlbarter.github.io/superheat/index.html

# 使用パッケージについて
「superheat」パッケージをインストールして読み込みます。

```R:R
install.packages("superheat")
library(superheat)
```

# 通常のヒートマップを描画する
`superheat`関数へ、ヒートマップ化対象のデータを渡して実行します。
`title`でタイトル指定、`title.size`で文字サイズを指定できます。

```R:R
superheat(mtcars, 
          title="superheat sample",
          title.size=6)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254095/11869303-8d25-84cb-7209-69c9f7fd4b3d.png)

## スケーリングする
`scale`へ`TRUE`を指定することで、スケーリングができます。

```R:R
superheat(mtcars, scale=TRUE)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254095/fbdb0592-753f-529e-b14e-55afdc88a92c.png)

## ソートする
### 行/列でソートする
`pretty.order.rows`または`pretty.order.cols`へ`TRUE`を指定することで、行または列方向のソートができます。

```R:R
superheat(mtcars, scale=TRUE
          pretty.order.rows=TRUE,
          pretty.order.cols=TRUE)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254095/7ed171d1-2338-816a-cab0-65e4bd0ed6ce.png)

### カラム指定でソートする
`order.rows`または`order.cols`へ、行または列の各要素名を並べ替えた配列を指定することでソートができます。

```R:R
superheat(mtcars, scale=TRUE
          order.rows=order(mtcars$mpg)) #行方向をmpgで並べ替え
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254095/c4b6c4e5-d310-6ec7-b1c6-2bffc0d5392f.png)

## カラーマップを指定する
### カラーパレットで指定する
`heat.col.scheme`に、カレーパレット文字列を指定します。
指定できる種類は、"red", "green", "blue"などです。（デフォルトは"viridis"）

```R:R
superheat(mtcars, scale=TRUE,
          heat.col.scheme="blue")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254095/760a1007-1bdd-62f2-df6a-7edce0070910.png)


### 任意の色で指定する
最小、中間、最大の色が指定できます。

```R:R
superheat(mtcars, scale=TRUE,
          heat.pal=c("blue", "white", "red"))
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254095/129fcb82-9714-c5a2-e288-29ec47d0b6a3.png)

# クラスタリング
## デンドログラム（階層構造の分類）
`row.dendrogram`または`col.dendrogram`へ`TRUE`を指定することで、行または列方向に対し、デンドログラムによるクラスタリングができます。

```R:R
superheat(mtcars, scale=TRUE,
          row.dendrogram=TRUE)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254095/8629eaab-9294-2bc7-9a0b-40c8fa4a0b57.png)

## クラスタリング（k-means法）
`n.clusters.rows`または`n.clusters.cols`へ「クラス数」を指定することで、行または列方向に対し、k-means法によるクラスタリングができます。


```R:R
superheat(mtcars, scale=TRUE,
          n.clusters.rows=3,

          #ラベルに元々の行名を表示する
          #（これを指定しない場合は「クラス番号」のみが表示される）
          left.label="variable") 
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254095/0dbc7594-940a-a728-f9ff-f051fa8b7f58.png)

# ヒートマップへグラフを付加する
行/列方向の集約したデータをプロットしたグラフを、ヒートマップの右や上へ追加することができます。
ここでの注意点は、プロットするデータは、ヒートマップのどちら側か（右か上か）により、データ数を行数または列数と揃える必要があります。

## ヒートマップ右側へグラフを付加する
`yr`へプロットしたいデータを指定します。ヒートマップの「行数」と同一数のデータを渡す必要があります。
`yr.〜`という引数群に値を指定することで、グラフ種別や各種プロパティが設定できます。

```R:R
mpg <- mtcars$mpg
superheat(mtcars,scale=TRUE,
          yr=mpg, 
          yr.plot.type="scatter", #デフォルトは"scatter"
          yr.axis.name="mpg")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254095/b2261602-f854-9a0e-0c87-c43d113f5c32.png)

## ヒートマップ上側へグラフを付加する
`yt`へプロットしたいデータを指定します。ヒートマップの「列数」と同一数のデータを渡す必要があります。
行方向の処理と同様に、`yt.〜`という引数により各種プロパティが設定できます。

```R:R
#ここでは、各列と「mpg」との相関を算出してプロットする
#（平均値や最大値など、列数と同一数となれば問題なし）
cor_mpg <- cor(mtcars)[1,]
superheat(mtcars,scale=TRUE,
          yt=cor_mpg,
          yt.plot.type="bar",
          yt.axis.name="correlation with mpg")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254095/3ae608d4-b96d-3ed2-9c24-70c7fc0f11a2.png)

## 散布図を付加する
`yr.plot.type`または`yt.plot.type`に、"scatter"を指定します。
`yr.plot.size`または`yt.plot.size`により、プロット点のサイズを指定できます。

```R:R
superheat(mtcars,scale=TRUE,
          yr=mtcars$mpg, 
          yr.plot.type="scatter", #デフォルトは"scatter"
          yr.axis.name="mpg",
          yr.plot.size=0.5)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254095/a8b557ce-5077-013c-24c8-9101b7ea8eb5.png)

### 指定の点のみ色を変える
`yr.obs.col`または`yt.obs.col`に、全点の色を**1つずつ**指定することで、プロット点の色を指定することができます。

```R:R
#プロット点の色を1つずつ指定する配列を準備（ここでは行数分）
point.col <- rep("skyblue", nrow(mtcars))
point.col[5] <- "orange"
point.col[15] <- "green"

superheat(mtcars,scale=TRUE,
          yr=mtcars$mpg, 
          yr.plot.type="scatter", #デフォルトは"scatter"
          yr.axis.name="mpg",
          yr.plot.size=0.5,
          yr.obs.col=point.col)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254095/e356bc77-01cb-4d5a-8e1e-8877f5d8c8b3.png)

## 棒グラフを付加する
`yr.plot.type`または`yt.plot.type`に、"bar"を指定します。
散布図と同様に、`yr.plot.col`または`yt.plot.size`により、棒のサイズを指定できます。

```R:R
superheat(mtcars,scale=TRUE,
          yr=mtcars$mpg, 
          yr.plot.type="bar", 
          yr.axis.name="mpg",
          yr.plot.size=0.5)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254095/f69d02fa-e9fd-b615-b62e-3e62b4e4f068.png)

### 指定の棒のみ色を変える
`yr.bar.col`または`yt.bar.col`で枠線の色を指定できます。（全ての棒で共通）
`yr.obs.col`または`yt.obs.col`に、全棒の色を**1つずつ**指定することで、プロットされる棒の塗りつぶし色を指定することができます。

```R:R
#プロット点の色を1つずつ指定する配列を準備（ここでは行数分）
bar.col <- rep("grey", nrow(mtcars))
bar.col[5] <- "skyblue"
bar.col[15] <- "pink"

superheat(mtcars,scale=TRUE,
          yr=mtcars$mpg, 
          yr.plot.type="bar", 
          yr.axis.name="mpg",
          yr.plot.size=0.5,
          yr.bar.col="black", #枠線色
          yr.obs.col=bar.col) #棒の塗りつぶし色
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254095/b9f78182-8335-8387-e2f7-dadc39632b4b.png)

## 線グラフを付加する
`yr.plot.type`または`yt.plot.type`に、"line"を指定します。
`yr.line.size`または`yt.line.size`で線の太さを指定できます。
`yr.line.col`または`yt.line.col`で線の色を指定できます。

```R:R
superheat(mtcars, scale=TRUE,
          left.label="variable",
          yr=mtcars$mpg,
          yr.axis.name="mpg",
          yr.plot.type="line",
          yr.line.size=1,
          yr.line.col="gray")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254095/ed3944a1-3127-4f6e-b03f-17ce2c8c2f76.png)


### 平滑化(Lowess) した線グラフを付加する
`yr.plot.type`または`yt.plot.type`に、"smooth"を指定します。


```R:R
superheat(mtcars, scale=TRUE,
          left.label="variable",
          yr=mtcars$mpg,
          yr.axis.name="mpg",
          yr.plot.type="smooth",
          yr.line.size=1,
          yr.line.col="gray")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254095/d637f182-be57-c18f-b415-a08e3815fa76.png)


### 点つき線グラフを付加する
`yr.plot.type`または`yt.plot.type`に、"scatterline"を指定します。

```R:R
superheat(mtcars, scale=TRUE,
          left.label="variable",
          yr=mtcars$mpg,
          yr.axis.name="mpg",
          yr.plot.type="scatterline",
          yr.line.size=1,
          yr.line.col="gray")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254095/d1202499-2899-d798-ae9d-146db173447f.png)


## ボックスプロットを付加する
`yr.plot.type`または`yt.plot.type`に、"boxplot"を指定します。
ボックスプロットの特性上、データ点が多く含まれている必要があるため、基本的には、複数データを束ねるグループ化の変数を指定します。

```R:R
superheat(mtcars, scale=TRUE,
          # 各行が所属するグループを示す変数を指定します
          # （ここでは"gear"）
          # この値は、factorやstrである必要があります。
          membership.rows=as.factor(mtcars$gear),
         
          #ラベルに元々の行名を表示する
          #（これを指定しない場合は"gear"の「分類子」のみが表示される）
          left.label="variable",
          
          # 「boxplot」での描画を指定することで、
          # 先に指定した"gear"ごとのボックスプロットが出力されます。
          yr=mtcars$mpg,
          yr.plot.type="boxplot",
          yr.axis.name="mpg boxplot / gear")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254095/d9f2f184-1646-8ee1-7ec4-cc516581a72c.png)