tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルチャートコントロール(複数テーブル)
記事No10724
投稿日: 2012/03/10(Sat) 16:41
投稿者oga
はじめまして。

  開発環境:VB2010pro Win7(32bit pro)    

  初めて投稿させていただきます。
    チャートコントロールを利用しY1,2軸両成分の折線グラフに
  それぞれ別のCSVファイルを読み込み描画出来ないかと
  考えているのですがどうもY2軸側の表示するところで
  処理がとまってしまうようです。
  もしご存知の方がいらっしゃいましたらご教授頂ければ
  と思っております。
   
  作業の流れでは
  1)フォームロード時
   Y1及び2軸の対象CSVを1つのDataSetに2つのテーブルでセット
   ※(Y1軸CSVファイルは10分サンプリングピッチデータ
     Y2軸CSVファイルは60分サンプリングピッチデータ)
  2)コマンドボタンをクリック→描画開始
   Y2軸を描画しようとするときに列名称が見つかりませんとの
   エラーが発生し処理がとまってしまう。
   
  どうもY2軸のテーブル名称を指定してもY1軸側のテーブルを 
  読み込んでいるようでした。(※下記のY2参照CSVの1行目を
  Date,1,2に変更するとY1軸側のデータが描画されました)
  
  このコントロール自体は初めて使うので仕様なのか、記述ミス
  なのかもちょっとわからない状態です。
  どなたかお分かり方がいらっしゃいましたらよろしくお願いいたします。

  下記にソースとcsvの中身を記述します
  
’以下ソース−−−−−−−−−−−−−−−−−−−−−−−−−−−
Private ds As New DataSet
Private DBColumsY1 As Integer, DBColumsY2 As Integer
  
'フォームロード時
Private Sub Form1_Load(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles MyBase.Load
    DBColumsY1 = ChartDataOpen(Application.StartupPath(), "temp1.csv","tbl1")
    DBColumsY2 = ChartDataOpen2(Application.StartupPath(), "temp2.csv","tbl2")
End Sub
'CSVデータセット
Private Function ChartDataOpen(ByVal FolderPath As String,_
            ByVal FileName As String,ByVal StrTBL as string)
        Dim DBColums As Integer = 0        
        
    Using cn As New System.Data.OleDb.OleDbConnection
      Dim csvFileName As String = FileName
      cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
      & FolderPath & ";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, StrTBL)
        'データの系列数を取得
          DBColums = ds.Tables(StrTBL).Columns.Count - 1      
       End Using
      End Using
        Return DBColums
End Function
'描画開始
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs)_
                     Handles Button1.Click
   With Chart1
     .DataSource = ds
     'Y1軸
     For i As Integer = 1 To DBColumsY1
       Dim columnName As String = ds.Tables("tbl1").Columns(i) _
                                      .ColumnName.ToString()
       '系列の設定
       .Series.Add(columnName)
       .Series(columnName).ChartType = _
       DataVisualization.Charting.SeriesChartType.FastLine
       'X 軸のラベルテキストの読込・設定
       .Series(columnName).XValueMember = _
       ds.Tables("tbl1").Columns(0).ColumnName.ToString()
       'グラフ用のデータの読込・設定
       .Series(columnName).YValueMembers = columnName
     Next
     'Y2軸
     For i As Integer = 1 To DBColumsY2
       Dim columnName As String = _
          ds.Tables("tbl2").Columns(i).ColumnName.ToString()
       '系列の設定(CH名称・和名称)
       .Series.Add(columnName)
       .Series(columnName).ChartType = _
           DataVisualization.Charting.SeriesChartType.StepLine
        'X 軸のラベルテキストの読込・設定
        .Series(columnName).XValueMember = _
           ds.Tables("tbl2").Columns(0).ColumnName.ToString()
        'グラフ用のデータの読込・設定
        .Series(columnName).YValueMembers = columnName
        .Series(columnName).YAxisType = AxisType.Secondary
      Next

      .ChartAreas("ChartArea1").AxisY.Maximum = 30
      .ChartAreas("ChartArea1").AxisY.Minimum = -30
      .ChartAreas("ChartArea1").AxisY2.Maximum = 150
      .ChartAreas("ChartArea1").AxisY2.Minimum = -50
    End With
End Sub
'以上ソース-------------------------------------

  'Y1軸側参照csv-------------------------------------
  Date,P.001,P.002
    2012/3/1 0:00,0.02,-0.02
    2012/3/1 0:10,0,0
    2012/3/1 0:20,0.02,-0.02
    2012/3/1 0:30,0.02,0
    2012/3/1 0:40,0.02,-0.02
    2012/3/1 0:50,0,-0.02
    2012/3/1 1:00,0.02,-0.02
    2012/3/1 1:10,0,-0.02
    2012/3/1 1:20,0.02,-0.02
    2012/3/1 1:30,0,-0.02
    2012/3/1 1:40,0,-0.02
    2012/3/1 1:50,0,0
    2012/3/1 2:00,0,-0.02
    
    'Y2軸側参照csv-------------------------------------
    Date,K01,K02
    2012/03/01 00:00:00,0,0
    2012/03/01 01:00:00,1.63,0
    2012/03/01 02:00:00,3.63,0
    2012/03/01 03:00:00,4.63,1.2
    2012/03/01 04:00:00,5.63,2.4
    2012/03/01 05:00:00,6.63,2.8
    2012/03/01 06:00:00,7.63,3.2

[ツリー表示へ]
タイトルRe: チャートコントロール(複数テーブル)
記事No10725
投稿日: 2012/03/10(Sat) 22:40
投稿者VBレスキュー(花ちゃん)
そもそもこのようなグラフは、手書きで書いても書けないのではないでしょうか?

どのような表示になるかイメージされていますか?

データのラベル名が異なる2つのデータを1つのグラフにどのように書きたいのでしょうか?

2つのデータを1つのグラフで表示したいなら、その2つのデータを1つの表(テーブル)に
まとめるか?(1つのテーブルにまとめられないようなデータなら無理ですよね)

下記のように1つのチャートの中に複数のチャート領域を設定(同一チャート内に複数の
グラフを表示・多軸グラフの作成)したらあるいは表示できるかもしれませんが。
(未確認ですが)
http://www.hanatyan.sakura.ne.jp/samplepic/vb9_380.htm

[ツリー表示へ]
タイトルRe^2: チャートコントロール(複数テーブル)
記事No10727
投稿日: 2012/03/11(Sun) 01:35
投稿者oga
> 2つのデータを1つのグラフで表示したいなら、その2つのデータを1つの表(テーブル)に
> まとめるか?(1つのテーブルにまとめられないようなデータなら無理ですよね)

現在地質解析業務でサンプリングピッチや母数自体違う成分らの時系列チャートを
1枚にまとめて書いております。(エクセルでいうとデータポイントを繋いだ散布図
に近いです)どうもデータを1つのテーブル全てにまとめないと描画できないとなる
と私の業務としては使えないもののようなので今回はチャートコントロールを使わない
方向で行きたいと思います。

早速のご回答ありがとうございました。

[ツリー表示へ]
タイトルRe^3: チャートコントロール(複数テーブル)
記事No10728
投稿日: 2012/03/11(Sun) 14:35
投稿者VBレスキュー(花ちゃん)
> 現在地質解析業務でサンプリングピッチや母数自体違う成分らの時系列チャートを
> 1枚にまとめて書いております。

これだって、貴方の頭の中で2つのデーターをマージして並べ替えて、1つの表にして
描いているのではないですか?

今回のデーターのようにマージしても日付の単位が違うし(24時間表記・12時間表記・
分単位・秒単位)、欠損データが多いとマージする事もできないし。
(実際のデータと投稿されたデータは雲泥の差があるのかも知れませんが)

最大、譲ってデータを作り直せば、下記のようなグラフにはなりますが。

 http://www.hanatyan.sakura.ne.jp/samplepic/12-03-10.gif
 http://www.hanatyan.sakura.ne.jp/samplepic/2012-03-10-1.gif

このようなグラフは好みによる所が大きいのでこれ以上は...。

但し、どのようなグラフを表示するにせよ、それに対応したデーターを用意しない事には
表示する事はできません。

[ツリー表示へ]