انتقل إلى المحتوى الرئيسي

تصوير النتائج

إصدارات الحزم

الكود في هذه الصفحة تم تطويره باستخدام المتطلبات التالية. نوصي باستخدام هذه الإصدارات أو أحدث منها.

qiskit[all]~=2.3.0
qiskit-ibm-runtime~=0.43.1

رسم المدرج التكراري

دالة plot_histogram تُصوّر نتيجة أخذ عينات من دائرة كمومية على وحدة معالجة كمومية (QPU).

استخدام المخرجات من الدوال

هذه الدالة تُعيد كائنًا من نوع matplotlib.Figure. عندما يكون آخر سطر في خلية كود يُخرج هذه الكائنات، تعرضها دفاتر Jupyter تحت الخلية مباشرةً. إذا استدعيت هذه الدوال في بيئات أخرى أو في سكريبتات، ستحتاج إلى عرض المخرجات أو حفظها يدويًا.

هناك خياران:

  • استدعاء .show() على الكائن المُعاد لفتح الصورة في نافذة جديدة (بافتراض أن backend الـ matplotlib لديك يدعم التفاعل).
  • استدعاء .savefig("out.png") لحفظ الشكل في out.png في مجلد العمل الحالي. تأخذ savefig() مسارًا يمكنك من خلاله تحديد الموقع واسم الملف الذي تريد حفظ المخرجات فيه. مثلًا: plot_state_city(psi).savefig("out.png").

على سبيل المثال، أنشئ حالة Bell من qubit-ين:

# Added by doQumentation — required packages for this notebook
!pip install -q matplotlib numpy qiskit qiskit-ibm-runtime
from qiskit_ibm_runtime import QiskitRuntimeService, SamplerV2 as Sampler
from qiskit.transpiler import generate_preset_pass_manager

from qiskit.circuit import QuantumCircuit
from qiskit.visualization import plot_histogram

service = QiskitRuntimeService()

backend = service.least_busy(simulator=False, operational=True)
# Quantum circuit to make a Bell state
bell = QuantumCircuit(2)
bell.h(0)
bell.cx(0, 1)
bell.measure_all()

pm = generate_preset_pass_manager(backend=backend, optimization_level=1)
isa_circuit = pm.run(bell)

# execute the quantum circuit
sampler = Sampler(backend)
job = sampler.run([isa_circuit])
result = job.result()

print(result)
PrimitiveResult([SamplerPubResult(data=DataBin(meas=BitArray(<shape=(), num_shots=4096, num_bits=2>)), metadata={'circuit_metadata': {}})], metadata={'execution': {'execution_spans': ExecutionSpans([DoubleSliceSpan(<start='2026-01-15 07:11:30', stop='2026-01-15 07:11:32', size=4096>)])}, 'version': 2})
plot_histogram(result[0].data.meas.get_counts())

Output of the previous code cell

خيارات رسم المدرج التكراري

استخدم الخيارات التالية مع plot_histogram لضبط الرسم البياني الناتج.

  • legend: يوفر تسمية للعمليات التنفيذية. يأخذ قائمة من السلاسل النصية لتسمية نتائج كل عملية تنفيذ. هذا مفيد بشكل خاص عند رسم نتائج عمليات تنفيذ متعددة في نفس المدرج التكراري
  • sort: يضبط ترتيب الأعمدة في المدرج التكراري. يمكن ضبطه على الترتيب التصاعدي بـ asc أو التنازلي بـ desc
  • number_to_keep: يأخذ عددًا صحيحًا يحدد عدد المصطلحات المعروضة. يُجمَّع الباقي في عمود واحد يُسمى "rest"
  • color: يضبط لون الأعمدة؛ يأخذ سلسلة نصية أو قائمة سلاسل نصية تحدد الألوان المستخدمة لأعمدة كل عملية تنفيذ
  • bar_labels: يضبط ما إذا كانت التسميات تُطبع فوق الأعمدة
  • figsize: يأخذ tuple يحدد حجم الشكل الناتج بالبوصة
# Execute two-qubit Bell state again
sampler.options.default_shots = 1000

job = sampler.run([isa_circuit])
second_result = job.result()

# Plot results with custom options
plot_histogram(
[
result[0].data.meas.get_counts(),
second_result[0].data.meas.get_counts(),
],
legend=["first", "second"],
sort="desc",
figsize=(15, 12),
color=["orange", "black"],
bar_labels=False,
)

Output of the previous code cell

رسم نتائج Estimator

لا يوجد في Qiskit دالة مدمجة لرسم نتائج Estimator، لكن يمكنك استخدام رسم bar في Matplotlib للحصول على تصوير سريع.

للتوضيح، الخلية التالية تُقدّر قيم التوقع لسبعة مراقبات مختلفة على حالة كمومية.

import numpy as np
from qiskit import QuantumCircuit
from qiskit.quantum_info import SparsePauliOp
from qiskit_ibm_runtime import EstimatorV2 as Estimator
from qiskit.transpiler import generate_preset_pass_manager
from matplotlib import pyplot as plt

# Simple estimation experiment to create results
qc = QuantumCircuit(2)
qc.h(0)
qc.crx(1.5, 0, 1)

observables_labels = ["ZZ", "XX", "YZ", "ZY", "XY", "XZ", "ZX"]
observables = [SparsePauliOp(label) for label in observables_labels]

service = QiskitRuntimeService()

pm = generate_preset_pass_manager(backend=backend, optimization_level=1)
isa_circuit = pm.run(qc)
isa_observables = [
operator.apply_layout(isa_circuit.layout) for operator in observables
]

# Reshape observable array for broadcasting
reshaped_ops = np.fromiter(isa_observables, dtype=object)
reshaped_ops = reshaped_ops.reshape((7, 1))

estimator = Estimator(backend)
job = estimator.run([(isa_circuit, reshaped_ops)])
result = job.result()[0]
exp_val = job.result()[0].data.evs
print(result)

# Since the result array is structured as a 2D array where each element is a
# list containing a single value, you need to flatten the array.

# Plot using Matplotlib
plt.bar(observables_labels, exp_val.flatten())
PubResult(data=DataBin(evs=np.ndarray(<shape=(7, 1), dtype=float64>), stds=np.ndarray(<shape=(7, 1), dtype=float64>), ensemble_standard_error=np.ndarray(<shape=(7, 1), dtype=float64>), shape=(7, 1)), metadata={'shots': 4096, 'target_precision': 0.015625, 'circuit_metadata': {}, 'resilience': {}, 'num_randomizations': 32})
<BarContainer object of 7 artists>

Output of the previous code cell

الخلية التالية تستخدم الخطأ المعياري المُقدَّر لكل نتيجة وتضيفه كأشرطة خطأ. راجع توثيق رسم bar للاطلاع على وصف كامل للرسم.

standard_error = job.result()[0].data.stds

_, ax = plt.subplots()
ax.bar(
observables_labels,
exp_val.flatten(),
yerr=standard_error.flatten(),
capsize=2,
)
ax.set_title("Expectation values (with standard errors)")
Text(0.5, 1.0, 'Expectation values (with standard errors)')

Output of the previous code cell