0

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)
John
  • 451
  • 7
  • 17
  • That is a very unfortunate design choice of qiskit. [It closes the pyplot figure](https://github.com/Qiskit/qiskit-terra/blob/ae1921a41a481ae90b12ea7c494c19fdbf4f70fe/qiskit/visualization/state_visualization.py#L157) for no apparent reason. You can go along [Matplotlib: how to show a figure that has been closed](https://stackoverflow.com/questions/31729948/matplotlib-how-to-show-a-figure-that-has-been-closed) to still show it I suppose. – ImportanceOfBeingErnest Jul 09 '19 at 01:31
  • [Here is](https://github.com/Qiskit/qiskit-terra/issues/1682) the issue. – ImportanceOfBeingErnest Jul 09 '19 at 01:44

1 Answers1

0

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)))
John
  • 451
  • 7
  • 17