تُعدّ تصوّر البيانات في الوقت الفعلي أمراً أساسياً في العديد من المجالات، بدءاً من البحث العلمي ووصولاً إلى الأسواق المالية. لا يقوم مكتبة Matplotlib، وهي مكتبة رسم قوية بلغة بايثون، بتحديث الرسوم البيانية تلقائياً؛ ومع ذلك، توجد العديد من الطرق التي تُمكّن من التحديثات الديناميكية. يتناول هذا المقال طريقتين فعّالَتين: استخدام canvas.draw()
مع canvas.flush_events()
، واستخدام plt.draw()
. يعتمد الخيار الأمثل على تعقيد التطبيق والتحكم المطلوب.
جدول المحتويات
canvas.draw()
وcanvas.flush_events()
للتحكم الدقيقplt.draw()
للتطبيقات الأبسط- اختيار الطريقة المناسبة
canvas.draw()
و canvas.flush_events()
للتحكم الدقيق
توفر هذه الطريقة تحكماً دقيقاً في عملية التحديث، مما يجعلها مثالية للرسوم البيانية المعقدة أو التطبيقات التي تتطلب استجابة سريعة. تتفاعل هذه الطريقة مباشرةً مع لوحة Matplotlib، مما يسمح بإدارة واضحة للرسم ومعالجة الأحداث. تُعدّ مكالمة canvas.flush_events()
ضرورية لمعالجة أحداث واجهة المستخدم الرسومية ومنع الحجب، مما يضمن التحديثات السلسة.
import matplotlib.pyplot as plt
import numpy as np
import time
fig, ax = plt.subplots()
line, = ax.plot([], [])
ax.set_xlim(0, 10)
ax.set_ylim(-1, 1)
xdata, ydata = [], []
for i in range(100):
xdata.append(i/10)
ydata.append(np.sin(i/10))
line.set_data(xdata, ydata)
fig.canvas.draw()
fig.canvas.flush_events()
time.sleep(0.1)
plt.show()
يقوم هذا الكود بتوليد رسم متحرك لموجة جيبية. تقوم الحلقة بتحديث بيانات الخط، ثم يقوم fig.canvas.draw()
بإعادة رسم اللوحة، ويقوم fig.canvas.flush_events()
بمعالجة الأحداث المعلقة للحفاظ على الاستجابة. يُتحكم time.sleep()
في سرعة الرسوم المتحركة.
plt.draw()
للتطبيقات الأبسط
يوفر plt.draw()
نهجاً أبسط وأعلى مستوى. يكفي هذا النهج للتطبيقات الأقل طلباً، ولكنه يوفر تحكماً أقل في معالجة الأحداث من الطريقة السابقة. من المهم ملاحظة أنه يجب تمكين الوضع التفاعلي باستخدام plt.ion()
.
import matplotlib.pyplot as plt
import numpy as np
import time
plt.ion() # الوضع التفاعلي ضروري
fig, ax = plt.subplots()
line, = ax.plot([], [])
ax.set_xlim(0, 10)
ax.set_ylim(-1, 1)
xdata, ydata = [], []
for i in range(100):
xdata.append(i/10)
ydata.append(np.sin(i/10))
line.set_data(xdata, ydata)
plt.draw()
plt.pause(0.1)
plt.show()
يُماثل هذا المثال المثال السابق ولكنه يستخدم plt.draw()
و plt.pause()
للتحديثات. يوفر plt.pause()
تأخيراً مماثلاً لـ time.sleep()
، ولكنه يتكامل بشكل أفضل مع حلقة أحداث Matplotlib.
اختيار الطريقة المناسبة
بالنسبة للتطبيقات البسيطة مع الحد الأدنى من معالجة الأحداث، فإن plt.draw()
أسهل وكافية. ومع ذلك، بالنسبة للتطبيقات المعقدة، وتدفقات البيانات في الوقت الفعلي، أو المواقف التي تتطلب تحكماً دقيقاً، فإن fig.canvas.draw()
و fig.canvas.flush_events()
توفران تحكماً واستجابة أفضل، مما يضمن تصويراً أكثر سلاسة وقوة. تذكر استخدام معالجة الأخطاء (كتل try...except
) داخل الحلقات لمنع تعطل التطبيق.
أظهر هذا المقال طريقتين فعّالَتين لأتمتة تحديثات الرسم البياني في Matplotlib. بفهم نقاط القوة والضعف لكل منهما، يمكنك اختيار الطريقة الأنسب لاحتياجاتك في التصوير. تأكد من تثبيت Matplotlib قبل تشغيل الأمثلة (pip install matplotlib
).