回路を可視化する
パッケージバージョン
このページのコードは、以下の要件を使用して開発されました。 これらのバージョンまたはそれ以降のバージョンの使用を推奨します。
qiskit[all]~=2.3.0
作成している回路を確認することは多くの場合有用です。Qiskit回路を表示するには、次のオプションを使用します。
from qiskit import QuantumCircuit
量子回路を描画する
QuantumCircuitクラスは、draw()メソッドを使用した回路の描画、または回路オブジェクトの印刷をサポートしています。デフォルトでは、どちらも回路図のASCIIアート版をレンダリングします。
printはNoneを返しますが、図を印刷する副作用があることに注意してください。一方、QuantumCircuit.drawは副作用なしで図を返します。Jupyterノートブックは各セルの最後の行の出力を表示するため、同じ効果があるように見えます。
# 量子回路を構築
circuit = QuantumCircuit(3, 3)
circuit.x(1)
circuit.h(range(3))
circuit.cx(0, 1)
circuit.measure(range(3), range(3));
print(circuit)
┌───┐ ┌─┐
q_0: ┤ H ├───────■──┤M├───
├───┤┌───┐┌─┴─┐└╥┘┌─┐
q_1: ┤ X ├┤ H ├┤ X ├─╫─┤M├
├───┤└┬─┬┘└───┘ ║ └╥┘
q_2: ┤ H ├─┤M├───────╫──╫─
└───┘ └╥┘ ║ ║
c: 3/═══════╩════════╩══╩═
2 0 1
circuit.draw()
┌───┐ ┌─┐
q_0: ┤ H ├───────■──┤M├───
├───┤┌───┐┌─┴─┐└╥┘┌─┐
q_1: ┤ X ├┤ H ├┤ X ├─╫─┤M├
├───┤└┬─┬┘└───┘ ║ └╥┘
q_2: ┤ H ├─┤M├───────╫──╫─
└───┘ └╥┘ ║ ║
c: 3/═══════╩════════╩══╩═
2 0 1
代替レンダラー
テキスト出力は、開発中に出力を素早く確認するのに便利ですが、最も柔軟性があるわけではありません。量子回路には2つの代替出力レンダラーがあります。1つはMatplotlibを使用し、もう1つはLaTeXを使用します。LaTeXレンダラーにはqcircuitパッケージが必要です。「output」引数を文字列mplとlatexに設定することで、これらのレンダラーを選択します。
OSXユーザーは、mactexパッケージを通じて必要なLaTeXパッケージを入手できます。
# Matplotlib描画
circuit.draw(output="mpl")
# Latex描画
circuit.draw(output="latex")
出力を保存する
Jupyterノートブックで大規模な回路をインラインで描画すると、遅くなったり、読みにくくなったりする可能性があります。 図を直接ファイルに保存し、画像ビューアーで開いて必要に応じてズームインできます。
# Matplotlibドロワーを使用して画像として保存
circuit.draw(output="mpl", filename="circuit-mpl.jpeg")
# またはLaTeXレンダリングを保存
circuit.draw(output="latex", filename="circuit-latex.pdf")
回路描画を制御する
デフォルトでは、draw()メソッドはレンダリングされた画像をオブジェクトとして返し、何も出力しません。返される正確なクラスは、指定された出力によって異なります: 'text'(デフォルト)はTextDrawerオブジェクトを返し、'mpl'はmatplotlib.Figureオブジェクトを返し、latexはPIL.Imageオブジェクトを返します。Jupyterノートブックはこれらの戻り値の型を理解し、適切にレンダリングしますが、Jupyter外で実行する場合、画像は自動的に表示されません。
draw()メソッドには、出力を表示または保存するオプションの引数があります。指定すると、filename引数は、レンダリングされた出力を保存するパスを取ります。あるいは、mplまたはlatex出力を使用している場合、interactive引数を使用して新しいウィンドウで画像を開くことができます(これは常にノートブック内から機能するとは限りません)。
出力をカスタマイズする
出力に応じて、回路図をカスタマイズするオプションもあります。
プロットバリアを無効にし、ビット順序を逆にする
最初の2つのオプションは、3つのバックエンドすべてで共有されています。これらにより、ビット順序とバリアを描画するかどうかの両方を設定できます。これらは、それぞれreverse_bits引数とplot_barriers引数によって設定できます。次の例は、任意の出力レンダラーで機能します。簡潔にするために、ここではmplを使用しています。
from qiskit import QuantumRegister, ClassicalRegister
# バリアとより多くのレジスターを持つ新しい回路を描画
q_a = QuantumRegister(3, name="a")
q_b = QuantumRegister(5, name="b")
c_a = ClassicalRegister(3)
c_b = ClassicalRegister(5)
circuit = QuantumCircuit(q_a, q_b, c_a, c_b)
circuit.x(q_a[1])
circuit.x(q_b[1])
circuit.x(q_b[2])
circuit.x(q_b[4])
circuit.barrier()
circuit.h(q_a)
circuit.barrier(q_a)
circuit.h(q_b)
circuit.cswap(q_b[0], q_b[1], q_b[2])
circuit.cswap(q_b[2], q_b[3], q_b[4])
circuit.cswap(q_b[3], q_b[4], q_b[0])
circuit.barrier(q_b)
circuit.measure(q_a, c_a)
circuit.measure(q_b, c_b);
# 回路を描画
circuit.draw(output="mpl")
# 逆ビット順序で回路を描画
circuit.draw(output="mpl", reverse_bits=True)
# バリアなしで回路を描画
circuit.draw(output="mpl", plot_barriers=False)
レンダラー固有のカスタマイズ
一部の利用可能なカスタマイズオプションは、レンダラーに固有です。
fold引数は、出力の最大幅を設定します。textレンダラーでは、これは、次の行に折り返される前の図の行の長さを設定します。mplレンダラーを使用する場合、これは次の行に折り返される前の(視覚的な)レイヤーの数です。
mplレンダラーには、色とアウトラインを変更するstyle引数があります。詳細については、APIドキュメントを参照してください。
scaleオプションは、mplおよびlatexレンダラーの出力をスケーリングします。
circuit = QuantumCircuit(1)
for _ in range(10):
circuit.h(0)
# 行の長さを40文字に制限
circuit.draw(output="text", fold=40)
┌───┐┌───┐┌───┐┌───┐┌───┐┌───┐┌───┐»
q: ┤ H ├┤ H ├┤ H ├┤ H ├┤ H ├┤ H ├┤ H ├»
└───┘└───┘└───┘└───┘└───┘└───┘└───┘»
« ┌───┐┌───┐┌───┐
«q: ┤ H ├┤ H ├┤ H ├
« └───┘└───┘└───┘
# mplで背景色を変更
style = {"backgroundcolor": "lightgreen"}
circuit.draw(output="mpl", style=style)
# mpl出力を通常サイズの1/2にスケーリング
circuit.draw(output="mpl", scale=0.5)
スタンドアロン回路描画関数
回路オブジェクトのメソッドではなく、独立した関数で回路を描画することを好むアプリケーションがある場合、qiskit.visualizationの公開安定インターフェースの一部であるcircuit_drawer()関数を直接使用できます。この関数は、必須引数として回路オブジェクトを取る点を除いて、circuit.draw()メソッドと同じように動作します。
from qiskit.visualization import circuit_drawer
circuit_drawer(circuit, output="mpl", plot_barriers=False)
次のステップ
- Groverのアルゴリズムチュートリアルで回路可視化の例を参照してください。
- IBM Quantum Composerを使用してシンプルな回路を可視化してください。
- 回路タイミングを可視化する
- Qiskit可視化APIドキュメントを確認してください。