どのように私はwxMathPlotと「リアルタイム」のプロットを作ることができますか?
-
13-09-2019 - |
質問
私は連続して到着したいくつかのデータをグラフ/プロットするために wxMathPlot に使用を考えています。私はそれを使用した「リアルタイム」プロット/グラフを描きたいです。可能ということですか?
すなわち。私は、ストリーミングデータをプロットし、グラフの右側に出続けたい - - 私は、ファイルの読み込み1回だけの静的なグラフを望んでいない(と左側が/ビューの外にスクロール落ちるましょう)
EDIT
私はまだこのための答えをもらっていません。そこmpFXYVectorと呼ばれるwxmathPlotライブラリで興味深いクラスがあるが、それは単にデータのベクトルから1つのプロットを描くように表示されます。私がしたいことは、ストリームを供給し、(必要に応じてスケールのサイズを変更もして)水平にグラフをスクロールすることができるものです。
解決
私はmpFXYVectorが進むべき道だと思います。
最近のデータポイントのFIFOバッファを保持しているmpFXYVectorのラッパークラスを記述するかもしれないこれに対処するための最も簡単な方法。新しいデータポイントが到着するたびに、最も古いポイントをドロップし、更新バッファーでmpFXYVectorをロードするFIFOバッファにそれを追加します。 wxMathPlotクラスmpWindowはあなたが必要なものの残りの部分の世話をされます。
よりエレガントなアプローチはmpFXYVectorで簡単ベクターを用いて、FIFOバッファを実装mpFXYVectorの特殊であろう。これの利点は、表示データのただ一つのコピーを保持しているということでしょう。あなたがポイントの何千もを表示している場合を除き、私は利点ではなく、単にmpFXYVector文書化インタフェースを使用するよりも、mpFXYVectorから継承するの余分な手間の価値がある疑います。
は、詳細を見た後、唯一のトリッキーなビットは、彼らが到着すると、データポイントを追加するには()を追加し、新たな方法でmpFXYVector :: SetDataメソッドを()を交換することです。新しい方法は、FIFOバッファとしてmpFXYVectorベクトルを管理するため、および(残念ながら心の中で継承して書かれていませんでした)バウンディングボックスを更新するためのコードを再実装する必要があります。
結果は、専門は、ラッパーを使用するよりも少ないメモリ要件より柔軟性を有する溶液を与えることがある。
他のヒント
おかげで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軸スクロール機能させるために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を持つ任意の個人的な経験を持っていないが、私は何年ものwxWidgetsで働いていると非常にその<のhref = "HTTPによると言って、C ++でクロスプラットフォームのGUIプログラミングのためにそれをお勧めします://ウィキ.wxwidgets.org /グラフィックス」のrel = "nofollowをnoreferrer"> wxWikiグラフィックページの<のhref = "http://www.numerix-dsp.com/files/#FreeSoftware" のrel = "nofollowをnoreferrer" > Numerixグラフィックライブラリにはあなたを助けることができるので、多分リアルタイムデータのために使用することができます。幸運ます。
たぶん誰かが私は、オシロスコープからのデータを示すための非常に高速なプロットを必要と...同じ問題を抱えているだろうし、それが必要になります。
私は、パケット内のデータを得ていました。私は、コードの速いのの多くを作ったいくつかの変更を行いました。
まず最初は、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
メイン関数内のコードが長くなりますが、あなたはすべてのデータを追加するための機能は、「一度に」速くなります。
私たちは ChartDirectorはの代わりに使用してしまいました。これは、機能をたくさん持っていると高速です。