---
title: "pyGenomeVizの使い方｜BLASTとGenBankから比較ゲノム図を描くPythonコード【1.7.0】"
url: "https://www.issoh.co.jp/tech/details/6632/"
published: 2025-05-12
updated: 2026-11-05
categories: ["Python"]
publisher: "株式会社一創"
---

# pyGenomeVizの使い方｜BLASTとGenBankから比較ゲノム図を描くPythonコード【1.7.0】

pyGenomeVizは、ゲノム上の遺伝子の並びと、複数ゲノム間の相同領域を帯でつないだ比較ゲノム図を描くPythonパッケージです。matplotlibの上に作られていて、GenBankやGFFを読み込めば十数行で論文用の図が出せます。

対象は2026年6月13日公開の1.7.0です。この記事のコードはすべて、2026年11月5日にmacOS上のPython 3.13.14・pygenomeviz 1.7.0・matplotlib 3.11.2・BLAST+ 2.17.0で実行し、画像が出力されることを確かめています。公式ドキュメントに無い日本語ラベルの文字化けへの対処と、1.6系のコードが1.7.0で落ちる原因も扱います。

## まとめ：pyGenomeViz 1.7.0で比較ゲノム図を描く要点

- 導入は `pip install pygenomeviz`。1.7.0はPython 3.10以上が必須で、3.9では黙って1.6.1が入ります。
- 描画は「GenomeVizを作る→add\_feature\_trackでトラックを足す→フィーチャーを置く→savefig」の4段階です。
- ゲノム比較は `pygenomeviz.align.Blast` でアライメントし、結果を `add_link` に流します。BLAST+本体は別途インストールが必要です。
- 読み込めるのはGenBank・GFF・FASTAの3形式です。BEDは自分で読んで座標を渡します。
- 日本語のラベルは、既定のlightテーマだと `plt.rcParams` のフォント設定が描画時に戻されます。`label_kws` と `text_kws` にフォント名を渡します。
- 1.7.0でトラックのメソッドから `target_seg` 引数が消えました。旧コードは `track.get_segment(名前)` 経由に書き換えます。

## pyGenomeVizでできることと向かない用途

作者はmoshi4（Yuki Shimoyama）氏で、ソースはGitHubの [moshi4/pyGenomeVizリポジトリ](https://github.com/moshi4/pyGenomeViz)、ライセンスはMITです。使い方は3つあります。

- Python API：Jupyter Notebookや解析スクリプトの中で図を組み立てる
- CLI：`pgv-blast` などのコマンド1本で、アライメントから図の出力までを済ませる
- GUI：`pgv-gui` でStreamlit製のWebアプリを起動し、GenBankをアップロードして図を作る

描けるのは線形の図だけです。プラスミドや細菌ゲノムを円形に描くなら、同じ作者のpyCirclizeがREADMEで案内されています。`pygenomeviz.parser` が公開しているクラスは `Fasta`・`Genbank`・`Gff` の3つで、BAMのリード被覆やVCFの変異を重ねる読み込み機能はありません。そうした図が主目的なら別のツールを選んでください。遺伝子配置と相同性を並べて見せる図に絞った道具です。

## pyGenomeVizのインストール手順（pip・conda・Docker）

### Python 3.10以上とvenvでのpipインストール

[PyPIのpygenomeviz 1.7.0](https://pypi.org/project/pygenomeviz/1.7.0/)の `requires-python` は `>=3.10`、1つ前の1.6.1は `>=3.9` です。Python 3.9で `pip install pygenomeviz` を実行すると、pipは条件を満たす1.6.1を選び、エラーを出さずに古い版を入れます。導入後は必ず版を確認してください。

```
# 仮想環境を作って有効化（macOS / Linux）
python3 -m venv .venv
source .venv/bin/activate

pip install pygenomeviz==1.7.0
python -c "import pygenomeviz; print(pygenomeviz.__version__)"
# 1.7.0
```

Windows（PowerShell）では有効化を `.venv\Scripts\Activate.ps1` で行います。依存として biopython 1.80以上、matplotlib 3.6.3以上、numpy 1.21以上が一緒に入ります。venvとコンテナの隔離の違いは[仮想環境とは？venv・コンテナ・仮想マシンの違いと隔離レベルの選び方を実装者向けに解説](/tech/details/13536/)、uvで入れる場合の操作は[uvとは？使い方とuv pip・uvx・uv syncの違い【uv 0.13.6で実測】](/tech/details/4384/)で扱っています。

### conda-forgeとDockerでの導入

BLASTやMUMmerも一緒に入れるなら、conda（bioconda併用）のほうが手間が減ります。Dockerの公式イメージにはアライナーも同梱されています。

```
conda install -c conda-forge -c bioconda pygenomeviz blast mummer mmseqs2

# Docker（公式イメージでGUIを起動）
docker run -it --rm -p 8501:8501 ghcr.io/moshi4/pygenomeviz:v1.7.0 pgv-gui
```

同じ環境でpipとcondaを混ぜると依存が壊れやすくなります。どちらに寄せるかは[pipとcondaの違いと使い分け｜混ぜると壊れる理由とAnaconda・Miniforgeの選び方](/tech/details/7775/)を参考にしてください。

### GUIと比較ワークフローに必要な追加インストール

pip版の本体だけでは、GUIとアライメントの自動実行は動きません。

| 使いたい機能            | 追加で入れるもの           | 導入例                              |
| ----------------- | ------------------ | -------------------------------- |
| pgv-gui           | streamlit 1.48.0以上 | pip install “pygenomeviz\[gui\]” |
| Blast・pgv-blast   | BLAST+             | sudo apt install ncbi-blast+     |
| MUMmer・pgv-mummer | MUMmer             | sudo apt install mummer          |
| MMseqs・pgv-mmseqs | MMseqs2            | sudo apt install mmseqs2         |
| pgv-pmauve        | progressiveMauve   | conda（bioconda）                  |

condaもaptも使わないmacOSでは、NCBIの[BLAST+配布ページ](https://ftp.ncbi.nlm.nih.gov/blast/executables/blast+/LATEST/)にある `ncbi-blast-2.17.0+-x64-macosx.tar.gz`（Apple Silicon向けは `aarch64-macosx`）を展開し、`bin` をPATHに足すだけで使えました。pyGenomeVizが呼ぶのは `makeblastdb`・`blastn`・`tblastx` の3コマンドです。

## 基本の描画手順：GenomeViz→トラック→フィーチャー→保存

1000bpのトラックに3つの遺伝子を矢印で置き、PNGで保存する最小構成です。

```
from pygenomeviz import GenomeViz

gv = GenomeViz()
gv.set_scale_xticks(ymargin=0.5)

track = gv.add_feature_track("track", 1000)
track.add_sublabel()

# add_feature(開始, 終了, 向き)  向きは 1 が正鎖、-1 が逆鎖
track.add_feature(50, 200, 1)
track.add_feature(250, 460, -1, fc="blue")
track.add_feature(500, 710, 1, fc="lime", lw=1.0, label="geneC")

gv.savefig("features.png")
```

Jupyter Notebookで画面に出すときは `fig = gv.plotfig()` でmatplotlibの `Figure` を受け取り、セルの最後に置きます。Notebook環境の準備は[Jupyter Notebookのインストール手順｜7.6系をpip・uv・condaで入れる方法](/tech/details/17961/)にまとめています。

### フィーチャーの矢印形状と配色指定

`fc`（塗り色）・`ec`（枠線色）・`lw`（線幅）はmatplotlibのPatchの引数がそのまま通ります。形は `plotstyle` で `arrow`（既定）・`bigarrow`・`box`・`bigbox`・`rbox`・`bigrbox` の6種類から選びます。`big` の付く形は鎖の向きにかかわらず軸線をまたいで描かれるので、遺伝子が密な細菌ゲノムでは `bigarrow` のほうが読みやすくなります。色名の書式などmatplotlib側の基本は[Matplotlibとは？インストール方法と使い方・日本語化【3.11.2対応】](/tech/details/3125/)を参照してください。

### エクソンとイントロンを描くadd\_exon\_feature

真核生物の遺伝子は、エクソンの区間をリストで渡すと、間をイントロンの折れ線でつないだ1つのフィーチャーになります。

```
from pygenomeviz import GenomeViz

gv = GenomeViz()
gv.set_scale_xticks()
track = gv.add_feature_track("mRNA", 3000)

track.add_exon_feature([(100, 400), (600, 900), (1200, 1500)], strand=1, label="geneA")
track.add_exon_feature(
    [(1800, 2100), (2300, 2800)], strand=-1, plotstyle="box", label="geneB",
    patch_kws=dict(fc="darkgrey"), intron_patch_kws=dict(ec="red"),
)
gv.savefig("exon.png")
```

エクソン側の見た目は `patch_kws`、イントロン線は `intron_patch_kws` で別々に指定します。`plotstyle="arrow"`（既定）では最後のエクソンだけが矢印になり、向きが一目で分かります。

## GenBank・GFFの読み込みとフィーチャー描画

### GenBankのCDS抽出とラベル付き描画

`Genbank` クラスに渡したファイルから、配列長とフィーチャーを取り出して描きます。例は公式のサンプルデータ（エルシニアファージ4株）の1株目です。

```
from pygenomeviz import GenomeViz
from pygenomeviz.parser import Genbank
from pygenomeviz.utils import load_example_genbank_dataset

gbk_files = load_example_genbank_dataset("yersinia_phage")
gbk = Genbank(gbk_files[0])   # 自分のデータなら Genbank("my_genome.gbk")

gv = GenomeViz(fig_track_height=0.7)
gv.set_scale_bar(ymargin=0.5)

track = gv.add_feature_track(gbk.name, gbk.get_seqid2size())
for seg in track.segments:
    features = gbk.get_seqid2features("CDS")[seg.name]
    seg.add_features(features, label_type="product", lw=0.5)
    seg.add_sublabel()

gv.savefig("genbank_cds.png")
```

`load_example_genbank_dataset` は初回だけGitHubからデータを取得し、`~/.cache/pygenomeviz/` に保存します。今回の実行では `gbk.get_seqid2size()` が `{'NC_070914.1': 30280}` を返し、CDSは52個でした。`label_type="product"` はGenBankのproduct修飾子（先頭CDSなら integrase）をラベルに使う指定です。複数のレコードを含むGenBankでは、レコードごとにセグメントが作られます。

### アクセッション番号によるNCBIのGenBank取得

手元にファイルが無い公開ゲノムは、`fetch_genbank_by_accid` でNCBIから直接取れます。内部ではBiopythonの `Entrez.efetch` を `rettype="gbwithparts"` で呼んでいます。

```
from pygenomeviz.parser import Genbank
from pygenomeviz.utils import fetch_genbank_by_accid

gbk = Genbank(fetch_genbank_by_accid("NC_070914", "NC_070914.gbk"))
print(gbk.name, gbk.genome_length)   # NC_070914 30280
```

第2引数を指定するとファイルにも保存されるので、2回目からはそのファイルを読めばNCBIへの再アクセスが要りません。大量に取得するときは `email=` に連絡先を渡します。

### GFFの領域指定描画と遺伝子注釈

細菌ゲノム全体を1本に描くと遺伝子が潰れます。`segments` に座標範囲を渡すと、その領域だけを並べて描けます。

```
from pygenomeviz import GenomeViz
from pygenomeviz.parser import Gff
from pygenomeviz.utils import load_example_gff_file

gff = Gff(load_example_gff_file("escherichia_coli.gff.gz"))

gv = GenomeViz()
gv.set_scale_bar(ymargin=0.5)

track = gv.add_feature_track(gff.name, segments=((215000, 230000), (300000, 320000)))
track.set_segment_sep()

for segment in track.segments:
    segment.add_sublabel()
    cds = gff.extract_features(feature_type="CDS", target_range=segment.range)
    segment.add_features(cds, label_type="gene", fc="skyblue", lw=1.0, annotation=True)

# 1.7.0 で追加された強調表示
track.segments[0].add_highlight((220000, 224000), color="orange")

fig = gv.plotfig()
fig.savefig("gff_region.png", bbox_inches="tight")
```

`annotation=True` は1.7.0で入った引数で、ラベルが重ならないよう引き出し線付きで配置します。注釈・凡例・サブトラックを足した図は `gv.savefig()` ではなく、`gv.plotfig()` で得た `Figure` の `savefig()` で保存するよう[GenomeViz APIドキュメント](https://moshi4.github.io/pyGenomeViz/api-docs/genomeviz/)に書かれています。

### BED6の座標読み込みとフィーチャー描画

BEDを読むクラスはありませんが、`add_feature` は開始・終了・向きを受け取るだけなので標準ライブラリで足ります。次の例は、ヘッダー行の無いタブ区切りのBED6（染色体名・開始・終了・名前・スコア・strand）が前提で、chr1の0〜3000の範囲だけを描きます。strandが「.」（向き不明）の行は矢印の向きを決められないため、エラーで止めます。

```
import csv
from pygenomeviz import GenomeViz

gv = GenomeViz()
gv.set_scale_xticks()
track = gv.add_feature_track("chr1", 3000)

with open("genes.bed") as f:
    for chrom, start, end, name, score, strand in csv.reader(f, delimiter="\t"):
        if chrom != "chr1":
            continue
        if strand not in ("+", "-"):
            raise ValueError("This example requires strand + or -")
        track.add_feature(int(start), int(end), 1 if strand == "+" else -1, label=name)

gv.savefig("bed.png")
```

座標の基準はそろっています。サンプルのGenBankで `complement(70..1107)` と書かれたCDSは、読み込むと `[69:1107](-)` になりました。Biopython経由の開始位置は0始まりで、BEDの開始位置と同じ基準なので変換は要りません。

## BLASTによる複数ゲノムの比較図作成（Python API）

比較図の本体は、隣り合うトラックを結ぶ帯（リンク）です。`pygenomeviz.align.Blast` に複数のGenBankを渡すと、隣どうしの組み合わせでBLASTを実行し、結果を `AlignCoord` のリストで返します。

```
from pygenomeviz import GenomeViz
from pygenomeviz.parser import Genbank
from pygenomeviz.utils import load_example_genbank_dataset
from pygenomeviz.align import Blast, AlignCoord

gbk_list = [Genbank(f) for f in load_example_genbank_dataset("yersinia_phage")]

gv = GenomeViz(track_align_type="center")
gv.set_scale_bar()
for gbk in gbk_list:
    track = gv.add_feature_track(gbk.name, gbk.get_seqid2size(), align_label=False)
    for seqid, features in gbk.get_seqid2features("CDS").items():
        track.get_segment(seqid).add_features(features, plotstyle="bigarrow", fc="limegreen", lw=0.5)

# seqtype="protein" で tblastx、既定の "nucleotide" で blastn
coords = Blast(gbk_list, seqtype="protein").run()
coords = AlignCoord.filter(coords, length_thr=100, identity_thr=30)

if not coords:
    raise ValueError("No alignments passed the filters")
vmin = int(min(ac.identity for ac in coords))
for ac in coords:
    gv.add_link(ac.query_link, ac.ref_link, color="grey", inverted_color="red", v=ac.identity, vmin=vmin)
gv.set_colorbar(["grey", "red"], vmin=vmin, bar_label="Identity (%)")

gv.savefig("blast_compare.png")
```

4株（各3万bp前後）で実行すると、tblastxのヒットは295本、両配列側の対応区間が100塩基以上・アミノ酸配列の同一性が30%以上のヒットに絞ると209本になり、実行時間は全体で約12秒でした。`v=ac.identity` を渡すと同一性が高いほど濃い色で塗られ、`set_colorbar` が右下に凡例のカラーバーを描きます。向きが逆の対応（逆位）は `inverted_color` の赤で区別されます。

近縁株どうしなら `blastn`（既定）で十分です。属が違うなど塩基配列の保存度が低い組み合わせでは、アミノ酸レベルで比べる `seqtype="protein"` のほうが帯が多く残ります。そのぶん時間がかかるため、細菌の全ゲノムを並べるならMUMmerやMMseqs2（`MUMmer`・`MMseqs` クラス）を検討してください。

### add\_linkによる相同領域の手動接続

自前の解析結果を使う場合は、「(トラック名, 開始, 終了)」のタプルを2つ渡します。

```
from pygenomeviz import GenomeViz

gv = GenomeViz()
gv.add_feature_track("genome A", 1000)
gv.add_feature_track("genome B", 1000)
gv.add_link(("genome A", 150, 300), ("genome B", 50, 200))
# 片側の開始と終了を逆にすると逆位として inverted_color で塗られる
gv.add_link(("genome A", 700, 500), ("genome B", 700, 900), inverted_color="red", curve=True)
gv.savefig("manual_links.png")
```

結べるのは追加した順で隣り合うトラックだけです。1本目と3本目を直接結ぼうとすると `LinkTrackNotFoundError`（Target feature tracks must be adjacent feature tracks!!）で止まります。比較したい順にトラックを並べてください。

## コードを書かずに比較図を出すCLIとpgv-gui

GenBankを並べて比較図を出すだけなら、CLIで足ります。コマンドは `pgv-blast`・`pgv-mummer`・`pgv-mmseqs`・`pgv-pmauve` の4つで、それぞれBLAST・MUMmer・MMseqs2・progressiveMauveを使います。

```
# サンプルデータをカレントディレクトリに取得
pgv-download yersinia_phage

# タンパク質レベルで比較し、長さ100以上・同一性30%以上のヒットだけを結ぶ
pgv-blast NC_070914.gbk NC_070915.gbk NC_070916.gbk NC_070918.gbk \
          -o pgv-blast_example --seqtype protein --show_scale_bar --curve \
          --feature_linewidth 0.3 --length_thr 100 --identity_thr 30
```

実行は約17秒で終わり、出力先には `result.png`・`result.html`・`align_coords.tsv`（アライメント座標と同一性の表）・`pgv-cli.log` の4ファイルができました。形式を指定しないとPNGとHTMLの2つが出ます。ログには実際に実行した `makeblastdb` と `tblastx` のコマンドが残るので、設定を論文の方法欄に書くときに使えます。解析を定期的に回すなら、[Nextflowとは？26.04の導入手順とパイプラインの書き方・resumeの仕組み](/tech/details/10176/)のようなワークフロー管理ツールに組み込むと再実行を管理しやすくなります。

`pgv-gui` はStreamlit製のWebアプリを `http://localhost:8501` で起動します。Pythonを書かない共同研究者にGenBankをアップロードして図を作ってもらうときに向きます。Streamlitの仕組みは[Streamlitとは？読み方・デメリットとできないこと、使い方とライセンス](/tech/details/3427/)で解説しています。社内の解析基盤に認証やデータ管理を付けて組み込む場合は、[フルスクラッチ開発](/service/system/fullscratch/)で要件に合わせて作る選択肢もあります。

## 図の体裁を整える：凡例・トラック比率・GC含量・日本語ラベル

### 凡例とダークテーマ

pyGenomeVizは凡例を自動では描きません。`plotfig()` で得た `Figure` にmatplotlibの `fig.legend` で足します。次の例は、productが hypothetical で始まるCDSを灰色、それ以外を緑にして凡例を付けます。

```
from matplotlib.lines import Line2D
from pygenomeviz import GenomeViz
from pygenomeviz.parser import Genbank
from pygenomeviz.utils import load_example_genbank_dataset

gbk = Genbank(load_example_genbank_dataset("yersinia_phage")[0])

gv = GenomeViz(fig_track_height=0.7, theme="dark")   # 既定は "light"
gv.set_scale_xticks()
track = gv.add_feature_track(gbk.name, gbk.genome_length)
for f in gbk.extract_features("CDS"):
    product = str(f.qualifiers.get("product", [""])[0])
    color = "lightgrey" if product.startswith("hypothetical") else "limegreen"
    track.add_features(f, plotstyle="bigarrow", fc=color, lw=0.5)

fig = gv.plotfig()
fig.legend(
    handles=[
        Line2D([], [], marker=">", color="limegreen", ls="none", ms=12, label="known function"),
        Line2D([], [], marker=">", color="lightgrey", ls="none", ms=12, label="hypothetical"),
    ],
    bbox_to_anchor=(1, 1), loc="upper left", frameon=False, labelcolor="white",
)
fig.savefig("legend.png", bbox_inches="tight")
```

このファージでは52個のCDSのうち11個が hypothetical でした。`theme="dark"` は黒背景のスライド向けで、matplotlibの `dark_background` スタイルが適用されます。色分けの考え方は[公式のPlot Tips](https://moshi4.github.io/pyGenomeViz/plot%5Ftips/)にも例があります。

### フィーチャートラックとリンク領域の高さ比率

トラックの高さは比率で決まり、既定はフィーチャートラックが0.25、トラック間のリンク領域が1.0でした。以下は、先ほどのBLAST比較例で複数トラックを追加したgvに対し、保存前に実行する例です。最後のフィーチャートラックと最初のリンク領域の高さ比率を変更します。

```
gv.feature_tracks[-1].set_ratio(0.5)   # 最後のフィーチャートラックを2倍に
gv.link_tracks[0].set_ratio(2.0)       # 1つ目のリンク領域を2倍に
```

全フィーチャートラックをまとめて変えるなら、`GenomeViz(feature_track_ratio=0.5)` のように作成時に渡します。

### GC含量の計算とサブトラック表示

`add_subtrack` でフィーチャートラックの下に空の軸を作り、そこへmatplotlibで任意のグラフを描けます。`Genbank` にはGC含量とGCスキューの計算メソッドがあります。

```
from pygenomeviz import GenomeViz
from pygenomeviz.parser import Genbank
from pygenomeviz.utils import load_example_genbank_dataset

gbk = Genbank(load_example_genbank_dataset("yersinia_phage")[0])
gv = GenomeViz(fig_track_height=0.7, feature_track_ratio=0.5)
gv.set_scale_xticks()
track = gv.add_feature_track(gbk.name, gbk.get_seqid2size())
track.add_subtrack(name="GC", ylim=(0, 100))
for seqid, features in gbk.get_seqid2features("CDS").items():
    track.get_segment(seqid).add_features(features, fc="steelblue", lw=0.5)

fig = gv.plotfig()
sub = track.get_subtrack("GC")
for seg in track.segments:
    seq = gbk.get_seqid2seq()[seg.name]
    x, gc = gbk.calc_gc_content(window_size=1000, step_size=200, seq=seq)
    # セグメント内の座標をトラック全体の座標に直してから描く
    sub.ax.fill_between(seg.transform_coord(x), gc, color="grey")
fig.savefig("gc_subtrack.png", bbox_inches="tight")
```

このファージの例では153点が計算され、各窓のGC含量を単純平均すると51.2%でした。この値は配列全体のGC含量とは計算方法が異なります。GCスキューは `calc_gc_skew` で同じ形の配列が返ります。`seg.transform_coord` を省くと、セグメントを複数並べたときに位置がずれます。

### 日本語のラベルが□になるときの対処

トラック名や遺伝子名に日本語を使うと、文字が□（豆腐）になり `Glyph ... missing from font(s) DejaVu Sans` という警告が出ます。matplotlibの定番の対処である `plt.rcParams["font.family"] = "Hiragino Sans"` を先に実行しても、既定のlightテーマでは同じ警告が出て直りませんでした。

原因は `plotfig()` の実装にあります。図を作る処理全体が `plt.style.context("default")`（ダークテーマでは `dark_background`）の中で動くため、lightテーマでは利用者が変えたフォント設定が既定値に戻ります。`dark_background` はフォントの設定を含まないため、darkテーマでは事前の設定が残り、警告も出ませんでした。テーマに関係なく確実なのは、ラベルごとにフォントを渡す方法です。

```
from pygenomeviz import GenomeViz

JP = dict(fontfamily="Hiragino Sans")   # macOSの例。WindowsならYu Gothicなど、OSにある日本語フォント名

gv = GenomeViz()
track = gv.add_feature_track("ゲノムA", 1000, label_kws=JP)   # トラック名
track.add_feature(100, 300, 1, label="遺伝子1", text_kws=JP)  # フィーチャーのラベル
gv.savefig("jp.png")
```

この書き方では警告が0件になり、日本語が正しく描かれました。`fig.legend` で足した凡例は `plotfig()` の外で描くので、`prop=dict(family="Hiragino Sans")` を渡します。論文やスライドで英語表記にするなら、この対処は要りません。

## 図の保存形式とdpi・HTMLビューア

`savefig` はファイル名の拡張子で形式を判別します。前述のGenBank例（30,280bp・1トラック）を各形式で保存したサイズです。

| 形式   | メソッド                    | サイズ         | 向く用途           |
| ---- | ----------------------- | ----------- | -------------- |
| PNG  | savefig(“x.png”)        | 133,621 バイト | スライド・Web       |
| JPG  | savefig(“x.jpg”)        | 103,605 バイト | 容量優先の共有        |
| SVG  | savefig(“x.svg”)        | 31,065 バイト  | Illustratorで修正 |
| PDF  | savefig(“x.pdf”)        | 19,862 バイト  | 論文投稿           |
| HTML | savefig\_html(“x.html”) | 764,433 バイト | 拡大して確認         |

解像度は `dpi` 引数で決まり、既定は100です。基本の描画例は既定で1719×340ピクセル、`gv.savefig("features.png", dpi=300)` では5157×1021ピクセルになりました。SVGはpyGenomeVizが `svg.fonttype` を `none` に設定するため、文字が図形ではなくテキストのまま残り、Illustratorで遺伝子名を直せます。

HTMLはJavaScriptのビューアを1ファイルに埋め込むので重くなる代わりに、ブラウザでパン・ズーム、フィーチャーのツールチップ表示ができます。注釈や凡例を足した図をHTMLにするときは、`fig = gv.plotfig(fast_render=False)` で作った図を `gv.savefig_html("x.html", figure=fig)` に渡します。

## 1.7.0の変更点と旧コードの移行

[GitHubのv1.7.0リリースノート](https://github.com/moshi4/pyGenomeViz/releases/tag/v1.7.0)の主な変更です。

- 追加：`add_annotation()`・`add_promoter()`・`add_lollipop()`・`add_highlight()`、`add_features()` の `annotation` 引数
- 変更：Trackクラスの描画メソッドから `target_seg` 引数を削除
- 変更：Python 3.9のサポートを終了

既存スクリプトが壊れるのは `target_seg` の削除です。1.7.0のトラックの `add_feature` や `add_sublabel` は先頭セグメントのメソッドをそのまま呼ぶため、旧コードの `target_seg="..."` は呼び出しの行では通り、matplotlibの描画オブジェクトまで渡ってから落ちます。

```
# track.add_feature(1, 100, 1, target_seg="t") のあと savefig
AttributeError: Arrow.set() got an unexpected keyword argument 'target_seg'

# track.add_sublabel(target_seg="t") のあと savefig
AttributeError: 'Text' object has no property 'target_seg'
```

エラーが `savefig` の行で出るので、原因の行を探しにくいのが厄介な点です。対象セグメントを取り出してから呼ぶ形に書き換えます。

```
# 1.6系まで
track.add_sublabel(target_seg="contig_2")

# 1.7.0
track.get_segment("contig_2").add_sublabel()
```

## よくあるエラーと対処

| 症状                               | 原因                   | 対処                               |
| -------------------------------- | -------------------- | -------------------------------- |
| No module named ‘pygenomeviz’    | 別のPythonに入れた         | venvを有効化して再実行                    |
| 新しいメソッドが無い                       | Python 3.9で1.6.1が入った | Python 3.10以上で入れ直す               |
| Failed to run ‘BLAST’ aligner!!  | BLAST+未導入・PATH不備     | which makeblastdb blastn tblastx |
| unexpected keyword ‘target\_seg’ | 1.6系の書き方             | get\_segment経由に変更                |
| LinkTrackNotFoundError           | 隣接しないトラックを結んだ        | トラックの並び順を変える                     |
| 日本語が□になる                         | lightテーマで既定フォントに戻る   | label\_kws・text\_kwsで指定          |
| 注釈や凡例が消える                        | gv.savefigで保存        | plotfigのFigureで保存                |

`RuntimeError: Failed to run 'BLAST' aligner!!` はCLIの `pgv-blast` でもAPIの `Blast(...).run()` でも同じ文言です。3コマンドがPATH上にあるのに出る場合は、直前のログに出ている実行コマンドをそのまま端末で実行すると原因が分かります。

## よくある質問

### pyGenomeVizのGitHubリポジトリと公式ドキュメントはどこですか？

ソースはGitHubのmoshi4/pyGenomeViz、ドキュメントは moshi4.github.io/pyGenomeViz で公開されています。ドキュメントにはGetting Started・Plot Tips・API・CLIの各ページがあり、READMEには描画例の画像が載っています。

### pyGenomeVizは商用や論文で無料で使えますか？

MITライセンスなので、著作権表示とライセンス文を残せば無償で使えます。論文で使う場合は、リポジトリの CITATION.cff に引用情報（pyGenomeViz: A genome visualization python package for comparative genomics、Yuki Shimoyama）が用意されています。

### pyGenomeVizで環状ゲノムは描けますか？

描けません。pyGenomeVizは線形の図専用で、環状の図には同じ作者のpyCirclizeがREADMEで案内されています。

### BLASTを入れずに比較図は作れますか？

作れます。アライメントを自分で計算するか既存の結果ファイルから座標を読み、`add_link` に渡せばBLAST+は要りません。`Blast` クラスや `pgv-blast` を使うときだけBLAST+のインストールが必要です。

### uvでインストールしても使えますか？

PyPIの通常のパッケージなので `uv pip install pygenomeviz` で入ります。1.7.0からは開発側のパッケージ管理もryeからuvに切り替わっています。

## 関連記事

- [Matplotlibとは？インストール方法と使い方・日本語化【3.11.2対応】](/tech/details/3125/)
- [pipとcondaの違いと使い分け｜混ぜると壊れる理由とAnaconda・Miniforgeの選び方](/tech/details/7775/)
- [Jupyter Notebookのインストール手順｜7.6系をpip・uv・condaで入れる方法](/tech/details/17961/)
- [Nextflowとは？26.04の導入手順とパイプラインの書き方・resumeの仕組み](/tech/details/10176/)
- [AlphaGenomeとは？使い方・API・重み公開とAtlasの提供範囲【2026年10月】](/tech/details/10897/)

---

出典: [pyGenomeVizの使い方｜BLASTとGenBankから比較ゲノム図を描くPythonコード【1.7.0】](<https://www.issoh.co.jp/tech/details/6632/>)（株式会社一創）
