The Bloch sphere example in the IBM Q Experience user guide should display a plot at the end. When I run the example it does not display the plot.
I can draw circuits and other plots inline (in jupyter), but plotting in this one doesn't work for me.
The code (copied exactly from the example page) is shown below.
My environment is:
Fedora Core 30
Qiskit 0.8.2
Matplotlib 3.1.0
Python 3.7.3
Conda 4.6.11 (conda-build version: 3.17.8)
jupyter core : 4.5.0
jupyter-notebook : 5.7.8
qtconsole : not installed
ipython : 7.5.0
ipykernel : 5.1.1
jupyter client : 5.2.4
jupyter lab : not installed
nbconvert : 5.5.0
ipywidgets : 7.4.2
nbformat : 4.4.0
traitlets : 4.3.2
# quantum_phase_bloch.py
import numpy as np
from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister, execute, Aer
from qiskit.tools.visualization import plot_bloch_vector
# Define the Quantum and Classical Registers
q = QuantumRegister(1)
c = ClassicalRegister(1)
# Build the circuits
pre = QuantumCircuit(q, c)
pre.h(q)
pre.barrier()
meas_x = QuantumCircuit(q, c)
meas_x.barrier()
meas_x.h(q)
meas_x.measure(q, c)
meas_y = QuantumCircuit(q, c)
meas_y.barrier()
meas_y.s(q).inverse()
meas_y.h(q)
meas_y.measure(q, c)
meas_z = QuantumCircuit(q, c)
meas_z.barrier()
meas_z.measure(q, c)
bloch_vector = ['x', 'y', 'z']
exp_vector = range(0, 21)
circuits = []
for exp_index in exp_vector:
middle = QuantumCircuit(q, c)
phase = 2*np.pi*exp_index/(len(exp_vector)-1)
middle.u1(phase, q)
circuits.append(pre + middle + meas_x)
circuits.append(pre + middle + meas_y)
circuits.append(pre + middle + meas_z)
# Execute the circuit
job = execute(circuits, backend = Aer.get_backend('qasm_simulator'), shots=1024)
result = job.result()
# Plot the result
for exp_index in exp_vector:
bloch = [0, 0, 0]
for bloch_index in range(len(bloch_vector)):
data = result.get_counts(circuits[3*exp_index+bloch_index])
try:
p0 = data['0']/1024.0
except KeyError:
p0 = 0
try:
p1 = data['1']/1024.0
except KeyError:
p1 = 0
bloch[bloch_index] = p0-p1
plot_bloch_vector(bloch)
The last link provided by ImportanceOfBeingErnest shows a function that solves the problem (it may not be the best approach, but it helped me out so I have posted the revised code here for others).
The revised code is:
# quantum_phase_bloch.py
%matplotlib inline
import matplotlib.pyplot as plt
def show_figure(fig):
# See https://github.com/Qiskit/qiskit-terra/issues/1682
new_fig = plt.figure()
new_mngr = new_fig.canvas.manager
new_mngr.canvas.figure = fig
fig.set_canvas(new_mngr.canvas)
plt.show(fig)
import numpy as np
from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister, execute, Aer
from qiskit.tools.visualization import plot_bloch_vector
# Define the Quantum and Classical Registers
q = QuantumRegister(1)
c = ClassicalRegister(1)
# Build the circuits
pre = QuantumCircuit(q, c)
pre.h(q)
pre.barrier()
meas_x = QuantumCircuit(q, c)
meas_x.barrier()
meas_x.h(q)
meas_x.measure(q, c)
meas_y = QuantumCircuit(q, c)
meas_y.barrier()
meas_y.s(q).inverse()
meas_y.h(q)
meas_y.measure(q, c)
meas_z = QuantumCircuit(q, c)
meas_z.barrier()
meas_z.measure(q, c)
bloch_vector = ['x', 'y', 'z']
exp_vector = range(0, 21)
circuits = []
for exp_index in exp_vector:
middle = QuantumCircuit(q, c)
phase = 2*np.pi*exp_index/(len(exp_vector)-1)
middle.u1(phase, q)
circuits.append(pre + middle + meas_x)
circuits.append(pre + middle + meas_y)
circuits.append(pre + middle + meas_z)
# Execute the circuit
job = execute(circuits, backend = Aer.get_backend('qasm_simulator'), shots=1024)
result = job.result()
# Plot the result
for exp_index in exp_vector:
bloch = [0, 0, 0]
phase = 2*np.pi*exp_index/(len(exp_vector)-1)
phase_deg = phase / (2.0*np.pi) * 360.0
for bloch_index in range(len(bloch_vector)):
data = result.get_counts(circuits[3*exp_index+bloch_index])
try:
p0 = data['0']/1024.0
except KeyError:
p0 = 0
try:
p1 = data['1']/1024.0
except KeyError:
p1 = 0
bloch[bloch_index] = p0-p1
show_figure(plot_bloch_vector(bloch, title='Bloch sphere with phase {:.1f} degrees'.format(phase_deg)))