範囲縦棒グラフで色指定をするには?

解決


しょう  2012-09-27 22:04:20  No: 147820  IP: [192.*.*.*]

VB2010 Chart 範囲縦棒グラフで教えてください。

1、dtRow(0) > dtRow(1) 或いは dtRow(0) < dtRow(1) の時に、縦棒の色を指定するには?
2、縦棒の幅、縦棒と縦棒の間隔 を指定には?
    (当然ですが、縦棒の幅を狭くし間隔を詰めれば縦棒はチャートの左側に寄り右側は空きます)

超初心者です。よろしくお願いします。


    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'データの取得
        Dim ds As New DataSet
        Dim dt As New DataTable
        Dim dtRow As DataRow

        '列の作成
        dt.Columns.Add("指数①", Type.GetType("System.Int32"))
        dt.Columns.Add("指数②", Type.GetType("System.Int32"))
        ds.Tables.Add(dt)

        'データの追加
        dtRow = ds.Tables(0).NewRow
        dtRow(0) = "700"
        dtRow(1) = "550"
        ds.Tables(0).Rows.Add(dtRow)

        dtRow = ds.Tables(0).NewRow
        dtRow(0) = "800"
        dtRow(1) = "700"
        ds.Tables(0).Rows.Add(dtRow)

        dtRow = ds.Tables(0).NewRow
        dtRow(0) = "500"
        dtRow(1) = "600"
        ds.Tables(0).Rows.Add(dtRow)

        dtRow = ds.Tables(0).NewRow
        dtRow(0) = "700"
        dtRow(1) = "800"
        ds.Tables(0).Rows.Add(dtRow)

        'Chartコントロールにデータソースを設定
        Chart1.DataSource = ds
        '初期化  
        Chart1.Series.Clear()
        '
        Chart1.ChartAreas(0).AxisX.MajorGrid.Enabled = False
        Chart1.ChartAreas(0).AxisX.MinorGrid.Enabled = False
        '
        Dim rosoku = Chart1.Series.Add("範囲縦棒")
        With rosoku
            .ChartType = DataVisualization.Charting.SeriesChartType.RangeColumn
            '.XValueMember = "日付"
            .YValueMembers = "指数①, 指数②"
            .IsVisibleInLegend = False      '凡例を非表示にする
        End With
        Chart1.DataBind()
    End Sub

編集 削除
shu  2012-09-28 12:06:40  No: 147821  IP: [192.*.*.*]

こんな感じにするとよいです。

        'データの取得
        Dim dt As New DataTable

        '列の作成
        dt.Columns.Add("x", GetType(Integer))
        dt.Columns.Add("指数1", GetType(Integer))
        dt.Columns.Add("指数2", GetType(Integer))
        dt.Columns.Add("指数3", GetType(Integer))
        dt.Columns.Add("指数4", GetType(Integer))

        'データの追加
        dt.Rows.Add(1, 700, 550, DBNull.Value, DBNull.Value)
        dt.Rows.Add(2, DBNull.Value, DBNull.Value, 500, 700)
        dt.Rows.Add(3, DBNull.Value, DBNull.Value, 500, 600)
        dt.Rows.Add(4, 700, 800, DBNull.Value, DBNull.Value)

        'Chartコントロールにデータソースを設定
        Chart1.DataSource = dt
        '初期化  
        Chart1.Series.Clear()
        '
        Chart1.ChartAreas(0).AxisX.MajorGrid.Enabled = False
        Chart1.ChartAreas(0).AxisX.MinorGrid.Enabled = False
        '
        Dim rosoku = Chart1.Series.Add("範囲縦棒")
        With rosoku
            .ChartType = DataVisualization.Charting.SeriesChartType.RangeColumn
            .Color = Color.Red
            .YValueMembers = "指数1, 指数2"
            .IsVisibleInLegend = False      '凡例を非表示にする
            .XValueMember = "x"
        End With

        Dim rosoku2 = Chart1.Series.Add("範囲縦棒2")
        With rosoku2
            .ChartType = DataVisualization.Charting.SeriesChartType.RangeColumn
            .Color = Color.Blue
            .YValueMembers = "指数3, 指数4"
            .IsVisibleInLegend = False      '凡例を非表示にする
            .XValueMember = "x"
        End With

        Chart1.DataBind()

編集 削除
しょう  2012-09-28 15:42:15  No: 147822  IP: [192.*.*.*]

shuさん、ありがとうございます。

データ数を4件で教えて頂いたと思いますが、実際のデータはもっと多いのです。
質問の仕方が悪くてすみません。

下記の件もよろしくお願いします。
2、縦棒の幅、縦棒と縦棒の間隔 を指定には?
  (当然ですが、縦棒の幅を狭くして間隔を詰めれば、チャートの左側に縦棒が寄り右側は空くことになります)

編集 削除
shu  2012-09-28 16:56:09  No: 147823  IP: [192.*.*.*]

>データ数を4件で教えて頂いたと思いますが、実際のデータはもっと多いの>です。
>質問の仕方が悪くてすみません。
何件でも同じです。Addするタイミングで条件判断して1,2に設定するか3,4に設定するか判断するだけ。


> 2
With rosoku
    .SetCustomProperty("MaxPixelPointWidth", "5")
    .SetCustomProperty("MinPixelPointWidth", "5")
End With
とか
With rosoku2
    .SetCustomProperty("PointWidth", "0.3")
End With
として

With Chart1.ChartAreas(0).AxisX
    .Minimum = 0
    .Maximum = 5
End With
のようにするとよいかと。

編集 削除
しょう  2012-09-28 22:10:45  No: 147824  IP: [192.*.*.*]

shuさん、ありがとうございます。
お手数をお掛けしています。

> 1
>何件でも同じです。Addするタイミングで条件判断して1,2に設定するか3,4に設定するか判断するだけ。

条件判断は分かりましたが、肝心のデータを追加する方法が分かりません。
  例えば、データをもう1件追加して、5番目のデータのときには…、
    dt.Columns.Add("指数5", GetType(Integer))
    として
    dt.Rows.Add(5, 400, 200, DBNull.Value, DBNull.Value)
    と、しなければならないのでしょうか? 

> 2
    .SetCustomProperty("MaxPixelPointWidth", "5")
    .SetCustomProperty("MinPixelPointWidth", "5")
では、.Maximum の値によっては縦棒が重なったりしますし、

    .SetCustomProperty("PointWidth", "0.3")
でも、.Maximum の値を適正に算出するのが困難です。
強制的に縦棒と縦棒との間隔を設定することは出来ないのでしょうか?

また、このこととは関係なしにですが…、
縦棒のX軸に対する表示位置が、RedとBlueとでは違いますので等間隔になってないです。

編集 削除
shu  2012-09-28 22:49:04  No: 147825  IP: [192.*.*.*]

> dt.Rows.Add(5, 400, 200, DBNull.Value, DBNull.Value)

dtRow = dt.NewRow
dtRow(0) = 5
dtRow(1) = 400
dtRow(2) = 200
dtRow(3) = DBNull.Value
dtRow(4) = DBNull.Value
dt.Rows.Add(dtRow)
と同じですが分かっていますか?何行もかくのが大変なので1行で
書けるメソッドを使用しただけです。
色の数が増えなければ項目を増やす必要はないです。

> 強制的に縦棒と縦棒との間隔を設定することは出来ないのでしょうか?
AxisXにIntervalがありますがX軸のラベル表記がIntervalに合わせ変わってしまいます。データの項目xの値を間隔に合わせて変えればよいかもしれません。MinとMaxが決まればxの値1に対する幅は決まるのでMinとMaxで指定する方法を提示しました。

Min= 0, Max=5でChartの幅が300pixelならxの1の幅のpixel数は60pixelでありどうにも変えようがありません。

> でも、.Maximum の値を適正に算出するのが困難です。
困難でも計算して下さい。既定で設定される内容を変えるなら
いろいろうまく計算して設定するしかないかと思います。

編集 削除
しょう  2012-09-29 22:44:01  No: 147826  IP: [192.*.*.*]

shuさん、ありがとうございます。

1行で書くとこのようになるのですね。
同じだとは知りませんでした。

間隔についても値を算出して、上手く表示できるように調整してみます。

何度も教えて頂きありがとうございました。
今後ともどうぞよろしくお願いします。

編集 削除