Chart上でマーカーを付けえるには?

解決


しょう  2012-10-24 18:58:55  No: 147916  IP: [192.*.*.*]

何度もすみません。

クリックをしたグラフ棒の直ぐ上に…、
Q1,▽や○などの形の、小さいマーカー(目印)を付ける事は可能でしょうか?
      出来れば色も指定したいです。

Q2,更にその上部に、日付などの文字表示も出来れば有り難いです。


これは上の二つとは関係ないのですが…、
Q3,クリックした位置の、グラフ棒の色と背景の色を取得する方法を教えてください。

どうぞよろしくお願いします。

Imports System.Windows.Forms.DataVisualization.Charting
Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim tbl As New DataTable
        '列の作成
        With tbl.Columns
            .Add("日付", GetType(String))
            .Add("指数", GetType(Integer))
        End With
        'データの追加
        tbl.Rows.Add("2012/08/1", 40)
        tbl.Rows.Add("2012/08/2", 60)
        tbl.Rows.Add("2012/08/7", 30)
        tbl.Rows.Add("2012/08/8", 80)
        '初期化    
        Chart1.Series.Clear()
        'グラフの種類,系列,軸の設定
        Dim rosoku = Chart1.Series.Add("棒グラフ")
        With rosoku
            .ChartType = DataVisualization.Charting.SeriesChartType.Column
            .XValueMember = "日付"
            .YValueMembers = "指数"
            .IsVisibleInLegend = False
        End With
        Chart1.DataSource = tbl
        Chart1.DataBind()

        With Chart1.ChartAreas(0)
            .AxisX.MajorGrid.Enabled = False
            .AxisX.MinorGrid.Enabled = False
            .BackColor = Color.Gainsboro                 '背景の色
        End With
    End Sub
    Private Sub Chart1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Chart1.MouseClick
        'クリックした位置の要素を取得
        Dim htrResult As HitTestResult = Chart1.HitTest(e.X, e.Y)
        If htrResult.ChartElementType = ChartElementType.DataPoint Then
            Dim i As Integer = htrResult.PointIndex
            Dim dp As DataPoint = htrResult.Series.Points(i)
            For j As Integer = 0 To Chart1.Series.Count - 1
                If Chart1.Series(j).Name = htrResult.Series.Name Then
                    Dim SeriesNo As Integer = j
                    Exit For
                End If
            Next
            'クリックした位置の要素を表示
            MessageBox.Show(String.Format("{0}({1}) : {2}", htrResult.Series.Name, dp.AxisLabel, dp.YValues(0)))
        End If
    End Sub
End Class

編集 削除
しょう  2012-10-24 23:41:36  No: 147917  IP: [192.*.*.*]

もうひとつお願いします。

チャートを描画後に…、
日付を指定して、その該当する日付の位置に縦線を、
指数を指定して、その該当する指数の位置に横線を、
引くことは可能でしょうか?

また、一度引かれた線を消すことは可能でしょうか?

お手数をお掛けし恐縮ですが、どうぞよろしくお願いします。

編集 削除
shu  2012-10-26 07:47:14  No: 147918  IP: [192.*.*.*]

プロパティなどで設定が可能かもしれませんが、
いろいろカスタマイズしたいのならPostPaintイベントで
追加で表示したい内容を描画するとよいと思います。
クリックされた場所にたいし縦横に線を引く例。
PostPaintで描画しているのは1組の線なので前回引いた線は
勝手に消えます。(描画しなおしなので)

    Private m_click As Boolean = False
    Private m_x As Integer
    Private m_y As Integer
    Private Sub Chart1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Chart1.MouseClick
        m_click = True
        m_x = e.X
        m_y = e.Y
        Chart1.Invalidate()
    End Sub

    Private Sub Chart1_PostPaint(sender As Object, e As System.Windows.Forms.DataVisualization.Charting.ChartPaintEventArgs) Handles Chart1.PostPaint
        If m_click Then
            Dim x1 = Chart1.ChartAreas(0).AxisX.ValueToPixelPosition(Chart1.ChartAreas(0).AxisX.Maximum)
            Dim x2 = Chart1.ChartAreas(0).AxisX.ValueToPixelPosition(Chart1.ChartAreas(0).AxisX.Minimum)
            e.ChartGraphics.Graphics.DrawLine(Pens.Cyan, CInt(x1), m_y, CInt(x2), m_y)
            Dim y1 = Chart1.ChartAreas(0).AxisY.ValueToPixelPosition(Chart1.ChartAreas(0).AxisY.Maximum)
            Dim y2 = Chart1.ChartAreas(0).AxisY.ValueToPixelPosition(Chart1.ChartAreas(0).AxisY.Minimum)
            e.ChartGraphics.Graphics.DrawLine(Pens.Cyan, m_x, CInt(y1), m_x, CInt(y2))
        End If
    End Sub

編集 削除
しょう  2012-10-26 13:30:10  No: 147919  IP: [192.*.*.*]

shuさん、希望通りです。
ありがとうございます。

あと…、
日付を指定してその該当する日付の位置に縦線を引く、
或いは、
指数を指定してその該当する指数の位置に横線を引く、
ことは可能でしょうか?

それとクリックした位置の、グラフ棒の色と、背景の色の取得の仕方も教えてください。

何度もすみません。
よろしくお願いします。

編集 削除
shu  2012-10-26 15:40:31  No: 147920  IP: [192.*.*.*]

> 日付を指定してその該当する日付の位置に縦線を引く、
> 指数を指定してその該当する指数の位置に横線を引く、
ValueToPixelPositionで場所を探すと良いと思います。

>それとクリックした位置の、グラフ棒の色と、背景の色の取得の仕方も教えてください。
クリックした位置がどのグラフかは分かると思いますので、自分で設定した背景色、棒の色が希望している色なのではないでしょうか。

1個のスレであまり複数の質問を混ぜない方がよいと思います。
質問毎にスレを立てればスレの解決への時間が短くてすみますが
複数の質問を混ぜるとすべてが解決するまでに時間がかかってしまいます。

編集 削除
しょう  2012-10-27 13:55:35  No: 147921  IP: [192.*.*.*]

>ValueToPixelPositionで場所を探すと良いと思います。
記述していただいたプログラムを見て、その手法を学び応用はさせて頂いてますが、
一から作成するほどの能力は残念ですがまだないのです。

>希望している色なのではないでしょうか。
色を利用してマウスの位置が、背景なのか?、棒なのか?、を知りたいのです。

>質問毎にスレを立てればスレの解決への時間が短くてすみますが
そうですね、今後は複数質問にならないように気をつけます。

編集 削除
shu  2012-10-28 22:36:32  No: 147922  IP: [192.*.*.*]

> 背景なのか?、棒なのか?、を知りたいのです。
提示コードの
htrResult.ChartElementType 
で判断出来ます。
棒 => DataPoint
背景 => PlottingArea, AxisLabels, Nothing
軸 => Axis
グリッド => Gridlines
でどうでしょう?

編集 削除
しょう  2012-10-29 11:17:47  No: 147923  IP: [192.*.*.*]

shuさん、すみません。

htrResult.ChartElementType で判断出来ることは分かりますが、
今の能力ではそれから先が進めません(^^;

編集 削除
shu  2012-11-04 08:54:18  No: 147924  IP: [192.*.*.*]

> 今の能力ではそれから先が進めません(^^;
もっと基礎を勉強してみてはどうでしょう?あなたの
能力以上のこのソリューションはそれからでないとほとんど
の内容を聞かないと解決出来ないような気がします。

編集 削除
しょう  2012-11-04 15:45:51  No: 147925  IP: [192.*.*.*]

shuさん、
確かにそうかもしれません。
あれこれ欲張り過ぎました。
いろいろ教えて頂き本当にありがとうございました。

編集 削除