visual studio c# WindowsFormapplicationで
折れ線グラフを作成したいのですがグラフのプロット数が100を超えると新しい系列を作成し、新しい系列にプロットし凡例を追加する
また、古い系列は消さずそのまま表示し続けるというプログラムを作りたいです。
どのようにすればいいでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/17 06:06 編集

退会済みユーザー
2020/07/18 01:51

回答2件
0
Chart Samples のサンプルにある、以下のようなことですか?
それとも以下?
違うかもしれませんが、一応サンプルの[C# Source]タブの中のコードを貼っておきます。
Feeding with Real Time Data
using System.Windows.Forms.DataVisualization.Charting; ... private Thread addDataRunner; private Random rand = new Random(); private System.Windows.Forms.DataVisualization.Charting.Chart chart1; public delegate void AddDataDelegate(); public AddDataDelegate addDataDel; ... private void RealTimeSample_Load(object sender, System.EventArgs e) { // create the Adding Data Thread but do not start until start button clicked ThreadStart addDataThreadStart = new ThreadStart(AddDataThreadLoop); addDataRunner = new Thread(addDataThreadStart); // create a delegate for adding data addDataDel += new AddDataDelegate(AddData); } private void startTrending_Click(object sender, System.EventArgs e) { // Disable all controls on the form startTrending.Enabled = false; // and only Enable the Stop button stopTrending.Enabled = true; // Predefine the viewing area of the chart minValue = DateTime.Now; maxValue = minValue.AddSeconds(120); chart1.ChartAreas[0].AxisX.Minimum = minValue.ToOADate(); chart1.ChartAreas[0].AxisX.Maximum = maxValue.ToOADate(); // Reset number of series in the chart. chart1.Series.Clear(); // create a line chart series Series newSeries = new Series( "Series1" ); newSeries.ChartType = SeriesChartType.Line; newSeries.BorderWidth = 2; newSeries.Color = Color.OrangeRed; newSeries.XValueType = ChartValueType.DateTime; chart1.Series.Add( newSeries ); // start worker threads. if ( addDataRunner.IsAlive == true ) { addDataRunner.Resume(); } else { addDataRunner.Start(); } } private void stopTrending_Click(object sender, System.EventArgs e) { if ( addDataRunner.IsAlive == true ) { addDataRunner.Suspend(); } // Enable all controls on the form startTrending.Enabled = true; // and only Disable the Stop button stopTrending.Enabled = false; } /// Main loop for the thread that adds data to the chart. /// The main purpose of this function is to Invoke AddData /// function every 1000ms (1 second). private void AddDataThreadLoop() { while (true) { chart1.Invoke(addDataDel); Thread.Sleep(1000); } } public void AddData() { DateTime timeStamp = DateTime.Now; foreach ( Series ptSeries in chart1.Series ) { AddNewPoint( timeStamp, ptSeries ); } } /// The AddNewPoint function is called for each series in the chart when /// new points need to be added. The new point will be placed at specified /// X axis (Date/Time) position with a Y value in a range +/- 1 from the previous /// data point's Y value, and not smaller than zero. public void AddNewPoint( DateTime timeStamp, System.Windows.Forms.DataVisualization.Charting.Series ptSeries ) { double newVal = 0; if ( ptSeries.Points.Count > 0 ) { newVal = ptSeries.Points[ptSeries.Points.Count -1 ].YValues[0] + (( rand.NextDouble() * 2 ) - 1 ); } if ( newVal < 0 ) newVal = 0; // Add new data point to its series. ptSeries.Points.AddXY( timeStamp.ToOADate(), rand.Next(10, 20)); // remove all points from the source series older than 1.5 minutes. double removeBefore = timeStamp.AddSeconds( (double)(90) * ( -1 )).ToOADate(); //remove oldest values to maintain a constant number of data points while ( ptSeries.Points[0].XValue < removeBefore ) { ptSeries.Points.RemoveAt(0); } chart1.ChartAreas[0].AxisX.Minimum = ptSeries.Points[0].XValue; chart1.ChartAreas[0].AxisX.Maximum = DateTime.FromOADate(ptSeries.Points[0].XValue).AddMinutes(2).ToOADate(); chart1.Invalidate(); } /// Clean up any resources being used. protected override void Dispose( bool disposing ) { if ( (addDataRunner.ThreadState & ThreadState.Suspended) == ThreadState.Suspended) { addDataRunner.Resume(); } addDataRunner.Abort(); if( disposing ) { if (components != null) { components.Dispose(); } } base.Dispose( disposing ); } ...
Real Time Data (Timer)
using System.Windows.Forms.DataVisualization.Charting; ... private Random random = new Random(); private int pointIndex = 0; ... private void timerRealTimeData_Tick(object sender, System.EventArgs e) { // Define some variables int numberOfPointsInChart = 200; int numberOfPointsAfterRemoval = 150; // Simulate adding new data points int numberOfPointsAddedMin = 5; int numberOfPointsAddedMax = 10; for(int pointNumber = 0; pointNumber < random.Next(numberOfPointsAddedMin, numberOfPointsAddedMax); pointNumber++) { chart1.Series[0].Points.AddXY(pointIndex + 1, random.Next(1000, 5000)); ++pointIndex; } // Adjust Y & X axis scale chart1.ResetAutoValues(); // Keep a constant number of points by removing them from the left while(chart1.Series[0].Points.Count > numberOfPointsInChart) { // Remove data points on the left side while(chart1.Series[0].Points.Count > numberOfPointsAfterRemoval) { chart1.Series[0].Points.RemoveAt(0); } // Adjust X axis scale chart1.ChartAreas["Default"].AxisX.Minimum = pointIndex - numberOfPointsAfterRemoval; chart1.ChartAreas["Default"].AxisX.Maximum = chart1.ChartAreas["Default"].AxisX.Minimum + numberOfPointsInChart; } // Invalidate chart chart1.Invalidate(); } ...
投稿2020/07/18 01:58

退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
どのようにすればいいでしょうか?
まずは技術要件を整理するところから始めましょう。
グラフのプロット数が100を超えると新しい系列を作成し、新しい系列にプロットし凡例を追加する
また、古い系列は消さずそのまま表示し続けるというプログラム
上記のプログラムをいきなり作るのは頭の中で整理できる人でないときっと難しいでしょう。
ですから、技術的な要件を小さく分けましょう。問題は小さく分けて考えてください。
整理すれば、要件は下記のように分割できますね。
0. グラフを作成して表示する
0. 特定の系列に属するデータの個数を取得する
0. 新しい系列を作成する
0. 新しい系列を作成し、データを追加する
0. 新しい系列を作成し、グラフに追加する
0. グラフに新しい系列を追加し、凡例を追加する
分割が出来たら、次はそれぞれの技術要件をどのようにプログラムで表現できるか 1つずつ リファレンスを見たり、手を動かしたりして調査してください。
Windows Forms アプリケーションであれば、System.Windows.Forms
やSystem.Windows.Forms.DataVisualization
などの名前空間に属するクラスが利用できます。Chart
クラスはきっと使うでしょう。
例えば、グラフを作成して表示する処理が出来ていなければその技術要件を調査する所から が moja16 さんのやるべき事です。
もし調査した上で躓いた場合は、「どのページを参照して」「どの技術要件に対して」「どのように困っているか」をこの回答にコメントするなり、業務であればプロジェクトメンバーなりに聞いて対応してください。
投稿2020/07/17 09:06
編集2020/07/17 10:03総合スコア2663
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。