Visualizar circuitos
Versiones de paquetes
El código en esta página se desarrolló utilizando los siguientes requisitos. Recomendamos usar estas versiones o versiones más recientes.
qiskit[all]~=2.3.0
A menudo es útil ver los circuitos que está creando. Use las siguientes opciones para mostrar circuitos de Qiskit.
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit
from qiskit import QuantumCircuit
Dibujar un circuito cuántico
La clase QuantumCircuit admite dibujar circuitos a través del método draw(), o imprimiendo el objeto de circuito. Por defecto, ambos representan una versión de arte ASCII del diagrama del circuito.
Tenga en cuenta que print devuelve None pero tiene el efecto secundario de imprimir el diagrama, mientras que QuantumCircuit.draw devuelve el diagrama sin efectos secundarios. Dado que los notebooks de Jupyter muestran la salida de la última línea de cada celda, parecen tener el mismo efecto.
# Build a quantum circuit
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
Renderizadores alternativos
Una salida de texto es útil para ver rápidamente la salida mientras se desarrolla un circuito, pero no proporciona la mayor flexibilidad. Hay dos renderizadores de salida alternativos para el circuito cuántico. Uno usa Matplotlib y el otro usa LaTeX. El renderizador LaTeX requiere el paquete qcircuit. Seleccione estos renderizadores estableciendo el argumento "output" en las cadenas mpl y latex.
Los usuarios de OSX pueden obtener los paquetes LaTeX requeridos a través del paquete mactex.
# Matplotlib drawing
circuit.draw(output="mpl")
# Latex drawing
circuit.draw(output="latex")
Guardar la salida
Dibujar un circuito a gran escala en línea en un notebook de Jupyter puede ser lento o ilegible. Puede guardar el diagrama directamente en un archivo, luego abrirlo en un visor de imágenes y hacer zoom según sea necesario.
# Save as an image using the Matplotlib drawer
circuit.draw(output="mpl", filename="circuit-mpl.jpeg")
# Or save a LaTeX rendering
circuit.draw(output="latex", filename="circuit-latex.pdf")
Controlar los dibujos de circuitos
Por defecto, el método draw() devuelve la imagen renderizada como un objeto y no produce ninguna salida. La clase exacta devuelta depende de la salida especificada: 'text' (el valor predeterminado) devuelve un objeto TextDrawer, 'mpl' devuelve un objeto matplotlib.Figure, y latex devuelve un objeto PIL.Image. Los notebooks de Jupyter entienden estos tipos de retorno y los renderizan correctamente, pero cuando se ejecuta fuera de Jupyter, las imágenes no se mostrarán automáticamente.
El método draw() tiene argumentos opcionales para mostrar o guardar la salida. Cuando se especifica, el kwarg filename toma una ruta a la que guarda la salida renderizada. Alternativamente, si está usando las salidas mpl o latex, puede usar el kwarg interactive para abrir la imagen en una nueva ventana (esto no siempre funcionará desde dentro de un notebook).
Personalizar la salida
Dependiendo de la salida, también hay opciones para personalizar el diagrama del circuito.
Deshabilitar barreras de trazado y revertir el orden de bits
Las primeras dos opciones se comparten entre los tres backends. Le permiten configurar tanto los órdenes de bits como si dibuja o no barreras. Estos se pueden establecer mediante el kwarg reverse_bits y el kwarg plot_barriers, respectivamente. Los siguientes ejemplos funcionan con cualquier renderizador de salida; mpl se usa aquí por brevedad.
from qiskit import QuantumRegister, ClassicalRegister
# Draw a new circuit with barriers and more registers
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);
# Draw the circuit
circuit.draw(output="mpl")
# Draw the circuit with reversed bit order
circuit.draw(output="mpl", reverse_bits=True)
# Draw the circuit without barriers
circuit.draw(output="mpl", plot_barriers=False)
Personalizaciones específicas del renderizador
Algunas opciones de personalización disponibles son específicas de un renderizador.
El argumento fold establece un ancho máximo para la salida. En el renderizador text, esto establece la longitud de las líneas del diagrama antes de que se envuelva a la siguiente línea. Al usar el renderizador 'mpl', este es el número de capas (visuales) antes de doblar a la siguiente línea.
El renderizador mpl tiene el kwarg style, que cambia los colores y los contornos. Consulte la documentación de la API para más detalles.
La opción scale escala la salida de los renderizadores mpl y latex.
circuit = QuantumCircuit(1)
for _ in range(10):
circuit.h(0)
# limit line length to 40 characters
circuit.draw(output="text", fold=40)
┌───┐┌───┐┌───┐┌───┐┌───┐┌───┐┌───┐»
q: ┤ H ├┤ H ├┤ H ├┤ H ├┤ H ├┤ H ├┤ H ├»
└───┘└───┘└───┘└───┘└───┘└───┘└───┘»
« ┌───┐┌─ ──┐┌───┐
«q: ┤ H ├┤ H ├┤ H ├
« └───┘└───┘└───┘
# Change the background color in mpl
style = {"backgroundcolor": "lightgreen"}
circuit.draw(output="mpl", style=style)
# Scale the mpl output to 1/2 the normal size
circuit.draw(output="mpl", scale=0.5)
Función independiente de dibujo de circuitos
Si tiene una aplicación donde prefiere dibujar un circuito con una función autónoma en lugar de como un método de un objeto de circuito, puede usar directamente la función circuit_drawer(), que es parte de la interfaz pública estable de qiskit.visualization. La función se comporta de manera idéntica al método circuit.draw(), excepto que toma un objeto de circuito como argumento requerido.
from qiskit.visualization import circuit_drawer
circuit_drawer(circuit, output="mpl", plot_barriers=False)
Próximos pasos
- Vea un ejemplo de visualización de circuitos en el tutorial Algoritmo de Grover.
- Visualice circuitos simples usando IBM Quantum Composer.
- Visualice el tiempo de los circuitos.
- Revise la documentación de la API de visualizaciones de Qiskit.