11.Chart で横スクロール時の現在表示データに合わせた自動目盛り設定(16_Cht_08) |
1.Chart で横スクロール時の現在表示データに合わせた自動目盛り設定 2. 3. 4. 5. 6. |
下記プログラムコードに関する補足・注意事項 動作確認:Windows 8.1 (Windows 7) / VB2013 (VB2010) / Framework 4.5.1 / 対象の CPU:x86 Option :[Compare Text] [Explicit On] [Infer On] [Strict On] Imports :System.Windows.Forms.DataVisualization.Charting 参照設定:追加なし その他 :使用データ(kion.csv)は、次よりダウンロードして使って下さい。 chartdat.zip(各サンプル共通) :このサンプルを使用される前に、左のメニューの基本的な使い方とワンポイントテクニック集をご覧になって下さい。 このサンプル等の内容を無断で転載、掲載、配布する事はお断りします。(私の修正・改訂・削除等が及ばなくなるので) 必要ならリンクをはるようにして下さい。(引用の場合は引用元のリンクを明記して下さい) |
1.Chart で横スクロール時の現在表示データに合わせた自動目盛り設定 |
'チャート関係の名前空間です。 Imports System.Windows.Forms.DataVisualization.Charting Public Class Form1 Private Sub ChartShow() Dim ds As New DataSet Dim colums As Integer 'データ件数等が多い場合やパフォーマンスが悪いような場合は、Table からデータを取るようにして下さい。 Using cn As New System.Data.OleDb.OleDbConnection Dim csvFileName As String = "【2015年01月15日10時00現在の全国各地の気温】.csv" Dim dirPath As String = "..\..\..\data\" 'Dim csvFileName As String = "kion.csv" cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & dirPath & _ ";Extended Properties=""Text;HDR=YES;IMEX=1;FMT=Delimited""" Using da As System.Data.OleDb.OleDbDataAdapter = _ New System.Data.OleDb.OleDbDataAdapter("SELECT * FROM " & csvFileName, cn) da.Fill(ds, "Table1") Chart1.DataSource = ds 'Chart に表示するデータソースを設定 colums = ds.Tables(0).Columns.Count - 1 'データの系列数を取得 End Using End Using With Chart1 .Titles.Clear() 'タイトルの初期化 .Series.Clear() '系列(データ関係)の初期化 End With With Chart1 For i As Integer = 1 To colums 'データベースから列名を読込(現在の気温・昨日同時刻の気温 等) Dim columnName As String = ds.Tables(0).Columns(i).ColumnName.ToString() '系列の設定(現在の気温・昨日同時刻の気温 等) .Series.Add(columnName) 'X 軸のラベルテキストの読込・設定(都市・県名) .Series(columnName).XValueMember = ds.Tables(0).Columns(0).ColumnName.ToString() 'グラフ用のデータの読込・設定(各温度) .Series(columnName).YValueMembers = columnName Next '------------- ここまでは、基本的な表示設定と同じ ----------------------------------------- '県別の区切りが解りやすいように IntervalOffset = 0.5 で表示 Chart1.ChartAreas(0).AxisX.MajorGrid.IntervalOffset = 0.5 Chart1.ChartAreas(0).AxisX.LabelStyle.Interval = 1 'X軸にマージンを表示しない場合(グラフの最初のデータまでの左の余白) 'Chart1.ChartAreas(0).AxisX.IsMarginVisible = False '■------------------- 横・スクロールバーを表示 ----------------Start--■ Dim sv As AxisScaleView = Chart1.ChartAreas(0).AxisX.ScaleView With sv .SmallScrollSize = 1 ' ボタンクリック時のスクロール量 .Position = spos ' スクロールバーの初期位置 (1) .Size = 5 ' 1 画面に表示するデータ数(データ数に対する割合で指定する) End With Dim sb As AxisScrollBar = Chart1.ChartAreas(0).AxisX.ScrollBar 'X軸のスクロールバーを設定 With sb '既定の幅が、Size プロパティの制限の制限を超える(4K タイプの解像度の場合) Dim s_Size As Integer = SystemInformation.VerticalScrollBarWidth If s_Size < 5 Then s_Size = 5 ElseIf s_Size > 20 Then s_Size = 20 End If 'Size プロパティの制限が 5 〜 20 の範囲なので(これってバグ?) .Size = s_Size 'スクロールバーの幅を既定の幅に .ButtonStyle = ScrollBarButtonStyles.All 'すべてのボタンを表示 .IsPositionedInside = True 'チャート領域の内部に配置 .BackColor = Color.White 'スクロールバーの背景色 .ButtonColor = Color.FromArgb(70, Color.Silver) 'Color.Silver では暗い色になるので .LineColor = Color.Black '枠の線の色 End With '■-------------------------------------------------------------End----■ '■--------- スクロールに合わせて目盛りの最大値と最小値を変更 --Start--■ '現在表示されているデータの最大値と最小値を求める Dim d1() As Double = Nothing Dim Ncount As Integer = -1 '初期値の場合北海道(0)〜(5)山形が表示しているので(spos=1 sv.Size=5) For i As Integer = CInt(spos - 1) To CInt(spos + sv.Size - 1) '県名(A列)を除いたB列〜E列までの気温のデータ For J As Integer = 1 To colums Ncount += 1 ReDim Preserve d1(Ncount) d1(Ncount) = CDbl(ds.Tables(0).Rows(i).Item(J)) Next Next Dim dMax As Double = 0 Dim dMin As Double = 0 Dim mitv As Integer = 2 '目盛り間隔(この場合2度) '目盛りの最大値を求める(最大値に対して目盛り間隔(2)がいくつ必要かを求め1目盛り間隔分余裕を持たす) dMax = mitv * CInt(Math.Ceiling(d1.Max / mitv) + 1) '下図1.を参照 '目盛りの最小値を求める If d1.Min >= 0 Then dMin = 0 '最小値を 0 にしたい場合 Else dMin = d1.Min '最小値を設定する場合(今回の場合は最小値がーの場合を想定して) '目盛りの最小値を求める(最小値に対して目盛り間隔がいくつ必要かを求め1目盛り間隔分余裕を持たす) dMin = mitv * CInt(Math.Ceiling(d1.Min / mitv) - 2) '下図1.を参照 End If ' Y 軸目盛りの設定(データに合わせて設定して下さい) With Chart1.ChartAreas(0).AxisY .Maximum = dMax '目盛りの最大値 .Minimum = dMin '目盛りの最小値 .Interval = mitv '目盛り間隔 End With End With '☆★☆★☆★☆★☆★☆★☆★☆★ ここからは、グラフの装飾の部分です ☆★☆★☆★☆★☆★☆★☆★☆★ '以下省略 End Sub Private spos As Double = 1 '移動後のスクロール位置 Private oldpos As Double = 1 '移動前のスクロール位置 Private Sub Chart1_Paint(ByVal sender As Object, ByVal e As PaintEventArgs) Handles Chart1.Paint 'スクロールの位置を求める Dim sv As AxisScaleView = Chart1.ChartAreas(0).AxisX.ScaleView spos = sv.Position If Double.IsNaN(spos) Then 'スタートポジション spos = 1 End If If oldpos <> spos Then 'スクロール位置が変化した場合のみグラフを書き換える Call ChartShow() End If oldpos = spos End Sub Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Me.Show() Call ChartShow() End Sub End Class 図1.上記実行結果 |
2. |
3. |
4. |
5. |
6. |
検索キーワード及びサンプルコードの別名(機能名) |