tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Chartオブジェクトで特定のシリーズを消す方法
投稿日: 2016/03/15(Tue) 11:53
投稿者食う寝る走る
開発環境
 OS:Windows7(32bit)プロフェッショナル
 IDE:VS2015 コミュニティ(VB.net)


測定器から取りだした波形データ2本をチャート化して波形の始点、終点を選択するコードを考えております。


ChartオブジェクトでX-Y散布図(series1、series2)を作成し、その後、
プロットしたポイントの上でマウスをクリックするとカーソル(series3、series4)を表示(打点)して
また別のポイントをクリックすると、先ほどのカーソルを消して新たな場所に表示(打点)するようにしたいのですが可能でしょうか?
(VB6の時はPictureBoxオブジェクト上にpset打点しカーソルはShapeを移動させておりました。)


series1、series2を判別して、カーソル(series3、series4)を描くことはできますが、
消すことができません。カーソル(series3、series4)を消してまたマウスクリックで書き直すには?

Chart1.Series.Clear() で全削除でX-Y散布図(series1、series2)から書き直してしまえば可能なのでしょうが特定のシリーズのみを消すことはできるのでしょうか?


以下コードを示します。

フォーム上にChart1を貼り付けて実行してください。

よろしくお願いいたします。

'---------------------------------------------------------------------------------------------------
Imports System.Windows.Forms.DataVisualization.Charting

Public Class Form1
    Public xval() As Double
    Public yval() As Double
    Public yval2() As Double

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        ' x値の配列を宣言
        xval = {0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0}
        ' y値の配列を宣言
        yval = {8.3, 8.2, 10, 1.5, 1.8, 5.2, 2.5, 0, 5.0, 7.7, 1.0, 7.5, 8, 7, 0.9, 2.5, 2.8, 5.5, 4.6, 3.1, 10}
        ' y2値の配列を宣言
        yval2 = {50, 12, 30, 40, 26, 30, 0, 30, 28, 20, 40, 30, 50, 35, 40, 30, 28, 40, 10, 30, 50}

        'デフォルトのグラフを抹消
        Chart1.Series.Clear()

        'データ列”series”を宣言する。
        Dim series1 As New Series()
        Dim series2 As New Series()

        Dim n As Integer = 0
        'For-Nextで配列の値をデータ列series”に読み込む
        For Each i In xval
            series1.Points.AddXY(i, yval(n))
            series2.Points.AddXY(i, yval2(n))
            n = n + 1
        Next

        'chart表示
        Chart1.Series.Add(series1)
        Chart1.Series.Add(series2)

        'チャートエリア内のX領域をカーソルで取得可能に設定(ズームイン)
        'Chart1.ChartAreas(0).CursorX.IsUserEnabled = True 'チャートX領域の選択
        'Chart1.ChartAreas(0).CursorX.IsUserSelectionEnabled = True 'Xカーソル表示

        With series1
            .MarkerSize = 10
            .MarkerStyle = MarkerStyle.Circle
            .MarkerBorderColor = Color.Black
            .MarkerBorderWidth = 0.1
            .MarkerColor = Color.Blue
            .ChartType = SeriesChartType.Point
            .YAxisType = AxisType.Primary '第1軸
        End With


        With series2
            .MarkerSize = 10
            .MarkerStyle = MarkerStyle.Circle
            .MarkerBorderColor = Color.Black
            .MarkerBorderWidth = 0.1
            .MarkerColor = Color.Red
            .ChartType = SeriesChartType.Point
            .YAxisType = AxisType.Secondary '第2軸
        End With


        'チャートのY軸をシリーズ1,2のMIN〜MAX範囲とする
        With Chart1.ChartAreas(0)
            With .AxisY
                .Minimum = yval.Min
                .Maximum = yval.Max
            End With

            With .AxisY2
                .Minimum = yval2.Min
                .Maximum = yval2.Max
            End With
        End With

    End Sub

    Private Sub Chart1_MouseClick(sender As Object, e As MouseEventArgs) Handles Chart1.MouseClick
        Dim frgElement As Boolean 'クリック毎のフラグ
        Dim SeriesNo As Integer 'シリーズ要素

        frgElement = Not frgElement   'クリック毎にフラグを設定

        'クリックした位置の要素を取得
        Dim htrResult As HitTestResult = Chart1.HitTest(e.X, e.Y)
        If htrResult.ChartElementType = ChartElementType.DataPoint And frgElement = True 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
                    SeriesNo = j 'シリーズ要素
                    frgElement = Not frgElement
                    Exit For
                End If
            Next

            'クリックした場所の取得
            Start_Line(SeriesNo, i) 'ライン描画へ(シリーズ要素、X軸)


        End If
    End Sub

    Private Sub Start_Line(sr As Double, st As Double)

        Select Case sr 'シリーズ判定
            Case 0 'シリーズ1のポイントにマウスを当てた時

                Dim series3 As New Series()
                With series3
                    .MarkerSize = 1
                    .MarkerStyle = MarkerStyle.Square

                    .MarkerBorderColor = Color.Black
                    .MarkerBorderWidth = 0.01
                    .MarkerColor = Color.Blue
                    .ChartType = SeriesChartType.Point
                End With

                'ライン引き
                For n = Chart1.ChartAreas(0).AxisY.Minimum To Chart1.ChartAreas(0).AxisY.Maximum Step 0.001
                    series3.Points.AddXY(xval(st), n)
                Next n
                Chart1.Series.Add(series3)

                'シリーズ3を引くとチャートが自動で変わるので、チャートのY軸をシリーズ1,2のMIN〜MAX範囲とする
                With Chart1.ChartAreas(0)
                    With .AxisY
                        .Minimum = yval.Min
                        .Maximum = yval.Max
                    End With

                    With .AxisY2
                        .Minimum = yval2.Min
                        .Maximum = yval2.Max
                    End With
                End With

            Case 1 'シリーズ2のポイントにマウスを当てた時
                Dim series4 As New Series()
                With series4
                    .MarkerSize = 1
                    .MarkerStyle = MarkerStyle.Square

                    .MarkerBorderColor = Color.Black
                    .MarkerBorderWidth = 0.01
                    .MarkerColor = Color.Red
                    .ChartType = SeriesChartType.Point
                End With

                'ライン引き
                For n = Chart1.ChartAreas(0).AxisY.Minimum To Chart1.ChartAreas(0).AxisY.Maximum Step 0.001
                    series4.Points.AddXY(xval(st), n)
                Next n
                Chart1.Series.Add(series4)

                'シリーズ4を引くとチャートが自動で変わるので、チャートのY軸をシリーズ1,2のMIN〜MAX範囲とする
                With Chart1.ChartAreas(0)
                    With .AxisY
                        .Minimum = yval.Min
                        .Maximum = yval.Max
                    End With

                    With .AxisY2
                        .Minimum = yval2.Min
                        .Maximum = yval2.Max
                    End With
                End With

        End Select

    End Sub

End Class

'---------------------------------------------------------------------------------------------------

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。