문제

나는 사용을 생각하고있다 wxmathplot 지속적으로 도착하는 일부 데이터를 플롯/그래프합니다. 그것을 사용하여 "실시간"플롯/그래프를 그리고 싶습니다. 그게 가능합니까?

즉, 파일에 대한 일회성 읽기의 정적 그래프를 원하지 않습니다. 스트리밍 데이터를 플롯하고 그래프 오른쪽으로 계속 진행하고 싶습니다.

편집하다

나는 여전히 이것에 대한 답을 얻지 못했습니다. WXMathPlot 라이브러리에는 mpfxyvector라는 흥미로운 클래스가 있지만 데이터의 벡터에서 하나의 플롯을 그릴 수 있습니다. 내가 원하는 것은 스트림을 공급하고 그래프를 가로로 스크롤 할 수있는 것입니다 (필요한 경우 스케일도 크기를 조정하십시오).

도움이 되었습니까?

해결책

나는 mpfxyvector가 갈 길이라고 생각합니다.

이것을 다루는 가장 간단한 방법은 최근 데이터 포인트의 FIFO 버퍼를 보유하는 mpfxyvector를위한 래퍼 클래스를 작성하는 것입니다. 새 데이터 포인트가 도착할 때마다 FIFO 버퍼에 추가하여 가장 오래된 지점을 떨어 뜨린 다음 업데이트 된 버퍼로 mpfxyvector를로드합니다. WXMATHPLOT 클래스 MPWINDOW는 필요한 나머지 부분을 돌볼 것입니다.

보다 우아한 접근 방식은 mpfxyvector의 간단한 벡터를 사용하여 FIFO 버퍼를 구현하는 mpfxyvector의 전문화입니다. 이것의 장점은 디스플레이 데이터의 사본을 보유하고 있다는 것입니다. 당신이 수천 개의 점수를 표시하지 않는 한, 나는 단순히 mpfxyvector 문서화 된 인터페이스를 사용하는 것보다 mpfxyvector에서 상속하는 데 도움이 될 가치가 있다고 의심합니다.

세부 사항을 살펴본 후 유일한 까다로운 비트는 mpfxyvector :: setData ()를 새 메소드 add ()로 바꾸어 데이터 포인트가 도착 할 때 데이터 포인트를 추가하는 것입니다. 새로운 방법은 MPFXYVECTER 벡터를 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();

나는 이것이 오래된 스레드라는 것을 알고 있지만 wxmathplot으로 X 축을 스크롤하는 X 축을 플로팅해야했습니다.

X 축 스크롤을 만들기 위해 Jayjo 코드를 간단한 수정했습니다.

나는 이것이 도움이된다.

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에 대한 개인적인 경험이 없지만 수년간 WXWidget과 함께 일해 왔으며 C ++의 크로스 플랫폼 GUI 프로그래밍에 적극 권장합니다. WXWIKI 그래픽 페이지 그만큼 Numerix 그래픽 라이브러리 실시간 데이터에 사용할 수 있으므로 도움이 될 수 있습니다. 행운을 빕니다.

어쩌면 누군가 같은 문제가 있고 필요할 것입니다 ... 오실로스코프의 데이터를 보여주기 위해 매우 빠른 플로팅이 필요했습니다. 패킷으로 데이터를 얻었습니다. 코드를 만든 몇 가지 변경을했습니다 많이 더 빨리. 첫 번째는 기능중인 IF 상태를 변경하는 것입니다. 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

기본 기능의 코드는 더 길지만 모든 데이터를 "한 번에"추가하기 때문에 기능이 더 빠릅니다.

우리는 결국 사용했습니다 차트 디렉터 대신에. 능력이 많고 빠릅니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top