Pregunta

Estoy pensando en usar wxMathPlot para trazar / gráfica de algunos datos que llegan de forma continua. Quiero llamar "tiempo real" parcela / gráfico de usarlo. ¿Es eso posible?

I.E. No quiero simplemente un gráfico estático de una sola vez leí de un archivo - Quiero que los datos de streaming trazan y continuaron hacia la derecha del gráfico - (y dejar que el lado izquierdo se caen / desplazarse fuera de la vista)

editar

Todavía no he recibido una respuesta para esto. Hay una clase interesante en la biblioteca wxmathPlot llamada mpFXYVector pero que aparece justo para dibujar un diagrama de un vector de datos. Lo que quiero es algo que puede ser alimentado con una corriente y desplazarse horizontalmente el gráfico (y también modificar el tamaño si es necesario)

¿Fue útil?

Solución

Creo mpFXYVector es el camino a seguir.

La forma más sencilla de hacer frente a este podría ser escribir una clase contenedora para mpFXYVector que tiene una memoria intermedia FIFO de puntos de datos recientes. Cada vez que un nuevo punto de datos llega, agregarlo a la memoria intermedia FIFO, que se reducirá el punto más antigua, a continuación, cargar mpFXYVector con el tampón actualizada. El mpWindow clase wxMathPlot se verá después que el resto de lo que necesita.

Un enfoque más elegante sería una especialización de mpFXYVector que implementa la memoria intermedia FIFO, usando los vectores simples en mpFXYVector. La ventaja de esto sería que tiene en sus manos una sola copia de los datos de visualización. A no ser que se está mostrando muchos miles de puntos, no creo que la ventaja vale la pena adicional de la herencia de mpFXYVector, en lugar de simplemente utilizando la interfaz de mpFXYVector documentado.

Después de mirar los detalles, el único poco complicado es reemplazar mpFXYVector :: SetData () con un nuevo método add () para añadir puntos de datos a medida que llegan. El nuevo método necesita para administrar los vectores mpFXYVector como tampones FIFO, y para volver a implementar el código para actualizar el cuadro delimitador (que por desgracia no fue escrito con la herencia en cuenta).

El resultado es que la especialización da una solución con un requisito de memoria más pequeña y más flexibilidad que el uso de una envoltura.

Otros consejos

Gracias Ravenspoint ... !! Hice lo que dijo .. Funciona impecable! aquí es mi función 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;
        }
    }

en el Principal () es suficiente con:

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

Sé que esto es un hilo viejo, pero que necesitaba para trazar un eje X desplazándose con wxMathPlot.

He hecho una simple modificación al código de jayjo para hacer el trabajo del eje X de desplazamiento.

Me azada esto ayuda.

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

No tengo ninguna experiencia personal con wxMathPlot, pero yo he estado trabajando con wxWidgets durante años y lo recomiendo encarecidamente para la programación de la plataforma de interfaz gráfica de usuario transversal en C ++, con el hecho de que dicho acuerdo a la wxWiki gráficos página la Numerix Graphics Library se puede utilizar para los datos en tiempo real, así que quizás pueda ayudarte. Buena suerte.

Tal vez alguien tendrá el mismo problema y lo necesitará ... necesitaba muy rápido trazado para mostrar los datos del osciloscopio. Me estaba poniendo los datos en paquetes. Hice algunos cambios que hicieron un código mucho de más rápido. Lo primero es cambiar el estado en función de si SetData de if (xs.size()>0) a if (!xs.empty). A continuación, se debe añadir en primer lugar la totalidad de su paquete de datos al vector

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

Y después de que se debe instalar y configurar los datos.

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

Su código de la función principal será más largo pero la función será más rápido porque se agrega todos los datos "a la vez".

Terminamos usando ChartDirector lugar. Tiene una gran cantidad de capacidad y es rápida.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top