スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

C# Chartの折れ線グラフで不連続な部分を作る

引き続きChartの話です。

まずは以下のサンプルコードを実行してみたいと思います。

ChartSample2.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;

namespace myapp
{
class ChartSample1
{
public partial class Form1 : Form
{
//Chartオブジェクトを生成
private System.Windows.Forms.DataVisualization.Charting.Chart chart;

//コンストラクタ
public Form1(){
//フォームおよびフォームに配置されるコンポーネントを初期化
//InitializeComponent();

//フォームのサイズを設定
this.Size = new Size(400,400);

//Formにロードイベントを追加
this.Load += new System.EventHandler(this.Form1_Load);
}
private void Form1_Load(object sender, EventArgs e)
{
//Chartをインスタンス化
this.chart = new System.Windows.Forms.DataVisualization.Charting.Chart();

//Chartの各要素のクリア
chart.ChartAreas.Clear();
chart.Titles.Clear();
chart.Series.Clear();

//ChartArea(グラフ領域)
ChartArea area = new ChartArea("area1");

//Title(グラフのタイトル)
Title title = new Title("title1");

//ChartAreaにTitleを紐付ける
title.DockedToChartArea = "area1";

//Series(グラフに表示されるひとつの系列)
Series series1 = new Series();
Series series2 = new Series();

//Seriesの種類を設定
series1.ChartType = SeriesChartType.Line;
series2.ChartType = SeriesChartType.Line;

//Seriesのデータを設定(Sin波,Cos波)
for(int i=0;i<360;i++)
{
series1.Points.AddXY(i,Math.Tan(i*Math.PI/180.0) );
series2.Points.AddXY(i,Math.Cos(i*Math.PI/180.0) );
}

//ChartAreaにSeriesを紐付ける
series1.ChartArea = "area1";
series2.ChartArea = "area1";

//ChartArea,Title,SeriesをChartに追加
chart.ChartAreas.Add(area);
chart.Titles.Add(title);
chart.Series.Add(series1);
chart.Series.Add(series2);

//Chartをフォームのコントロールに追加
this.Controls.Add(this.chart);
}
}
static void Main() {
Application.Run(new Form1());
}
}
}



昨日のサンプルのSin波をTan波に変更しただけです。
しかし、実行すると



このように、Tan波の特性上とんでもないグラフになってしまいます。
Cos波もいい迷惑です。

グラフの表示はすべての系列データをグラフに描画する自動調節機能がオンになっているのでこういうことになってしまいます。

これを見やすいグラフにするには


  1. スケールをいじってデータの表示範囲を制御する

  2. Seriesに格納する値を「なし」にする



の2つの対処法があります。
ほかにもあるかもしれません。


まず、1つめの方法。

AxisクラスのMaximum、Minimumというプロパティに値を設定することで、X軸やY軸の表示範囲を指定することができます。

先ほどのコードに

area.AxisY.Maximum = 1.5; 
area.AxisY.Minimum = -1.5;


この二つの命令を足します。

実行結果



Y軸の範囲が指定され、見やすいグラフになりました。


続いて2つめ、範囲外のデータをそもそもなかったことにしてしまう方法です。

先ほどのコードからY軸範囲指定の命令を消し、データを格納しているfor文の中をこう書き換えます。

if(Math.Tan(i*Math.PI/180.0) < 1.5 && Math.Tan(i*Math.PI/180.0) > -1.5){ 
series1.Points.AddXY(i,Math.Tan(i*Math.PI/180.0) );
}
else{
series1.Points.AddXY(i,Double.NaN );
}
series2.Points.AddXY(i,Math.Cos(i*Math.PI/180.0) );


ポイントは、範囲外だったときのデータを

Double.NaN

にしてしまうところです。

これは、値がない(非数)、ということを示すDouble型のフィールドです。

参考:Double.NaN フィールド


これがデータとして格納された場合、グラフは表示されません。

実行結果



二つの結果を見比べてわかるように、2つめのグラフはデータ自体に欠損ができてしまうので、使うときは注意が必要です。
ただ、この記事を書こうと思ったのが、不連続な折れ線グラフを描画したくて、結果として2つめのやり方で問題解決したから、だったので、使いどころをみきわめていきましょー。



それでは、今回はこの辺りで。
関連記事

コメント

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます
非公開コメント
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。