VBレスキュー(花ちゃん)
VB2005用トップページへVBレスキュー(花ちゃん)のトップページVB6.0用のトップページ各掲示板

メニューへ戻ります。 Chart コントロール関係のメニュー
1.Chart コントロールの基本的な使い方
2.Chart コントロール関係ワンポイントテクニック集
3.Chart コントロールで行と列を入れ替えて表示 
4.StreamReader でデータを読み込み及び行列入れ替え表示 
5.Chart でレーダーチャートを見やすく表示
6.Chart で散布図を表示(Point・点グラフ)
7.Chart でデータ数が多い場合チャートにスクロールバーを付けて表示
8.一つのChart 内でグラフを上下に2個並べて表示
9.Chart で円グラフを表示 
10.Chart で縦棒と折線の複合グラフを表示
11.Chart で横スクロール時の現在表示データに合わせた自動目盛り設定
12.
 . 
20.その他、当サイト内に掲載の Chart に関するサンプル 


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.上記実行結果
 vb2013chart11_1
このページのトップへ移動します。 2.



このページのトップへ移動します。 3.


このページのトップへ移動します。 4.


このページのトップへ移動します。 5. 


このページのトップへ移動します。 6.


このページのトップへ移動します。 検索キーワード及びサンプルコードの別名(機能名)





このページのトップへ移動します。