تحتاج إلى تحديث طريقة عرض النص في الرسم البياني لديك بطريقة تسمح بتحديث النص بدلاً من كتابته من جديد في كل مرة. يتم ذلك عادةً عن طريق إنشاء نص قابل للتحديث وتحديث نصه بدلاً من إعادة كتابته بالكامل في كل مرة.
لتحقيق هذا في رمزك، يمكنك استخدام دالة set_text()
لتحديث نص معين داخل الرسم البياني بدلاً من استخدام ax.text()
التي تقوم بإنشاء نص جديد في كل مرة. هناك أيضًا بعض التغييرات الأخرى التي يمكن أن تساعد في تحسين أداء الرسم البياني.
-
تجميع ملف رئيسي مع ملفات مصدرية ورأس.05/04/2024
-
كيفية تقييد الأحرف الخاصة في جافا سكريبت06/03/2024
فيما يلي التغييرات التي يجب إجراؤها على رمزك:
- احذف دالة
y_text()
بالكامل، لأنها لم تعد ضرورية. - استبدل استخدام
ax.text()
في دالةupdate()
بدلاً من ذلك استخدمtext.set_text()
حيثtext
هو النص الذي تريد تحديثه. - قم بإنشاء متغير
text
لكلمة النص الثابتة التي تريد عرضها، وذلك بعد إنشاء الرسم البياني.
اليك كود معدل بناءً على التغييرات المذكورة:
pythonimport numpy as np
from openpyxl import load_workbook as ld
import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider
wb = ld(filename='example.xlsx')
data = wb['data']
time = wb['time']
row = data.max_row
column = data.max_column
x = np.ones((row, column))
y = np.ones((row, column))
result = np.ones(row)
for i in range(0, row):
for j in range(0, column):
x[i][j] = time.cell(row=i+1, column=j+1).value
y[i][j] = data.cell(row=i+1, column=j+1).value
fig, ax = plt.subplots()
plt.subplots_adjust(left=0.25, bottom=0.25)
plt.plot(x[0], y[0], label='line1')
plt.plot(x[1], y[1], label='line2')
plt.plot(x[2], y[2], label='line3')
line, = plt.plot((np.amin(x), np.amin(x)), (np.amin(y), np.amax(y)))
plt.legend()
plt.grid(True)
# إنشاء نص ثابت لعرض قيمة y
text = ax.text(10, 8, "", style='italic')
axtime = plt.axes([0.25, 0.1, 0.65, 0.03])
stime = Slider(axtime, 'time', np.amin(x), np.amax(x), valinit=np.amin(x))
def find(t):
global x, y, result
for i in range(0, row):
for j in range(0, column):
if x[i][j] == t or (t < x[i][j] and j == 0) or (t > x[i][j] and j == column):
result[i] = y[i][j]
elif x[i][j] < t < x[i][j+1]:
result[i] = ((t-x[i][j])/(x[i][j+1]-x[i][j]))*(y[i][j+1]-y[i][j])+y[i][j]
return result
def update(val):
line.set_xdata(stime.val)
y_val = find(stime.val)
text.set_text(str(y_val)) # تحديث قيمة النص
fig.canvas.draw()
stime.on_changed(update)
plt.show()
باستخدام هذا التعديل، سترى أن النص لا يتم كتابته من جديد بل يتم تحديثه مباشرة داخل الرسم البياني بدون أي تلاشي أو تداخل.
المزيد من المعلومات
بالطبع، هنا بعض المعلومات الإضافية التي قد تكون مفيدة لك:
-
استخدام Openpyxl: في الرمز الذي قدمته، استخدمت مكتبة Openpyxl لقراءة البيانات من ملف Excel. هذه المكتبة توفر واجهة برمجة التطبيقات (API) للتعامل مع ملفات Excel بتنسيق .xlsx.
-
Matplotlib: هي مكتبة Python شهيرة وقوية تستخدم لإنشاء الرسوم البيانية والمخططات بطريقة بسيطة وفعالة. يتم استخدامها هنا لرسم البيانات الناتجة من ملف Excel باستخدام دوال مثل
plt.plot()
وplt.subplots()
. -
الانتراكتيفية في الرسوم البيانية باستخدام Slider: يتم استخدام المكتبة Matplotlib.widgets لإنشاء عنصر التحكم Slider الذي يتيح للمستخدم تحديد قيمة محددة من متغير معين، في هذه الحالة الزمن (time)، وتحديث الرسم البياني بناءً على القيمة المحددة.
-
تحسين الأداء والتنظيم في الرسم البياني: قمت بتحسين الرمز لجعله أكثر تنظيماً وكفاءة، مثل استخدام متغيرات عالمية لتقليل الاستدعاءات المتكررة لنفس القيم وتجنب إعادة إنشاء النص بشكل متكرر في الرسم البياني.
-
إنشاء نص ثابت في الرسم البياني: تم إضافة نص ثابت في الرسم البياني باستخدام
ax.text()
لعرض قيمة y المحددة بواسطة Slider.
هذه المعلومات إضافية يمكن أن تساعد في فهم كيفية استخدام المكتبات المختلفة وتحسين الأداء وإضافة العناصر التفاعلية إلى الرسوم البيانية.