Pergunta

Estou pensando em usar wxMathPlot para plotagem / graficamente alguns dados que chegam continuamente. Quero chamar "em tempo real" plot / gráfico de usá-lo. Isso é possível?

I.E. Eu não quero apenas um gráfico estático de um one-time ler de um arquivo - Eu quero os dados de streaming plotados e continuou para a direita do gráfico - (e deixar o lado esquerdo cair / rolar fora da vista)

Editar

Eu ainda não recebi uma resposta para isso. Há uma classe interessante na biblioteca wxmathPlot chamado mpFXYVector mas que parece apenas para desenhar um gráfico a partir de um vetor de dados. O que eu quero é algo que pode ser alimentado um fluxo e desloque o gráfico horizontalmente (e também redimensionar a escala se necessário)

Foi útil?

Solução

Eu acho mpFXYVector é o caminho a percorrer.

A maneira mais simples de lidar com isso poderia ser a de escrever uma classe wrapper para mpFXYVector que detém um buffer FIFO de pontos de dados recentes. Cada vez que um novo datapoint chega, adicioná-lo para o buffer FIFO, que vai cair o ponto mais antigo, em seguida, carregar mpFXYVector com o tampão atualizado. A classe mpWindow wxMathPlot vai cuidar do resto do que você precisa.

Uma abordagem mais elegante seria uma especialização de mpFXYVector que implementa tamponar o FIFO, usando os vetores simples em mpFXYVector. A vantagem disso seria que você está segurando apenas uma cópia dos dados de exibição. A menos que você está exibindo muitos milhares de pontos, duvido que a vantagem vale a pena extra de herança de mpFXYVector, ao invés de simplesmente usando a interface documentada mpFXYVector.

Depois de olhar para os detalhes, o bit somente complicada é para substituir mpFXYVector :: SetData () com um novo método Add () para adicionar pontos de dados que chegam. As novas necessidades método para gerenciar os vetores mpFXYVector como buffers FIFO, e re-implementar o código para atualizar a caixa delimitadora (que infelizmente não foi escrito com a herança em mente).

O resultado é que a especialização dá uma solução com um requisito de memória menor e mais flexibilidade do que usando um wrapper.

Outras dicas

Graças ravenspoint ... !! Eu fiz o que você disse .. Ele funciona impecável! aqui é a minha função 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;
        }
    }

no Main () você só tem que:

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

Eu sei que esta é uma discussão antiga, mas eu precisava para traçar um eixo X de rolagem com wxMathPlot.

Eu fiz uma simples modificação ao código de jayjo fazer eixo x rolagem trabalho.

Eu enxada isso ajuda.

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

Eu não tenho nenhuma experiência pessoal com wxMathPlot, mas tenho vindo a trabalhar com wxWidgets por anos e recomendo para cruz programação plataforma gui em C ++, com o que disse de acordo com o página de gráficos wxWiki o Graphics Library Numerix pode ser usado para dados em tempo real talvez isso pode ajudá-lo. Boa sorte.

Talvez alguém terá mesmo problema e vai precisar dele ... Eu precisava muito rápido plotagem para mostrar os dados do osciloscópio. Eu estava recebendo os dados em pacotes. Fiz algumas mudanças que fizeram um código muito de mais rápido. A primeira coisa é mudar o se estado em função SetData de if (xs.size()>0) para if (!xs.empty). Então você deve primeiro adicionar todo o seu pacote de dados para o vector

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

E depois que você deve caber e dados set.

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

O código na função principal será maior, mas a função será mais rápido porque você adicionar todos os dados "ao mesmo tempo".

Nós acabamos usando ChartDirector . Ele tem um monte de capacidade e é rápido.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top