سؤال

أنا أفكر في استخدام wxmathplot. للتخطيط / الرسوم البيانية بعض البيانات التي تصل باستمرار. أريد رسم مؤامرة / رسم بياني "في الوقت الفعلي" باستخدامه. هل هذا ممكن؟

أي أنا لا أريد مجرد رسم بياني ثابت لقراءة لمرة واحدة للملف - أريد أن يتم رسم بيانات البث وتابع إلى يمين الرسم البياني - (ودع الجانب الأيسر يسقط / انتقل من الرأي)

تعديل

ما زلت لم أحصل على إجابة لهذا. هناك فئة مثيرة للاهتمام في مكتبة wxmathplot تسمى mpfxyvector ولكنها تظهر فقط لرسم مؤامرة واحدة من متجه البيانات. ما أريده هو شيء يمكن إطعامه وانتقل الرسم البياني أفقيا (وأيضا تغيير حجم الحجم إذا لزم الأمر)

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

المحلول

أعتقد أن mpfxyvector هو الطريق للذهاب.

قد تكون أبسط طريقة للتعامل مع هذا لكتابة فئة مجمع ل MPFXyVector التي تحمل مخزن مؤقت FIFO لنقاط البيانات الأخيرة. في كل مرة تصل فيها Datapoint جديد، قم بإضافته إلى المخزن المؤقت FIFO، مما يسقط أقدم نقطة، ثم قم بتحميل mpfxyvector مع المخزن المؤقت المحدث. سيتعاوني WXMathplot Class MPWindow بقية ما تحتاجه.

سيكون النهج الأكثر أناقة تخصصا في MPFXyVector ينفذ المخزن المؤقت FIFO، باستخدام ناقلات بسيطة في mpfxyvector. ستكون ميزة هذا هو أنك تحمل نسخة واحدة فقط من بيانات العرض. ما لم تكن قد تعرض آلاف النقاط كثيرة، أشك في أن الميزة تستحق المتاعب الإضافية من الوراثة من mpfxyvector، بدلا من استخدام الواجهة الموثقة mpfxyvector.

بعد النظر إلى التفاصيل، فإن البتة الصعبة الوحيدة هي استبدال mpfxyvector :: setdata () مع إضافة طريقة جديدة () لإضافة نقاط بيانات عند وصولها. تحتاج الطريقة الجديدة إلى إدارة متجهات MPFXyVector كأخازن FIFO، وإعادة تنفيذ التعليمات البرمجية لتحديث المربع المحيط (والذي لسوء الحظ لم يتم كتابة الميراث في الاعتبار).

والنتيجة هي أن التخصص يعطي حل مع شرط الذاكرة أصغر وأكثر مرونة من استخدام التفاف.

نصائح أخرى

شكرا Ravenspoint ... !! فعلت ما قلته .. يعمل لا تشوبه شائبة! هنا هي وظيفة AddData () الخاصة بي:

void mpFXYVector::AddData(float x, float y, std::vector<double> &xs, std::vector<double> &ys)
    {
        // Check if the data vectora are of the same size
        if (xs.size() != ys.size()) {
            wxLogError(_("wxMathPlot error: X and Y vector are not of the same length!"));
            return;
        }

        //Delete first point if you need a filo buffer (i dont need it)
        //xs.erase(xs.begin());
        //xy.erase(xy.begin());

        //Add new Data points at the end
        xs.push_back(x);
        ys.push_back(y);


        // Copy the data:
        m_xs = xs;
        m_ys = ys;

        // Update internal variables for the bounding box.
        if (xs.size()>0)
        {
            m_minX  = xs[0];
            m_maxX  = xs[0];
            m_minY  = ys[0];
            m_maxY  = ys[0];

            std::vector<double>::const_iterator  it;

            for (it=xs.begin();it!=xs.end();it++)
            {
                if (*it<m_minX) m_minX=*it;
                if (*it>m_maxX) m_maxX=*it;
            }
            for (it=ys.begin();it!=ys.end();it++)
            {
                if (*it<m_minY) m_minY=*it;
                if (*it>m_maxY) m_maxY=*it;
            }
            m_minX-=0.5f;
            m_minY-=0.5f;
            m_maxX+=0.5f;
            m_maxY+=0.5f;
        }
        else
        {
            m_minX  = -1;
            m_maxX  = 1;
            m_minY  = -1;
            m_maxY  = 1;
        }
    }

في الرئيسية () عليك فقط:

m_Vector->AddData(xPos,yPos,vectorX, vectorY);
m_plot->Fit();

أعرف أن هذا هو موضوع قديم ولكنني بحاجة إلى رسم محور X للتمرير مع WXMathplot.

لقد قمت بتعديل بسيط لرمز Jayjo لصنع عمل التمرير المحور x.

أنا مجرفة هذا يساعد.

void mpFXYVector::AddData(float x, float y, std::vector<double> &xs, std::vector<double> &ys)
{
    // Check if the data vectora are of the same size
    if (xs.size() != ys.size()) {
        wxLogError(_("wxMathPlot error: X and Y vector are not of the same length!"));
        return;
    }

    //After a certain number of points implement a FIFO buffer
    //As plotting too many points can cause missing data
    if (x > 300)
    {
        xs.erase(xs.begin());
        ys.erase(ys.begin());
    }



    //Add new Data points at the end
    xs.push_back(x);
    ys.push_back(y);


    // Copy the data:
    m_xs = xs;
    m_ys = ys;

    // Update internal variables for the bounding box.
    if (xs.size()>0)
    {
        m_minX  = xs[0];
        m_maxX  = xs[0];
        m_minY  = ys[0];
        m_maxY  = ys[0];

        std::vector<double>::const_iterator  it;

        for (it=xs.begin();it!=xs.end();it++)
        {
            if (*it<m_minX) m_minX=*it;
            if (*it>m_maxX) m_maxX=*it;
        }
        for (it=ys.begin();it!=ys.end();it++)
        {
            if (*it<m_minY) m_minY=*it;
            if (*it>m_maxY) m_maxY=*it;
        }
        m_minX-=0.5f;
        m_minY-=0.5f;
        m_maxX+=0.5f;
        m_maxY+=0.5f;
    }
    else
    {
        m_minX  = -1;
        m_maxX  = 1;
        m_minY  = -1;
        m_maxY  = 1;
    }
}

ليس لدي أي تجربة شخصية مع WXMATHPLOT، لكنني كنت أعمل مع WxWidgets لسنوات وتوصي بشدة ببرمجة Gui عبر المنصة في C ++، مع ذلك وفقا ل صفحة الرسومات WXWIKI ال مكتبة الرسومات numerix يمكن استخدامها في الوقت الحقيقي البيانات لذلك ربما يمكن أن تساعدك. حظا طيبا وفقك الله.

ربما سيكون لدى شخص ما نفس المشكلة وستحتاج إليه ... كنت بحاجة إلى تخطيط سريع للغاية لإظهار البيانات من الذبذبات. كنت أحصل على البيانات في الحزم. لقد اتخذت بعض التغييرات التي صنعت رمز كثير من أسرع. أول شيء هو تغيير حالة الدولة في الوظيفة SetData من عند if (xs.size()>0) ل if (!xs.empty). وبعد ثم يجب عليك أولا إضافة جميع علبة البيانات الخاصة بك إلى المتجه

Vector1_X.push_back(x);
Vector1_Y.push_back(y);

وبعد ذلك يجب أن تناسب وتعيين البيانات.

Vector1 ->SetData(Vector1_X,Vector1_Y); // add vectors to main vector
MathPlot1-> Fit(); //fit plot to the data
Vector1_X.clear(); //if you want to clear plot after every packet 
Vector1_Y.clear(); //you should use it

ستكون الكود الخاص بك في الوظيفة الرئيسية أطول ولكن وظيفة ستكون أسرع لأنك تضيف جميع البيانات "مرة واحدة".

انتهى بنا المطاف باستخدام chartdirector. في حين أن. لديها الكثير من القدرة وبسرعة.

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