كيف يمكنني عرض الرسوم البيانية في الوقت الفعلي في واجهة مستخدم بسيطة لبرنامج Python؟

StackOverflow https://stackoverflow.com/questions/4129697

  •  29-09-2019
  •  | 
  •  

سؤال

لدي خوارزمية معقدة تقوم بتحديث 3 رسم بياني يتم تخزينها في المصفوفات. أريد تصحيح الخوارزمية الخاصة بي ، لذلك كنت أفكر في إظهار المصفوفات كرسوم بيانية في واجهة المستخدم. ما هي أسهل طريقة للقيام بذلك. (تطوير التطبيقات السريعة أكثر أهمية من التعليمات البرمجية المحسنة.)

لدي بعض الخبرة مع QT (في C ++) وبعض الخبرة مع Matplotlib.

(سأترك هذا السؤال مفتوحًا لمدة يوم أو يومين لأنه من الصعب علي تقييم الحلول دون الكثير من الخبرة التي لا أمتلكها. آمل أن تساعد أصوات المجتمع في اختيار أفضل إجابة.)

هل كانت مفيدة؟

المحلول

تحرير: في الوقت الحاضر ، من الأسهل والأفضل استخدام matplotlib.animation:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation


def animate(frameno):
    x = mu + sigma * np.random.randn(10000)
    n, _ = np.histogram(x, bins, normed=True)
    for rect, h in zip(patches, n):
        rect.set_height(h)
    return patches    

mu, sigma = 100, 15
fig, ax = plt.subplots()
x = mu + sigma * np.random.randn(10000)
n, bins, patches = plt.hist(x, 50, normed=1, facecolor='green', alpha=0.75)

ani = animation.FuncAnimation(fig, animate, blit=True, interval=10,
                              repeat=True)
plt.show()

هناك مثال على صنع رسم بياني متحرك هنا. بناءً على هذا المثال ، قد تجرب شيئًا مثل:

import numpy as np
import matplotlib.pyplot as plt

plt.ion()
mu, sigma = 100, 15
fig = plt.figure()
x = mu + sigma*np.random.randn(10000)
n, bins, patches = plt.hist(x, 50, normed=1, facecolor='green', alpha=0.75)
for i in range(50):
    x = mu + sigma*np.random.randn(10000)
    n, bins = np.histogram(x, bins, normed=True)
    for rect,h in zip(patches,n):
        rect.set_height(h)
    fig.canvas.draw()

يمكنني الحصول على حوالي 14 إطارًا في الثانية بهذه الطريقة ، مقارنة بـ 4 إطارات في الثانية باستخدام الرمز i نشرت لأول مرة. الحيلة هي تجنب مطالبة Matplotlib برسم أرقام كاملة. بدلا من الاتصال plt.hist مرة واحدة ، ثم تلاعب الموجود matplotlib.patches.RectangleS في patches لتحديث الرسم البياني ، والاتصالfig.canvas.draw() لجعل التحديثات مرئية.

نصائح أخرى

للتخطيط الحقيقي ، أوصي بتجربة Chaco أو Pyqtgraph أو أي من المكتبات القائمة على OpenGL مثل Glumpy أو Visvis. Matplotlib ، رائع كما هو ، غير مناسب بشكل عام لهذا النوع من التطبيق.

يحرر: يتعاون مطورو Glumpy و Visvis و Galry و Pyqtgraph في مكتبة تصور تسمى فيسبي. لا يزال في وقت مبكر من التطور ، ولكنه واعد وقوي بالفعل.

أوصي باستخدام matplotlib في الوضع التفاعلي ، إذا اتصلت .show مرة واحدة بعد ذلك ، ستظهر في نافذتها الخاصة ، إذا لم تفعل ذلك ، فهي موجودة فقط في الذاكرة ويمكن كتابتها إلى ملف عند الانتهاء منه.

ouh ، انظر الآن ، عندما تقول في الوقت الفعلي ، فأنت تعني أنك تريد معدل تحديث أعلى من 5 هرتز Matplotlib لن يقوم بالمهمة. واجهت هذه المشكلة من قبل ، ذهبت ل pyqwt الذي يعمل مع PYQT.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top