メインコンテンツへスキップ

回路を可視化する

パッケージバージョン

このページのコードは、以下の要件を使用して開発されました。 これらのバージョンまたはそれ以降のバージョンの使用を推奨します。

qiskit[all]~=2.3.0

作成している回路を確認することは多くの場合有用です。Qiskit回路を表示するには、次のオプションを使用します。

from qiskit import QuantumCircuit

量子回路を描画する

QuantumCircuitクラスは、draw()メソッドを使用した回路の描画、または回路オブジェクトの印刷をサポートしています。デフォルトでは、どちらも回路図のASCIIアート版をレンダリングします。

printNoneを返しますが、図を印刷する副作用があることに注意してください。一方、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」引数を文字列mpllatexに設定することで、これらのレンダラーを選択します。

ヒント

OSXユーザーは、mactexパッケージを通じて必要なLaTeXパッケージを入手できます。

# Matplotlib描画
circuit.draw(output="mpl")

Output of the previous code cell

# Latex描画
circuit.draw(output="latex")

Output of the previous code cell

出力を保存する

Jupyterノートブックで大規模な回路をインラインで描画すると、遅くなったり、読みにくくなったりする可能性があります。 図を直接ファイルに保存し、画像ビューアーで開いて必要に応じてズームインできます。

# Matplotlibドロワーを使用して画像として保存
circuit.draw(output="mpl", filename="circuit-mpl.jpeg")

Output of the previous code cell

# またはLaTeXレンダリングを保存
circuit.draw(output="latex", filename="circuit-latex.pdf")

Output of the previous code cell

回路描画を制御する

デフォルトでは、draw()メソッドはレンダリングされた画像をオブジェクトとして返し、何も出力しません。返される正確なクラスは、指定された出力によって異なります: 'text'(デフォルト)はTextDrawerオブジェクトを返し、'mpl'matplotlib.Figureオブジェクトを返し、latexPIL.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")

Output of the previous code cell

# 逆ビット順序で回路を描画
circuit.draw(output="mpl", reverse_bits=True)

Output of the previous code cell

# バリアなしで回路を描画
circuit.draw(output="mpl", plot_barriers=False)

Output of the previous code cell

レンダラー固有のカスタマイズ

一部の利用可能なカスタマイズオプションは、レンダラーに固有です。

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)

Output of the previous code cell

# mpl出力を通常サイズの1/2にスケーリング
circuit.draw(output="mpl", scale=0.5)

Output of the previous code cell

スタンドアロン回路描画関数

回路オブジェクトのメソッドではなく、独立した関数で回路を描画することを好むアプリケーションがある場合、qiskit.visualizationの公開安定インターフェースの一部であるcircuit_drawer()関数を直接使用できます。この関数は、必須引数として回路オブジェクトを取る点を除いて、circuit.draw()メソッドと同じように動作します。

from qiskit.visualization import circuit_drawer

circuit_drawer(circuit, output="mpl", plot_barriers=False)

Output of the previous code cell

次のステップ

推奨事項