Frage

Ich denke an mit wxMathPlot zum Plotten / einige Daten grafisch darstellen, die kontinuierlich ankommt. Ich will "Real-time" Plot / Graph mit ziehen. Ist das möglich?

d. Ich will nicht nur eine statische Graphen eines einmaligen eine Datei lesen - ich mag, dass die Streaming-Daten aufgezeichnet und weiter rechts von der Grafik aus - (und lassen Sie die linke Seite fallen / aus der Sicht blättern)

EDIT

Ich habe immer noch keine Antwort dafür bekommen. Es gibt eine interessante Klasse in der wxmathPlot Bibliothek namens mpFXYVector aber das scheint nur ein Grundstück von einem Vektor von Daten zu ziehen. Was ich will, ist etwas, das einen Strom zugeführt werden kann, und blättern Sie die Grafik horizontal (und auch die Waage Größe ändern, wenn erforderlich)

War es hilfreich?

Lösung

Ich denke, mpFXYVector ist der Weg zu gehen.

Die einfachste Art und Weise damit umgehen könnte sein, eine Wrapper-Klasse für mpFXYVector zu schreiben, die einen FIFO-Puffer der letzten Datenpunkte enthalten. Jedes Mal, wenn ein neuer Datenpunkt ankommt, fügen Sie es zu dem FIFO-Puffer, der den ältesten Punkt sinkt, dann laden mpFXYVector mit dem aktualisierten Puffer. Die wxMathPlot Klasse mpWindow nach dem Rest schauen, was Sie brauchen.

Ein eleganter Ansatz wäre eine Spezialisierung von mpFXYVector sein, die den FIFO-Puffer implementiert, die einfachen Vektoren in mpFXYVector verwenden. Der Vorteil wäre, dass Sie nur eine Kopie der Anzeigedaten halten. Es sei denn, Sie viele tausend Punkte angezeigt wird, bezweifle ich den Vorteil, lohnt sich die zusätzliche Mühe von mpFXYVector vererben, und nicht nur durch die mpFXYVector dokumentierte Schnittstelle.

auf den Details Nach einem Blick, die einzige knifflige Bit ist mpFXYVector :: SetData () mit einer neuen Methode Add () zu ersetzen Datenpunkte hinzufügen, wie sie ankommen. Die neue Methode benötigt die mpFXYVector Vektoren als FIFO-Puffer zu verwalten, und den Code neu zu implementieren, um den Begrenzungsrahmen.

(die leider nicht mit Vererbung in Verstand geschrieben) zu aktualisieren

Das Ergebnis ist, dass die Spezialisierung eine Lösung mit einem geringeren Speicherbedarf und mehr Flexibilität bietet als einen Wrapper verwendet wird.

Andere Tipps

Danke Ravens ... !! Ich tat, was Sie gesagt haben .. Es funktioniert einwandfrei! hier ist meine AddData () Funktion:

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;
        }
    }

in dem Main () Sie müssen:

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

Ich weiß, dass dies ein alter Thread, aber ich brauchte eine Scroll-X-Achse mit wxMathPlot plotten.

Ich habe eine einfache Änderung an jayjo Code getan X-Achse Scrollen funktioniert.

ich Hacke, das hilft.

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;
    }
}

Ich habe keine persönliche Erfahrung mit wxMathPlot, aber ich habe mit wxWidgets seit Jahren gearbeitet, und es sehr empfehlen für Cross-Plattform-GUI-Programmierung in C ++, mit, dass die nach dem wxWiki Grafiken die Numerix Graphics Library können so vielleicht für Echtzeitdaten verwendet werden, die Ihnen helfen können. Viel Glück.

Vielleicht hat jemand gleiches Problem hat und es braucht ... Ich musste sehr schnell Plotten, um die Daten aus Oszilloskop zeigt. Ich war immer die Daten in Paketen. Ich habe einige Änderungen, die einen Code gemacht viel von schneller. Das erste, was ist das zu ändern, wenn Zustand in Funktion SetData von if (xs.size()>0) zu if (!xs.empty). Dann sollten Sie zunächst alle Ihre Datenpakete an den Vektor hinzufügen

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

Und danach sollten Sie Daten passen und eingestellt werden.

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

Ihr Code in Hauptfunktion wird länger, aber Funktion wird schneller sein, weil Sie alle Daten „auf einmal“ hinzufügen.

Am Ende haben wir mit DynaPDF statt. Es hat eine Menge von Fähigkeiten und ist schnell.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top