Nota
Esta página foi gerada a partir do link tutorials/circuits/2_plotting_data_in_qiskit.ipynb.
Execute interativamente no IBM Quantum lab.
Visualizações no Qiskit¶
[1]:
from qiskit import *
from qiskit.visualization import plot_histogram
from qiskit.tools.monitor import job_monitor
Desenhando o histograma¶
Para visualizar os dados que um circuito quântico executa em um dispositivo real ou no qasm_simulator
, fizemos uma função simples
plot_histogram(data)
Como um exemplo, fazemos um estado de Bell de 2 qubits
[2]:
# quantum circuit to make a Bell state
bell = QuantumCircuit(2, 2)
bell.h(0)
bell.cx(0, 1)
meas = QuantumCircuit(2, 2)
meas.measure([0,1], [0,1])
# execute the quantum circuit
backend = BasicAer.get_backend('qasm_simulator') # the device to run on
circ = bell + meas
result = execute(circ, backend, shots=1000).result()
counts = result.get_counts(circ)
print(counts)
{'00': 528, '11': 472}
[3]:
plot_histogram(counts)
[3]:

Opções quando desenhamos um histograma¶
A função plot_histogram()
fornece algumas opções para ajustar o gráfico de resultados. A primeira opção é o kward legend
. Este é usado para fornecer um rótulo para as execuções. Ele recebe uma lista de strings para rotular os resultados de cada execução. Isso é principalmente útil quando traçando os resultados de várias execuções em um mesmo histograma. O kwarg sort
é usado para ajustar a ordem em que as barras do histograma são renderizadas. Ele pode ser definido para ordem crescente com asc
ou ordem decrescente com desc
. O kwarg number_to_keep
recebe um número inteiro para o número de termos a serem mostrados, o resto é agrupado em uma única barra chamada rest. Você pode ajustar a cor das barras com o kwarg color
que recebe uma string ou uma lista de strings para as cores a serem usadas nas barras para cada execução. Você pode decidir se os rótulos são mostrados acima das barras ou não com o kwarg bar_labels
. A última opção disponível é o kwarg fig_size
que recebe uma tupla do tamanho em polegadas da figura de saída.
[4]:
# Execute 2-qubit Bell state again
second_result = execute(circ, backend, shots=1000).result()
second_counts = second_result.get_counts(circ)
# Plot results with legend
legend = ['First execution', 'Second execution']
plot_histogram([counts, second_counts], legend=legend)
[4]:

[5]:
plot_histogram([counts, second_counts], legend=legend, sort='desc', figsize=(15,12),
color=['orange', 'black'], bar_labels=False)
[5]:

Usando a saída da função plot_histogram()¶
Ao usar a função plot_histogram(), a mesma retorna uma matplotlib.Figure
para a visualização renderizada. Os notebooks do Jupyter entendem este tipo de retorno e renderizam-no para nós, neste tutorial, mas quando estiver executando fora do Jupyter você não tem esse recurso, automaticamente. No entanto, a classe matplotlib.Figure
nativamente tem métodos para exibir e salvar a visualização. Você pode chamar .show()
no objeto retornado de plot_histogram()
para abrir a imagem em uma nova janela (supondo que seu backend de matplotlib configurado seja interativo). Ou, alternativamente, você pode chamar .savefig('out.png')
para salvar a figura em out.png
. O método savefig()
recebe um caminho, então, você pode ajustar o local e o nome do arquivo onde está salvando a saída.
Visualizando o Estado¶
Em muitas situações, você quer ver o estado de um computador quântico. Isto pode ser para depuração. Aqui, assumimos que você tem este estado (seja da simulação ou da tomografia do estado) e o objetivo é visualizar o estado quântico. Isto requer recursos exponenciais, então, aconselhamos a ver apenas o estado de sistemas quânticos pequenos. Existem várias funções para gerar diferentes tipos de visualização de um estado quântico
plot_state_city(quantum_state)
plot_state_qsphere(quantum_state)
plot_state_paulivec(quantum_state)
plot_state_hinton(quantum_state)
plot_bloch_multivector(quantum_state)
Um estado quântico é uma matriz \(\rho\) (matriz Hermitiana) ou um vetor de estado \(├\psi\rangle\) (vetor complexo). A matriz densidade está relacionada ao vetor de estado por
e é mais geral, pois pode representar estados mistos (soma positiva de vetores de estado)
As visualizações geradas pelas funções são:
'plot_state_city'
: A visão padrão para os estado quânticos, onde as partes reais e imaginárias (imag) da matriz de estado são exibidas como uma cidade.'plot_state_qsphere'
: Visualização única do Qiskit de um estado quântico na qual a amplitude e fase do vetor de estado são traçados em uma bola esférica. A amplitude é a espessura da seta e a fase é a cor. Para estados mistos, mostrará diferentes'qsphere'
para cada componente.'plot_state_paulivec'
: Representação da matriz de estados usando os operadores de Pauli como base \(\rho=\sum_{q=0}^{d^2-1}p_jP_d\).'plot_state_hinton'
: Idêntico a'city'
com a diferença de que o tamanho do elemento representa o valor do elemento da matriz.'plot_bloch_multivector'
: Projeção do estado quântico no espaço de um único qubit e traçando em um bloco da esfera.
[6]:
from qiskit.visualization import plot_state_city, plot_bloch_multivector
from qiskit.visualization import plot_state_paulivec, plot_state_hinton
from qiskit.visualization import plot_state_qsphere
[7]:
# execute the quantum circuit
backend = BasicAer.get_backend('statevector_simulator') # the device to run on
result = execute(bell, backend).result()
psi = result.get_statevector(bell)
[8]:
plot_state_city(psi)
[8]:

[9]:
plot_state_hinton(psi)
[9]:

[10]:
plot_state_qsphere(psi)
[10]:

[11]:
plot_state_paulivec(psi)
[11]:

[12]:
plot_bloch_multivector(psi)
[12]:

Neste caso, verificamos que não há qualquer informação sobre o estado quântico no espaço de um único qubit, uma vez que todos os vetores são zero.
Opções quando usando funções de visualização do estado¶
As várias funções para a visualização de estados quânticos fornecem uma série de opções para ajustar a forma como os gráficos são renderizados. Quais opções estão disponíveis depende da função sendo usada.
Opções da função plot_state_city()
title (str): uma string que representa o título do gráfico
figsize (tupla): tamanho da figura em polegadas (largura, altura).
color (lista): uma lista de len=2 dando cores para os componentes reais e imaginárias dos elementos da matriz.
[13]:
plot_state_city(psi, title="My City", color=['black', 'orange'])
[13]:

Opções da função plot_state_hinton()
title (str): uma string que representa o título do gráfico
figsize (tupla): tamanho da figura em polegadas (largura, altura).
[14]:
plot_state_hinton(psi, title="My Hinton")
[14]:

Opções da função plot_state_paulivec()
title (str): uma string que representa o título do gráfico
figsize (tupla): tamanho da figura em polegadas (largura, altura).
color (lista ou str): cor esperada das barras dos valores.
[15]:
plot_state_paulivec(psi, title="My Paulivec", color=['purple', 'orange', 'green'])
[15]:

Opções da função plot_state_qsphere()
figsize (tupla): tamanho da figura em polegadas (largura, altura).
Opções da função plot_bloch_multivector()
title (str): uma string que representa o título do gráfico
figsize (tupla): tamanho da figura em polegadas (largura, altura).
[16]:
plot_bloch_multivector(psi, title="My Bloch Spheres")
[16]:

Usando a saída de funções de visualização de estado¶
Ao usar qualquer uma das funções de visualização de estado, retorna uma matplotlib.Figure
para a visualização renderizada. Os notebooks do Jupyter entendem este tipo de retorno e renderizam-no para nós, neste tutorial, mas quando estiver executando, fora do Jupyter, você não tem esse recurso, automaticamente. No entanto, a classe matplotlib.Figure
, nativamente, tem métodos para exibir e salvar a visualização. Você pode chamar .show()
no objeto retornado para abrir a imagem em uma nova janela (supondo que o backend de matplotlib configurado seja interativo). Ou, como alternativa, você pode chamar .savefig('out.png')
para salvar a figura em out.png
no diretório de trabalho atual. O método savefig()
recebe um caminho para que você possa ajustar o local e o nome do arquivo onde está salvando a saída.
Visualizando vetores Bloch¶
Uma maneira padrão de visualizar um sistema quântico é usando um vetor de Bloch. Isto só funciona para um único qubit e recebe como entrada o vetor de Bloch.
O vetor de Bloch é definido como \([x = \mathrm{Tr}[X \rho], y = \mathrm{Tr}[Y \rho], z = \mathrm{Tr}[Z \rho]]\), onde \(X\), \(Y\), e \(Z\) são os operadores de Pauli para um único qubit e \(\rho\) é a matriz `de estado.
[19]:
from qiskit.visualization import plot_bloch_vector
[20]:
plot_bloch_vector([0,1,0])
[20]:

Opções para a função plot_bloch_vector()¶
title (str): uma string que representa o título do gráfico
figsize (tupla): tamanho da figura em polegadas (largura, altura).
[21]:
plot_bloch_vector([0,1,0], title='My Bloch Sphere')
[21]:

Ajustando a saída da função plot_bloch_vector()¶
Ao usar a função plot_bloch_vector
, ela retorna uma matplotlib.Figure
para a visualização renderizada. Notebooks Jupyter entendem este tipo de retorno e renderizam ele para nós, nesse tutorial, mas quando estiver executando fora do Jupyter você não possuirá esse recurso, automaticamente. No entanto, a classe matplotlib.Figure
possui nativamente métodos para exibir e salvar a visualização. Você pode chamar .show()
no objeto retornado para abrir a imagem em uma nova janela (assumindo que o seu backend configurado de matplotlib seja interativo). Alternativamente, você pode chamar .savefig('out.png')
para salvar a figura em out.png
no diretório atual. O método savefig()
recebe um caminho, então, você pode ajustar o local e o nome do arquivo em que está salvando a saída.
[22]:
import qiskit.tools.jupyter
%qiskit_version_table
%qiskit_copyright
Version Information
Qiskit Software | Version |
---|---|
Qiskit | None |
Terra | 0.14.0 |
Aer | 0.6.0 |
Ignis | None |
Aqua | None |
IBM Q Provider | 0.6.1 |
System information | |
Python | 3.7.7 (default, Mar 26 2020, 10:32:53) [Clang 4.0.1 (tags/RELEASE_401/final)] |
OS | Darwin |
CPUs | 4 |
Memory (Gb) | 16.0 |
Mon Apr 27 21:46:41 2020 EDT |
This code is a part of Qiskit
© Copyright IBM 2017, 2020.
This code is licensed under the Apache License, Version 2.0. You may
obtain a copy of this license in the LICENSE.txt file in the root directory
of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
Any modifications or derivative works of this code must retain this
copyright notice, and modified files need to carry a notice indicating
that they have been altered from the originals.
[ ]: