MSAデータ可視化Pythonパッケージ「pyMSAviz」の紹介

https://github.com/moshi4/pyMSAviz

本記事では、MSA(Multiple Sequence Alignment)データを簡単に可視化することを目的として個人開発してみたPythonパッケージ「**pyMSAviz**」([GitHub](https://github.com/moshi4/pyMSAviz) / [Document](https://moshi4.github.io/pyMSAviz))を紹介します。

MSAデータの可視化は、基本的には[Jalview](https://www.jalview.org/)や[SeaView](https://doua.prabi.fr/software/seaview)といったGUIツールを使えばいいと思います。ただ、場合によってはAPIやCLIで自動的にMSA可視化図を出力したいときもあります。そういったケースでpyMSAvizを利用することで、可視化範囲やハイライト位置等を柔軟に設定したMSA可視化図をいい感じに出力することができます。

# 実装機能

MSAデータの基本的な処理にはBiopythonの[Bio.Align](https://biopython.org/docs/latest/api/Bio.Align.html)を活用して、Pythonの標準的な描画パッケージであるmatplotlibをベースにJalviewを参考にした表示スタイル・[各種カラースキーム](https://www.jalview.org/help/html/colourSchemes/index.html)でMSAデータを可視化するAPI/CLI機能を実装しています。機能実装する上で、MSAデータ可視化Rパッケージである[ggmsa](https://github.com/YuLab-SMU/ggmsa)の実装も参考にしました。

pyMSAvizでは、主に以下のようなMSA可視化機能を実装しています。

- MSAの可視化範囲の指定
- 任意のMSA折返し長の指定
- 各種カラースキームでの表示
- コンセンサス配列・保存度バーの表示
- 指定位置・範囲へのハイライトやマーカー、テキストアノテーション表示

![api_example01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138429/569e49b1-c1b8-bf44-bbf2-1c17c13f27f3.png)
Fig1. シンプルなMSA可視化図例

![api_example03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138429/12bd55b1-ea37-4473-a61f-182971a92a16.png)
Fig2. カスタマイズしたMSA可視化図例

# インストール方法

pyMSAvizは[PyPI](https://pypi.org/project/pymsaviz/)と[bioconda](https://anaconda.org/bioconda/pymsaviz)にそれぞれパッケージを登録しているので、`pip`または`conda`コマンドでインストール可能です。

**PyPIパッケージ**
```
pip install pymsaviz
```

**Biocondaパッケージ**
```
conda install -c conda-forge -c bioconda pymsaviz
```

# API実行例

pyMSAvizのAPI実行例の一部をここに記載します。より詳細なAPI実行例に興味があれば、[Getting Started](https://moshi4.github.io/pyMSAviz/getting_started/)や[API Docs](https://moshi4.github.io/pyMSAviz/api-docs/msaviz/)の各種ドキュメントを参照してください。

## API Example1

```python
from pymsaviz import MsaViz, get_msa_testdata

msa_file = get_msa_testdata("HIGD2A.fa")
mv = MsaViz(msa_file, wrap_length=60, show_count=True)
mv.savefig("api_example01.png")
```

![api_example01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138429/0962c118-ddcc-9a6f-1812-ed4254e0941e.png)

## API Example2

```python
from pymsaviz import MsaViz, get_msa_testdata

msa_file = get_msa_testdata("MRGPRG.fa")
mv = MsaViz(msa_file, color_scheme="Taylor", wrap_length=80, show_grid=True, show_consensus=True)
mv.savefig("api_example02.png")
```

![api_example02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138429/c35dbf10-1b9a-5ffb-c765-0277aab4c89e.png)

## API Example3

```python
from pymsaviz import MsaViz, get_msa_testdata

msa_file = get_msa_testdata("MRGPRG.fa")
mv = MsaViz(msa_file, end=180, wrap_length=60, show_consensus=True)

# Extract MSA positions less than 50% consensus identity
pos_ident_less_than_50 = []
ident_list = mv._get_consensus_identity_list()
for pos, ident in enumerate(ident_list, 1):
    if ident <= 50:
        pos_ident_less_than_50.append(pos)

# Add markers
mv.add_markers([1])
mv.add_markers([10, 20], color="orange", marker="o")
mv.add_markers([30, (40, 50), 55], color="green", marker="+")
mv.add_markers(pos_ident_less_than_50, marker="x", color="blue")
# Add text annotations
mv.add_text_annotation((76, 102), "Gap Region", text_color="red", range_color="red")
mv.add_text_annotation((112, 123), "Gap Region", text_color="green", range_color="green")

mv.savefig("api_example03.png")
```

![api_example03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138429/600baa23-975a-d48a-d828-56fb92d4132f.png)

# CLI実行例

簡単にコマンドからMSAデータ可視化をするためにpyMSAvizではCLIも実装しています。CLIのMSAデータ可視化の機能性・柔軟性は、APIと比較すると低くなります。
実行例で利用しているテストデータは[こちら](https://github.com/moshi4/pyMSAviz/raw/main/example/example.zip)からダウンロードできます。

## CLIオプション設定

```text
$ pymsaviz -h
usage: pymsaviz [-i I] -o O [--format] [--color_scheme] [--start] [--end] [--wrap_length]
                [--wrap_space_size] [--show_grid] [--show_count] [--show_consensus] [--consensus_color]
                [--consensus_size] [--sort] [--dpi] [-v] [-h]

MSA(Multiple Sequence Alignment) visualization CLI tool

optional arguments:
-i I, --infile I    Input MSA file
-o O, --outfile O   Output MSA visualization file (*.png|*.jpg|*.svg|*.pdf)
--format            MSA file format (Default: 'fasta')
--color_scheme      Color scheme (Default: 'Zappo')
--start             Start position of MSA visualization (Default: 1)
--end               End position of MSA visualization (Default: 'MSA Length')
--wrap_length       Wrap length (Default: None)
--wrap_space_size   Space size between wrap MSA plot area (Default: 3.0)
--show_grid         Show grid (Default: OFF)
--show_count        Show seq char count without gap on right side (Default: OFF)
--show_consensus    Show consensus sequence (Default: OFF)
--consensus_color   Consensus identity bar color (Default: '#1f77b4')
--consensus_size    Consensus identity bar height size (Default: 2.0)
--sort              Sort MSA order by NJ tree constructed from MSA distance matrix (Default: OFF)
--dpi               Figure DPI (Default: 300)
-v, --version       Print version information
-h, --help          Show this help message and exit

Available Color Schemes:
['Clustal', 'Zappo', 'Taylor', 'Flower', 'Blossom', 'Sunset', 'Ocean', 'Hydrophobicity', 'HelixPropensity', 
 'StrandPropensity', 'TurnPropensity', 'BuriedIndex', 'Nucleotide', 'Purine/Pyrimidine', 'Identity', 'None']
```


## CLI Example1

```shell
pymsaviz -i ./example/HIGD2A.fa -o cli_example01.png --color_scheme Identity
```

![cli_example01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138429/1cc64b1d-90ec-6254-035a-e4cb638ca4e7.png)

## CLI Example2

```shell
pymsaviz -i ./example/MRGPRG.fa -o cli_example02.png --wrap_length 80 \
         --color_scheme Taylor --show_consensus --show_count
```

![cli_example02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138429/67f6f2e1-f45e-c51b-7e84-b3bda96c3f5b.png)

## CLI Example3

```shell
pymsaviz -i ./example/MRGPRG.fa -o cli_example03.png --start 100 --end 160 \
         --color_scheme Flower --show_grid --show_consensus --consensus_color tomato 
```

![cli_example03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138429/55222ff8-41c7-555a-35a2-18098bd92f74.png)

# 最後に

matplotlibのプロット機能の理解をより深めるために、MSAデータの可視化を題材として**pyMSAviz**を開発してみました。記事冒頭に記述した通り、MSAデータの可視化は基本的にはGUIツールを使えばいいと思っているので、あまり需要はないのかなと思っています。もし興味がある方がいれば、触ってみてください。

https://github.com/moshi4/pyMSAviz