mirror of
https://github.com/K-Dense-AI/claude-scientific-skills.git
synced 2026-01-26 16:58:56 +08:00
7.7 KiB
7.7 KiB
Visualization in Qiskit
Qiskit provides comprehensive visualization tools for quantum circuits, measurement results, and quantum states.
Installation
Install visualization dependencies:
uv pip install "qiskit[visualization]" matplotlib
Circuit Visualization
Text-Based Drawings
from qiskit import QuantumCircuit
qc = QuantumCircuit(3)
qc.h(0)
qc.cx(0, 1)
qc.cx(1, 2)
# Simple text output
print(qc.draw())
# Text with more detail
print(qc.draw('text', fold=-1)) # Don't fold long circuits
Matplotlib Drawings
# High-quality matplotlib figure
qc.draw('mpl')
# Save to file
fig = qc.draw('mpl')
fig.savefig('circuit.png', dpi=300, bbox_inches='tight')
LaTeX Drawings
# Generate LaTeX circuit diagram
qc.draw('latex')
# Save LaTeX source
latex_source = qc.draw('latex_source')
with open('circuit.tex', 'w') as f:
f.write(latex_source)
Customizing Circuit Drawings
Styling Options
from qiskit.visualization import circuit_drawer
# Reverse qubit order
qc.draw('mpl', reverse_bits=True)
# Fold long circuits
qc.draw('mpl', fold=20) # Fold at 20 columns
# Show idle wires
qc.draw('mpl', idle_wires=False)
# Add initial state
qc.draw('mpl', initial_state=True)
Color Customization
style = {
'displaycolor': {
'h': ('#FA74A6', '#000000'), # Hadamard: pink
'cx': ('#A8D0DB', '#000000'), # CNOT: light blue
'measure': ('#F7E7B4', '#000000') # Measure: yellow
}
}
qc.draw('mpl', style=style)
Result Visualization
Histogram of Counts
from qiskit.visualization import plot_histogram
from qiskit.primitives import StatevectorSampler
qc = QuantumCircuit(2)
qc.h(0)
qc.cx(0, 1)
qc.measure_all()
sampler = StatevectorSampler()
result = sampler.run([qc], shots=1024).result()
counts = result[0].data.meas.get_counts()
# Plot histogram
plot_histogram(counts)
# Compare multiple experiments
counts1 = {'00': 500, '11': 524}
counts2 = {'00': 480, '11': 544}
plot_histogram([counts1, counts2], legend=['Run 1', 'Run 2'])
# Save figure
fig = plot_histogram(counts)
fig.savefig('histogram.png', dpi=300, bbox_inches='tight')
Histogram Options
# Customize colors
plot_histogram(counts, color=['#1f77b4', '#ff7f0e'])
# Sort by value
plot_histogram(counts, sort='value')
# Set bar labels
plot_histogram(counts, bar_labels=True)
# Set target distribution (for comparison)
target = {'00': 0.5, '11': 0.5}
plot_histogram(counts, target=target)
State Visualization
Bloch Sphere
Visualize single-qubit states on the Bloch sphere:
from qiskit.visualization import plot_bloch_vector
from qiskit.quantum_info import Statevector
import numpy as np
# Visualize a specific state vector
# State |+⟩: equal superposition of |0⟩ and |1⟩
state = Statevector.from_label('+')
plot_bloch_vector(state.to_bloch())
# Custom vector
plot_bloch_vector([0, 1, 0]) # |+⟩ state on X-axis
Multi-Qubit Bloch Sphere
from qiskit.visualization import plot_bloch_multivector
qc = QuantumCircuit(2)
qc.h(0)
qc.cx(0, 1)
state = Statevector.from_instruction(qc)
plot_bloch_multivector(state)
State City Plot
Visualize state amplitudes as a 3D city:
from qiskit.visualization import plot_state_city
from qiskit.quantum_info import Statevector
qc = QuantumCircuit(3)
qc.h(range(3))
state = Statevector.from_instruction(qc)
plot_state_city(state)
# Customize
plot_state_city(state, color=['#FF6B6B', '#4ECDC4'])
QSphere
Visualize quantum states on a sphere:
from qiskit.visualization import plot_state_qsphere
state = Statevector.from_instruction(qc)
plot_state_qsphere(state)
Hinton Diagram
Display state amplitudes:
from qiskit.visualization import plot_state_hinton
state = Statevector.from_instruction(qc)
plot_state_hinton(state)
Density Matrix Visualization
from qiskit.visualization import plot_state_density
from qiskit.quantum_info import DensityMatrix
qc = QuantumCircuit(2)
qc.h(0)
qc.cx(0, 1)
state = DensityMatrix.from_instruction(qc)
plot_state_density(state)
Gate Map Visualization
Visualize backend coupling map:
from qiskit.visualization import plot_gate_map
from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService()
backend = service.backend("ibm_brisbane")
# Show qubit connectivity
plot_gate_map(backend)
# Show with error rates
plot_gate_map(backend, plot_error_rates=True)
Error Map Visualization
Display backend error rates:
from qiskit.visualization import plot_error_map
plot_error_map(backend)
Circuit Properties Display
from qiskit.visualization import plot_circuit_layout
# Show how circuit maps to physical qubits
transpiled_qc = transpile(qc, backend=backend)
plot_circuit_layout(transpiled_qc, backend)
Pulse Visualization
For pulse-level control:
from qiskit import pulse
from qiskit.visualization import pulse_drawer
# Create pulse schedule
with pulse.build(backend) as schedule:
pulse.play(pulse.Gaussian(duration=160, amp=0.1, sigma=40), pulse.drive_channel(0))
# Visualize
schedule.draw()
Interactive Widgets (Jupyter)
Circuit Composer Widget
from qiskit.tools.jupyter import QuantumCircuitComposer
composer = QuantumCircuitComposer()
composer.show()
Interactive State Visualization
from qiskit.visualization import plot_histogram
import matplotlib.pyplot as plt
# Enable interactive mode
plt.ion()
plot_histogram(counts)
plt.show()
Comparison Plots
Multiple Histograms
# Compare results from different backends
counts_sim = {'00': 500, '11': 524}
counts_hw = {'00': 480, '01': 20, '10': 24, '11': 500}
plot_histogram(
[counts_sim, counts_hw],
legend=['Simulator', 'Hardware'],
figsize=(12, 6)
)
Before/After Transpilation
import matplotlib.pyplot as plt
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(16, 4))
# Original circuit
qc.draw('mpl', ax=ax1)
ax1.set_title('Original Circuit')
# Transpiled circuit
qc_transpiled = transpile(qc, backend=backend, optimization_level=3)
qc_transpiled.draw('mpl', ax=ax2)
ax2.set_title('Transpiled Circuit')
plt.tight_layout()
plt.show()
Saving Visualizations
Save to Various Formats
# PNG
fig = qc.draw('mpl')
fig.savefig('circuit.png', dpi=300, bbox_inches='tight')
# PDF
fig.savefig('circuit.pdf', bbox_inches='tight')
# SVG (vector graphics)
fig.savefig('circuit.svg', bbox_inches='tight')
# Histogram
hist_fig = plot_histogram(counts)
hist_fig.savefig('results.png', dpi=300, bbox_inches='tight')
Styling Best Practices
Publication-Quality Figures
import matplotlib.pyplot as plt
# Set matplotlib style
plt.rcParams['figure.dpi'] = 300
plt.rcParams['font.size'] = 12
plt.rcParams['font.family'] = 'sans-serif'
# Create high-quality visualization
fig = qc.draw('mpl', style='iqp')
fig.savefig('publication_circuit.png', dpi=600, bbox_inches='tight')
Available Styles
# Default style
qc.draw('mpl')
# IQP style (IBM Quantum)
qc.draw('mpl', style='iqp')
# Colorblind-friendly
qc.draw('mpl', style='bw') # Black and white
Troubleshooting Visualization
Common Issues
Issue: "No module named 'matplotlib'"
uv pip install matplotlib
Issue: Circuit too large to display
# Use folding
qc.draw('mpl', fold=50)
# Or export to file instead of displaying
fig = qc.draw('mpl')
fig.savefig('large_circuit.png', dpi=150, bbox_inches='tight')
Issue: Jupyter notebook not displaying plots
# Add magic command at notebook start
%matplotlib inline
Issue: LaTeX visualization not working
# Install LaTeX support
uv pip install pylatexenc