LoginSignup
4
8

More than 5 years have passed since last update.

C#で簡易的にグラフの中身をスクロールさせる

Last updated at Posted at 2017-05-27

はじめに

例えばセンサーなどから、定期的に取得する情報をグラフに表示して、一定区間をスクロールさせて流すといったもので、簡易的なものがほしかたったので、こんな方法を取ったというものです。
色々ともっと良い方法があるかもしれませんが・・・

C#でWindowsフォームアプリケーション(.NET Framework)で作成します。

※最近記事を書いていなくて、ちょっとこんな感じのことをしたので何となく投稿したと言うのもあります

内容

3つのデータがCSV形式で出力されるログファイルを監視し、グラフに出力する

Chartの設定でやったこと

  1. ツールボックスのデータからChartをフォームにドロップ
  2. 凡例が邪魔だったので、プロパティのグラフ-Legends-(コレクション)を開いて、メンバーを削除
  3. 系列を増やして、グラフの種類などを変更するため、グラフ-Series-(コレクション)を開いて、メンバーを2つ追加
  4. 各系列のプロパティについて、(グラフ)-ChartTypeよりLineを選択(折れ線グラフとするため)、また(外観)-BorderWidthで線の太さを変更し、Colorで色を変更

image.png

image.png

image.png

フォームはこんな感じで、左にグラフ、右に一応ログを表示
image.png

ソースコード

ログの読み込みは次の記事より
C#で簡易ログビューワーの作成 - とりあえずこれでいいんじゃない? - Qiita

int cnt = 0; //変数である必要は無い(Qiitaでのコメントを頂いた事で発覚)

private void FileReaded(object sender, ReadedEventArgs e)
{
    if (e.Text.Length == 0)
        return;

    //グラフ作成
    foreach (string s in e.Text.Split(new string[] { "\r\n" }, StringSplitOptions.None))
    {
        string[] data = s.Split(',');
        if (chart1.Series[0].Points.Count <= 100)
        {
            chart1.Series[0].Points.AddXY(cnt, double.Parse(data[0]));
            chart1.Series[1].Points.AddXY(cnt, double.Parse(data[1]));
            chart1.Series[2].Points.AddXY(cnt, double.Parse(data[2]));
        }
        else
        {
            for (int i = 1; i <= 100; i++)
            {
                chart1.Series[0].Points[i-1].YValues = chart1.Series[0].Points[i].YValues;
                chart1.Series[1].Points[i-1].YValues = chart1.Series[1].Points[i].YValues;
                chart1.Series[2].Points[i-1].YValues = chart1.Series[2].Points[i].YValues;
            }
            chart1.Series[0].Points.RemoveAt(100);
            chart1.Series[1].Points.RemoveAt(100);
            chart1.Series[2].Points.RemoveAt(100);
            chart1.Series[0].Points.AddXY(cnt, double.Parse(data[0]));
            chart1.Series[1].Points.AddXY(cnt, double.Parse(data[1]));
            chart1.Series[2].Points.AddXY(cnt, double.Parse(data[2]));
        }
    }

    textBox1.Text += e.Text;
    textBox1.SelectionStart = textBox1.Text.Length;
    textBox1.ScrollToCaret();
}

100件まではそのままChartに追加して、100件を超える場合、一つずつ左にずらし、100件目を削除して、追加するといった事をしています。

こんな感じになりました。
image.png

ログが更新されればスクロールされていきます。

以上

4
8
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
8