teratail header banner
teratail header banner
質問するログイン新規登録
Chart.js

Chart.jsは、多様なグラフを組み込めるJavaScriptのライブラリ。折れ線グラフや棒グラフ、円グラフ、レーダーチャートなどのグラフの種類が用意されています。HTML5のCanvasを用いて描画され、マークアップも分かりやすく、簡単に編集することが可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

2回答

1571閲覧

c# chartでグラフ作成の質問

moja16

総合スコア0

Chart.js

Chart.jsは、多様なグラフを組み込めるJavaScriptのライブラリ。折れ線グラフや棒グラフ、円グラフ、レーダーチャートなどのグラフの種類が用意されています。HTML5のCanvasを用いて描画され、マークアップも分かりやすく、簡単に編集することが可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2020/07/17 05:03

編集2020/07/17 05:55

0

0

visual studio c# WindowsFormapplicationで
折れ線グラフを作成したいのですがグラフのプロット数が100を超えると新しい系列を作成し、新しい系列にプロットし凡例を追加する
また、古い系列は消さずそのまま表示し続けるというプログラムを作りたいです。
どのようにすればいいでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BluOxy

2020/07/17 05:06

内容を記載してください
BluOxy

2020/07/17 06:06 編集

Chart.jsはJavaScriptのライブラリですので、タグは削除をお願いします。 > グラフのプロット数が100を超えると 1系列辺りのデータ個数のことで良いでしょうか。また、その個数を取得する方法は調べているでしょうか。 > 新しい系列にプロットし > 凡例を追加する > 古い系列は消さず それぞれ技術要件を調べて実装し、それぞれを1つずつ動作させるところから始めるべきではないでしょうか > そのまま表示し続ける 「そのまま」とはどう「そのまま」でしょうか。単純に、1つのグラフに複数の系列を表示したいということでしょうか。 上記の疑問が解決するよう質問の編集をお願いします。 (解決できない場合はその理由をコメントしてください)
moja16

2020/07/17 06:16

グラフのプロット数が100を超えると 1系列当たりのデータ数が100を超えるとです。 そのまま表示し続ける 単純に1つのグラフに複数のグラフを表示するということです。
退会済みユーザー

退会済みユーザー

2020/07/18 01:51

Windows Froms 用の Chart の話なら、Chart.js は関係ないので削除してください。先に依頼されているはず。無視しないでちゃんと対応してください。
guest

回答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.FormsSystem.Windows.Forms.DataVisualizationなどの名前空間に属するクラスが利用できます。Chartクラスはきっと使うでしょう。

例えば、グラフを作成して表示する処理が出来ていなければその技術要件を調査する所から が moja16 さんのやるべき事です。


もし調査した上で躓いた場合は、「どのページを参照して」「どの技術要件に対して」「どのように困っているか」をこの回答にコメントするなり、業務であればプロジェクトメンバーなりに聞いて対応してください。

投稿2020/07/17 09:06

編集2020/07/17 10:03
BluOxy

総合スコア2663

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BluOxy

2020/07/17 09:18 編集

上記の技術要件に対する調査が終われば、残りのタスクはそれ等の要件を論理的に組み合わせるだけです。その方法が分からなければコメントするなりプロジェクトメンバーに聞くなりしてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問