Domanda

Sto pensando di utilizzare wxMathPlot per la stampa / graficamente alcuni dati che arriva in modo continuo. Voglio attirare trama "in tempo reale" / grafico utilizzarlo. È possibile?

vale a dire. Non voglio solo un grafico statico di una sola volta lessi di un file - Voglio che i dati in streaming tracciati e ha continuato verso la destra del grafico - (e lasciare che il lato sinistro cadere / scorrere fuori dal campo visivo)

Modifica

Non ho ancora ottenuto una risposta per questo. C'è una classe interessante nella biblioteca wxmathPlot chiamato mpFXYVector ma che appare solo per disegnare una trama da un vettore di dati. Quello che voglio è qualcosa che può essere alimentato un flusso e scorrere il grafico in orizzontale (e anche ridimensionare la scala se necessario)

È stato utile?

Soluzione

Credo mpFXYVector è la strada da percorrere.

Il modo più semplice per affrontare questo potrebbe essere quello di scrivere una classe wrapper per mpFXYVector che detiene un buffer FIFO degli ultimi punti di dati. Ogni volta che un nuovo punto dati arriva, inserirlo al buffer FIFO, che cadrà il punto più vecchio, quindi caricare mpFXYVector con il tampone aggiornata. La classe mpWindow wxMathPlot si occuperà di tutto il resto di ciò che è necessario.

Un approccio più elegante sarebbe una specializzazione di mpFXYVector che implementa il buffer FIFO, utilizzando semplici vettori in mpFXYVector. Il vantaggio di questo è che si sta svolgendo solo una copia dei dati di visualizzazione. A meno che non si sta visualizzando molte migliaia di punti, dubito che il vantaggio vale la pena extra di ereditare da mpFXYVector, piuttosto che semplicemente utilizzando l'interfaccia di mpFXYVector documentato.

Dopo aver esaminato i dettagli, l'unica po 'complicato è quello di sostituire mpFXYVector :: SetData () con un nuovo metodo add () per aggiungere punti di dati man mano che arrivano. Il nuovo metodo ha bisogno di gestire i vettori mpFXYVector come buffer FIFO, e di re-implementare il codice per aggiornare il rettangolo di selezione (che purtroppo non è stato scritto con l'ereditarietà in mente).

Il risultato è che la specializzazione dà una soluzione con un requisito di memoria più piccola e una maggiore flessibilità rispetto all'utilizzo di un involucro.

Altri suggerimenti

Grazie ravenspoint ... !! Ho fatto quello che hai detto .. Funziona impeccabile! qui è la mia funzione 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;
        }
    }

nel Main () è sufficiente:

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

So che questo è un vecchio thread, ma avevo bisogno di tracciare un asse X scorrimento con wxMathPlot.

Ho fatto una semplice modifica al codice del jayjo per rendere il lavoro dell'asse X scorrimento.

I zappa questo aiuta.

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

Non ho alcuna esperienza personale con wxMathPlot, ma ho lavorato con wxWidgets per anni e lo consiglio vivamente per il cross di programmazione piattaforma GUI in C ++, con quel detto secondo il noreferrer grafica wxWiki pagina Numerix Graphics Library può essere utilizzato per i dati in tempo reale in modo forse che può aiutarti. Buona fortuna.

Forse qualcuno avrà lo stesso problema e avrà bisogno ... ho bisogno di molto veloce tramando per la visualizzazione dei dati da oscilloscopio. Mi stavo i dati in pacchetti. Ho fatto alcune modifiche che hanno reso un codice molto di più veloce. La prima cosa è cambiare il caso dello stato in funzione SetData da if (xs.size()>0) a if (!xs.empty). Poi si dovrebbe innanzitutto aggiungere tutto il vostro pacchetto di dati al vettore

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

E dopo che si dovrebbe adattare e impostare i dati.

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

Il codice in funzione principale sarà più lungo, ma la funzione sarà più veloce perché si aggiungono tutti i dati "in una volta".

Abbiamo finito per usare ChartDirector . Ha un sacco di capacità ed è veloce.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top