Search code examples
pythonmatplotlibjupyter-notebookqiskit

qiskit example in Q Experience User Guide doesn't show plot


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)

Solution

  • 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)))