tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルスクロールに合わせY軸の目盛りに
記事No11209
投稿日: 2014/02/14(Fri) 18:01
投稿者ゆか
VB 2010 を始めたばかりの超初心者です。
http://www.hanatyan.sakura.ne.jp/dotnet/chart28.htm
このサンプルを使わせて頂き、折れ線グラフをスクロールさせています。
そこで教えて頂きたいのは、
スクロールした表示データの最低・最高値に合わせた、Y軸の最低・最高目盛りに自動で変化させる方法です。
このままではY軸の目盛りは固定ですのでよろしくお願いします。

[ツリー表示へ]
タイトルRe: スクロールに合わせY軸の目盛りに
記事No11210
投稿日: 2014/02/14(Fri) 21:10
投稿者VBレスキュー(花ちゃん)
> このままではY軸の目盛りは固定ですのでよろしくお願いします。

そもそもY軸の目盛りは自動設定、プログラムで設定した値が表示されるので
表示中に変化する事はありません。
その都度設定値を変更してグラフを再表示しない事にはできないかと。

[ツリー表示へ]
タイトルRe^2: スクロールに合わせY軸の目盛りに
記事No11211
投稿日: 2014/02/15(Sat) 00:25
投稿者ゆか
VBレスキュー(花ちゃん) 様
ありがとうございます。

>その都度設定値を変更してグラフを再表示しない事にはできないかと。

簡単にはできないようですね。
Chart1.ChartAreas(0).AxisY.Minimum = 設定値
Chart1.ChartAreas(0).AxisY.Maximum = 設定値
で設定できるのは分るのですが、超初心者の私には無理そうなので断念します。
ありがとうございました。

[ツリー表示へ]
タイトルRe^3: スクロールに合わせY軸の目盛りに
記事No11212
投稿日: 2014/02/15(Sat) 10:26
投稿者VBレスキュー(花ちゃん)
> で設定できるのは分るのですが、超初心者の私には無理そうなので断念します。

どのようなデータをなぜそのように表示しないといけないのかが解りませんが?

グラフの縦方向と横方向の両方にスクロールバーを付けて表示したのではだめですか?
これなら簡単にできますが。
http://hanatyan.sakura.ne.jp/vb2005/vb2013chart07.htm

[ツリー表示へ]
タイトルRe^4: スクロールに合わせY軸の目盛りに
記事No11213
投稿日: 2014/02/15(Sat) 20:34
投稿者ゆか
VBレスキュー(花ちゃん) 様
ありがとうございます。

データ数が余りにも多いのでスクロールをして必要とする箇所を表示したいのです。

しかも最高値と最低値の幅も広いので、その表示箇所に合わせたY軸目盛りにしないと、
変動幅の少ない箇所では、ほぼ横一直線になってしまってグラフの意味を成しません。

さりとて私にはどうにもなりませんので断念することにします。

ありがとうございました。

[ツリー表示へ]
タイトルRe^5: スクロールに合わせY軸の目盛りに
記事No11214
投稿日: 2014/02/16(Sun) 13:15
投稿者VBレスキュー(花ちゃん)
> しかも最高値と最低値の幅も広いので、その表示箇所に合わせたY軸目盛りにしないと、
> 変動幅の少ない箇所では、ほぼ横一直線になってしまってグラフの意味を成しません。

目盛りにをスクロール表示したのではだめなら下記のグラフに
http://hanatyan.sakura.ne.jp/vb2005/vb2013chart07.htm



目盛りのスクロールの設定部分を下記のコードに差し替えて見て下さい。
(実際のデータがどのようなものか解らないので全国の気温データで試しております)

横スクロールバーの表示設定の下記の部分を変更

     .Position = spos      ' スクロールバーの初期位置

追加
'-------------- スクロールに合わせてメモリの最大値と最小値を変更 -------------
   '現在表示されているデータの最大値と最小値を求める
   Dim d1() As Double = Nothing
   Dim Ncount As Integer = -1
   For i As Integer = CInt(spos) To CInt(spos + sv.Size - 1)  '  sv.Size
      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

   dMax = 5 * (CInt(CLng(d1.Max) \ 5) + 1)   '目盛りの最大値を求める

   '目盛りの最小値を求める
   If d1.Min >= 0 Then
      dMin = 0    '最小値を 0 にしたい場合
   Else
      dMin = d1.Min
      '目盛りの最大値をデータの最大値 + 5(データに合わせて)に設定
      dMin = 5 * (CInt(CLng(d1.Min) \ 5) - 1)
   End If

   With Chart1.ChartAreas(0).AxisY
     .Maximum = dMax    '目盛りの最大値
     .Minimum = dMin    '目盛りの最小値
     .Interval = 2      'メモリ間隔
   End With
'-------------------------------------------------------------------------------

それと下記も追加して下さい。

Private spos As Double = 0

Private Sub Chart1_Paint(sender As Object, e As PaintEventArgs) Handles Chart1.Paint
   'スクロールの位置を求める
   Dim sv As AxisScaleView = Chart1.ChartAreas(0).AxisX.ScaleView
   spos = sv.Position
   If Double.IsNaN(spos) Then
      spos = 0
   End If
   Button1.PerformClick()
End Sub

これで動作確認してからご自分のグラフに移植してみて下さい。

[ツリー表示へ]
タイトルRe^6: スクロールに合わせY軸の目盛りに
記事No11215
投稿日: 2014/02/16(Sun) 17:34
投稿者ゆか
VBレスキュー(花ちゃん) 様
ありがとうございます。

教えていただいたこと早速やってみました。
動作確認では上手く行ったのですが移植してみると
d1(Ncount) = CDbl(ds.Tables(0).Rows(i).Item(J))
の部分で、
「IndexOutOfRangeExceptionはハンドルされてませんでした。」
「テーブル0が見つかりません。」
が出てしまいます。

ちなみに GoTo Test を有効にしますとエラーは出ませんし、スクロールも正常に働きます。

質問の仕方が凄く幼稚ですみませんが、こんな内容で分るようでしたらお願いします。


Imports System.Windows.Forms.DataVisualization.Charting

Public Class Form1
    Private spos As Double = 0

    Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
        Dim ds As New DataSet
        Dim colums As Integer
        Using cn As New System.Data.OleDb.OleDbConnection
            '  Dim csvFileName As String = "【2014年02月15日9時00現在の全国各地の気温】.csv"
            Dim csvFileName As String = "kion.csv"

            cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Application.StartupPath() & _
                  ";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
            '============================================================================

            '■------------------- 横・スクロールバーを表示 ----------------Start--■
            Dim sv As AxisScaleView = Chart1.ChartAreas(0).AxisX.ScaleView
            Dim sh As AxisScaleView = Chart1.ChartAreas(0).AxisY.ScaleView
            With sv
                .SmallScrollSize = 1  ' ボタンクリック時のスクロール量
                '.Position = 1        ' スクロールバーの初期位置
                .Position = spos      ' スクロールバーの初期位置
                .Size = 8        ' 1画面に表示するデータ数(データ数に対する割合で指定する)
            End With

            GoTo Test

            '-------------- スクロールに合わせてメモリの最大値と最小値を変更 -------------
            '現在表示されているデータの最大値と最小値を求める
            Dim d1() As Double = Nothing
            Dim Ncount As Integer = -1
            For i As Integer = CInt(spos) To CInt(spos + sv.Size - 1)  '  sv.Size
                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

            dMax = 5 * (CInt(CLng(d1.Max) \ 5) + 1)   '目盛りの最大値を求める

            '目盛りの最小値を求める
            If d1.Min >= 0 Then
                dMin = 0    '最小値を 0 にしたい場合
            Else
                dMin = d1.Min
                '目盛りの最大値をデータの最大値 + 5(データに合わせて)に設定
                dMin = 5 * (CInt(CLng(d1.Min) \ 5) - 1)
            End If

            With Chart1.ChartAreas(0).AxisY
                .Maximum = dMax    '目盛りの最大値
                .Minimum = dMin    '目盛りの最小値
                .Interval = 2      'メモリ間隔
            End With

Test:
        End With
    End Sub

    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 = 0
        End If
        Button1.PerformClick()
    End Sub

End Class

[ツリー表示へ]
タイトルRe^7: スクロールに合わせY軸の目盛りに
記事No11216
投稿日: 2014/02/16(Sun) 18:16
投稿者VBレスキュー(花ちゃん)
投稿されたコードの GoTo Test の部分を削除して試したのですが問題なく機能しました。
(当然ながら私が動作確認して投稿したものと同じなので)

Dim csvFileName As String = "kion.csv"
になっていますが、実際に試されたデータは違うデータを使っていませんか?
エラーがでたところの Ncount i   j  の値はどのようになっていますか?
その位置のデータが使用した ds.Tables(0)  内にありますか?

kion.csv と使用したデータが違うなら当然書き直さないといけません。
又、投稿されたコードとエラーがでたコードではどこか書き直していませんか?

[ツリー表示へ]
タイトルRe^8: スクロールに合わせY軸の目盛りに
記事No11217
投稿日: 2014/02/16(Sun) 19:51
投稿者VBレスキュー(花ちゃん)
今回の件とは関係ないかと思いますが一部バグがありましたので修正版をアップしておきます。

http://hanatyan.sakura.ne.jp/vb2005/vb2013chart11.htm

[ツリー表示へ]
タイトルRe^9: スクロールに合わせY軸の目盛りに
記事No11218
投稿日: 2014/02/17(Mon) 23:48
投稿者ゆか
ありがとうございました。
今の私のレベルでは移植できませんので断念します。
折角教えて頂いたのにすみませんでした。

[ツリー表示へ]