انتقل إلى المحتوى الرئيسي
هذا المشروع في مرحلة تجريبية. وجدت خطأ؟ افتح مشكلة على GitHub. لديك سؤال أو فكرة؟ اسأل في Discussions — نحب سماع ملاحظاتك!
كيف جودة الترجمة في هذه الصفحة؟

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

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

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

qiskit[all]~=2.5.2

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

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

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

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

هناك خياران:

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

على سبيل المثال، أنشئ حالة Bell من كيوبتين:

# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util

_needed = {"matplotlib": "matplotlib", "numpy": "numpy", "qiskit": "qiskit"}
_missing = [pip for module, pip in _needed.items()
if importlib.util.find_spec(module) is None]
# One at a time, so a package that fails to install does not block the others
for _pip in _missing:
%pip install -q {_pip}
if not _missing:
print("\u2713 All required packages are installed")
from qiskit.primitives import StatevectorSampler as Sampler
from qiskit.transpiler import generate_preset_pass_manager

from qiskit.circuit import QuantumCircuit
from qiskit.visualization import plot_histogram
# 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(optimization_level=1)
isa_circuit = pm.run(bell)

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

print(result)
PrimitiveResult([SamplerPubResult(data=DataBin(meas=BitArray(<shape=(), num_shots=1024, num_bits=2>)), metadata={'shots': 1024, 'circuit_metadata': {}})], metadata={'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

job = sampler.run([isa_circuit], shots=1000)
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.primitives import StatevectorEstimator 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]

pm = generate_preset_pass_manager(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()
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>), shape=(7, 1)), metadata={'target_precision': 0.0, 'circuit_metadata': {}})
<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