知ってる?! True WinChart for .NETコード編
下記のページには、Windowsフォーム用のチャート生成コンポーネントであるTrue WinChart for .NET 3.0Jを使ってのグラフを作成する基本ステップが紹介されています。
上記のページで紹介している方法は、プロパティウィンドウとデザイナを使った設定だけでグラフを作成しており、いわゆるノンコーディングな方法となっています。
データは、データベースにあるグラフ用のデータを使うという方法をとっていますが、データベースから取得したデータを加工してグラフのデータソースとするという方法も多く使われるかと思います。
ということで、ここではプロパティウィンドウとデザイナを使った設定はいっさい使わずに、コードだけでグラフを作成する場合の一例をご紹介しておこうと思います。
フォームにC1Chartコントロールを1つ貼り付け、下記のコードを記述します。
Visual Basic
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' C1Chartコントロールを配置したときのデフォルト設定では、グループ0に
' 4つのシリーズが設定されているので、それらをすべて削除します。
C1Chart1.ChartGroups.Group0.ChartData.SeriesList.RemoveAll()
' 視覚エフェクトを有効にします。
C1Chart1.VisualEffects.Styles("Default").Enabled = True
' 凡例を表示します。
C1Chart1.Legend.Visible = True
' 凡例の位置を変更します。
C1Chart1.Legend.Compass = C1.Win.C1Chart.CompassEnum.South
' X軸のラベルを傾けます。
C1Chart1.ChartArea.AxisX.AnnotationRotation = -50
' X軸とY軸の名称を設定します。
C1Chart1.ChartArea.AxisX.Text = "年月"
C1Chart1.ChartArea.AxisY.Text = "頭数"
' XデータのためのListを作成
Dim XList As New List(Of String)
Dim iMonth As Integer
For iMonth = 4 To 0 Step -1
XList.Add(System.DateTime.Now.AddMonths(-iMonth).Year.ToString + "/" _
+ System.DateTime.Now.AddMonths(-iMonth).Month.ToString)
Next
' 1つ目のシリーズを作成
Dim mySeries As C1.Win.C1Chart.ChartDataSeries = C1Chart1.ChartGroups.Group0.ChartData.SeriesList.AddNewSeries()
' CopyDataInメソッドを使って配列からXデータの値を一度に設定します。
' 配列はToArrayメソッドを使ってListから取り出します。
mySeries.X.CopyDataIn(XList.ToArray)
' 作成されたXデータの配列の長さ
Dim xDataLength As Integer = mySeries.X.Length
' Yデータの作成(直接値を代入)
' シリーズのラベルは凡例に表示されます。
mySeries.Label = "カバ"
' Yデータの配列の長さをXデータの配列の長さと同じ長さに設定します。
mySeries.Y.Length = xDataLength
' 値を直接代入していきます。
mySeries.Y(0) = 1
mySeries.Y(1) = 5
' 欠損値の設定
mySeries.Y(2) = C1Chart1.ChartGroups.Group0.ChartData.Hole
mySeries.Y(3) = 2
mySeries.Y(4) = 3
' 2つ目のシリーズを作成
mySeries = C1Chart1.ChartGroups(0).ChartData.SeriesList.AddNewSeries()
' 2つ目以降のシリーズでは、AutoEnumerateプロパティをTrueに設定
' することで、同じXデータを設定する必要がなくなります。
mySeries.AutoEnumerate = True
' シリーズのラベルは凡例に表示されます。
mySeries.Label = "ワニ"
' YデータのためのListを作成
Dim YList As New List(Of Integer)
Dim i As Integer
Dim myRandom As New System.Random
For i = 0 To xDataLength - 1
YList.Add(myRandom.Next(1, 10))
Next
' CopyDataInメソッドを使って配列からYデータの値を一度に設定します。
mySeries.Y.CopyDataIn(YList.ToArray)
End Sub
' C1Chartコントロールを配置したときのデフォルト設定では、グループ0に
' 4つのシリーズが設定されているので、それらをすべて削除します。
C1Chart1.ChartGroups.Group0.ChartData.SeriesList.RemoveAll()
' 視覚エフェクトを有効にします。
C1Chart1.VisualEffects.Styles("Default").Enabled = True
' 凡例を表示します。
C1Chart1.Legend.Visible = True
' 凡例の位置を変更します。
C1Chart1.Legend.Compass = C1.Win.C1Chart.CompassEnum.South
' X軸のラベルを傾けます。
C1Chart1.ChartArea.AxisX.AnnotationRotation = -50
' X軸とY軸の名称を設定します。
C1Chart1.ChartArea.AxisX.Text = "年月"
C1Chart1.ChartArea.AxisY.Text = "頭数"
' XデータのためのListを作成
Dim XList As New List(Of String)
Dim iMonth As Integer
For iMonth = 4 To 0 Step -1
XList.Add(System.DateTime.Now.AddMonths(-iMonth).Year.ToString + "/" _
+ System.DateTime.Now.AddMonths(-iMonth).Month.ToString)
Next
' 1つ目のシリーズを作成
Dim mySeries As C1.Win.C1Chart.ChartDataSeries = C1Chart1.ChartGroups.Group0.ChartData.SeriesList.AddNewSeries()
' CopyDataInメソッドを使って配列からXデータの値を一度に設定します。
' 配列はToArrayメソッドを使ってListから取り出します。
mySeries.X.CopyDataIn(XList.ToArray)
' 作成されたXデータの配列の長さ
Dim xDataLength As Integer = mySeries.X.Length
' Yデータの作成(直接値を代入)
' シリーズのラベルは凡例に表示されます。
mySeries.Label = "カバ"
' Yデータの配列の長さをXデータの配列の長さと同じ長さに設定します。
mySeries.Y.Length = xDataLength
' 値を直接代入していきます。
mySeries.Y(0) = 1
mySeries.Y(1) = 5
' 欠損値の設定
mySeries.Y(2) = C1Chart1.ChartGroups.Group0.ChartData.Hole
mySeries.Y(3) = 2
mySeries.Y(4) = 3
' 2つ目のシリーズを作成
mySeries = C1Chart1.ChartGroups(0).ChartData.SeriesList.AddNewSeries()
' 2つ目以降のシリーズでは、AutoEnumerateプロパティをTrueに設定
' することで、同じXデータを設定する必要がなくなります。
mySeries.AutoEnumerate = True
' シリーズのラベルは凡例に表示されます。
mySeries.Label = "ワニ"
' YデータのためのListを作成
Dim YList As New List(Of Integer)
Dim i As Integer
Dim myRandom As New System.Random
For i = 0 To xDataLength - 1
YList.Add(myRandom.Next(1, 10))
Next
' CopyDataInメソッドを使って配列からYデータの値を一度に設定します。
mySeries.Y.CopyDataIn(YList.ToArray)
End Sub
実行すると、このようなグラフが表示されます。
このようなX軸が共通でY軸のみが異なるようなグラフを複数作成する場合、X軸は最初のシリーズだけに設定し、2つ目以降のシリーズはAutoEnumerateプロパティをTrueに設定してやるという部分がポイントになるかと思います。