アメリエフの技術ブログ

Amelieff Staff Blog

Seurat や Monocle のプロットの配色を調べる

こんにちは、データ受託解析チームのtsuyuhです。

受託解析では、お客様のご要望に沿った様々な図を作成します。
解析中に出た図たちは最終的に報告書として綺麗にまとめる訳ですが、後々に論文等で"映える"ようにプロットの大きさや色などを密かに工夫しています。

例えば、プロットの色は使うツールによって自動的に塗られることが多いですが、複数のツールを使って様々な図を作成するとどうしても配色が異なってしまいます。
ところが、手動で塗ろうとしても色名が分からず、最後に図を並べたら微妙に違う色になっていてモヤモヤする、なんてことも多いんじゃないでしょうか。

そこで今回は、シングルセルRNA-seq解析 でよく用いられるツール Seurat や Monocle3 で描いた図を例に挙げて、プロットの色を調べる方法をご紹介します。

Seurat のプロット

例えば、Seurat の標準的なワークフローで解析すると下記のようなUMAP プロットが得られます。

(引用:https://satijalab.org/seurat/articles/pbmc3k_tutorial.html )

9個のクラスタが9色に塗り分けられています。
他の色々なRパッケージでも同じ配色の図をよく見ますね。個人的に好きな配色です。
これは、Seurat のデフォルトでは ggplot2 というパッケージをベースとしてプロットを返すようになっており、その ggplot2 が使っているカラーパレットに基づいています。なお、このことはSeurat 公式ページ で説明してくれています。

ちなみに、このカラーパレットはHSLと呼ばれ、イラスト系のソフトでよく見るこういうやつです↓

(引用:https://en.wikipedia.org/wiki/HSL_and_HSV )
このうち H (Hue, 色相) を等間隔で変えて色の塗分けをしているというわけです。

また、それぞれのクラスタが何色に塗られているのかは、Rパッケージscalesで調べることができます。
(参考:https://scales.r-lib.org/reference/hue_pal.html)
使い方は簡単↓

# パッケージの読み込み
> library(scales)

# 各色の表示。数字のところにUMAPプロットのクラスタ数を入力する。
> show_col(hue_pal()(9))

すると、こんな図が出力されます。
各クラスタの配色が16進数で表示されました。

あとは、これを参考に cols = c("0" = "#F8766D", "1" = "#D39200", ......) みたいなオプションを使うツールに応じて付けてあげれば、配色を合わせられます。

Monocle3 のプロット

Monocle3 で擬似系譜解析をおこなうと、このようにpseudotimeに応じてグラデーションで塗られます。

(引用:https://cole-trapnell-lab.github.io/monocle3/docs/trajectories/)

この配色の図は他のRパッケージではあまり見たことがありません。よくあるヒートマップとも少し違う色合いになっています。
これは、viridis というRパッケージで用意されているカラーパレットを利用しているようです。
下図のような8つのスケールが含まれてます。

Monocle3 が viridis を用いてることは、Seurat と同様に公式ページで説明してくれていますが、少し分かりづらいところに記載されています。
この viridis を利用すれば、他の図でも同じ配色のグラデーションでプロットを塗ることができます。
(viridis の使い方は少し複雑なのでまた別の機会に...。)

中にはどういうツールを使って配色を決めているか明記されてないパッケージもあるため、そんな時には関数の中身を調べることが重要になってきます。
例えば Monocle3 の plot_cell 関数ならこんな感じのやつです↓

> plot_cells
function (cds, x = 1, y = 2, reduction_method = c("UMAP", 
    "tSNE", "PCA", "LSI", "Aligned"), 
    color_cells_by = "cluster", group_cells_by = c("cluster", 
        "partition"), genes = NULL, show_trajectory_graph = TRUE, 
    trajectory_graph_color = "grey28", trajectory_graph_segment_size = 0.75, ......
...... (以下略) ......

この関数の中身を見て、色を規定しているところを見つけ、そこで使われているまた別の関数を調べ、、、という作業になります。
(大変ですが、"それっぽい" 単語を適当にググっていくと、いつか目的のカラーパレットの画像に辿り着くと思います。)

いつか自分用のカラーパレットを作って、どんな図でも自在に色を操れるようになりたいものです。