tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルChartオブジェクトで特定のシリーズを消す方法
記事No11641
投稿日: 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

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

[ツリー表示へ]
タイトルRe: Chartオブジェクトで特定のシリーズを消す方法(半解決?)
記事No11642
投稿日: 2016/03/15(Tue) 16:21
投稿者食う寝る走る
完全ではありませんが、
ライン引きのステートメントの後に、以下を入れることで自己解決しそうです。

                'シリーズ3以上になったらシリーズを非表示にする(1,2はデータ)
                If Chart1.Series.Count >= 3 Then
                    Chart1.Series(Chart1.Series.Count - 1).Enabled = False


                End If

                Chart1.Series.Add(series3)


理想は、
series1、series2はデータですので、固定として、始点、終点カーソルは、series3、series4 として series3、series4を消したり、書いたりを繰り返したいんですが、series3、4,5,6・・・と増えていきます。


仕方ないので、その都度シリーズ数を数えて シリーズが3以上になったら
Chart1.Series(Chart1.Series.Count - 1).Enabled = False
で消してから

Chart1.Series.Add(series3)

でシリーズ追加すると、チャート上からカーソルが消えて、再度、書き直しが出来たみたいな動きになります。

Series1,2の凡例の次の3番目に凡例が表示されます。
理想は
---------------------------
1番目:データ1
2番目:データ2
3番目:
---------------------------



理想は
---------------------------
1番目:データ1
2番目:データ2
3番目:始点(カーソル)
4番目:終点(カーソル)
---------------------------
みたく、並び順を固定化出来ればいいのですが、こちらを考えてみます。



'以下、現在の 到達コードです。
'---------------------------------------------------------------------------------------------------
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

            .AxisY2.Enabled = AxisEnabled.True
        End With


        With Chart1
            .Series(0).LegendText = "DMM計測 抵抗値(kΩ)"
            .Series(1).LegendText = "換算温度(℃)"
        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)
        Dim series3 As New Series
        Dim series4 As New Series

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

                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

                'シリーズ3以上になったらシリーズを非表示にする(1,2はデータ)
                If Chart1.Series.Count >= 3 Then
                    Chart1.Series(Chart1.Series.Count - 1).Enabled = False

                End If

                Chart1.Series.Add(series3)
                Chart1.Series(Chart1.Series.Count - 1).LegendText = "始点"


                'シリーズ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のポイントにマウスを当てた時
                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

                'シリーズ3以上になったらシリーズを非表示にする(1,2はデータ)
                If Chart1.Series.Count >= 4 Then
                    Chart1.Series(Chart1.Series.Count - 1).Enabled = False

                End If
                Chart1.Series.Add(series4)
                Chart1.Series(Chart1.Series.Count - 1).LegendText = "終点"


                'シリーズ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
                    .AxisY2.Enabled = AxisEnabled.True
                End With

        End Select


    End Sub

End Class

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

[ツリー表示へ]
タイトルRe^2: Chartオブジェクトで特定のシリーズを消す方法(半解決?)
記事No11643
投稿日: 2016/03/16(Wed) 09:46
投稿者YuO
ざっとマニュアルを見た限りですが,SeriesのRemoveまたはRemoveAtメソッドではだめだったのでしょうか。
通常のコレクションであれば,これらで削除ができるのですが。

[ツリー表示へ]
タイトルRe^2: Chartオブジェクトで特定のシリーズを消す方法(半解決?)
記事No11644
投稿日: 2016/03/16(Wed) 16:34
投稿者shu
series3,4をLoadの中で作成して
Enabledを切り替えればよいかと思います。


    Public xval() As Double
    Public yval() As Double
    Public yval2() As Double
    Private series3 As Series
    Private series4 As Series

    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 = 1
            .MarkerColor = Color.Blue
            .ChartType = SeriesChartType.Point
            .YAxisType = AxisType.Primary '第1軸
        End With


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

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

            .MarkerBorderColor = Color.Black
            .MarkerBorderWidth = 1
            .MarkerColor = Color.Blue
            .ChartType = SeriesChartType.Point
            .LegendText = "始点"
            .Enabled = False
        End With
        Chart1.Series.Add(series3)

        series4 = New Series()
        With series4
            .MarkerSize = 1
            .MarkerStyle = MarkerStyle.Square

            .MarkerBorderColor = Color.Black
            .MarkerBorderWidth = 1
            .MarkerColor = Color.Red
            .ChartType = SeriesChartType.Point
            .LegendText = "終点"
            .Enabled = False
        End With
        Chart1.Series.Add(series4)


        'チャートの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

            .AxisY2.Enabled = AxisEnabled.True
        End With


        With Chart1
            .Series(0).LegendText = "DMM計測 抵抗値(kΩ)"
            .Series(1).LegendText = "換算温度(℃)"
        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 Integer)

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

                series3.Points.Clear()
                series3.Enabled = True
                series4.Enabled = False
                series3.LegendText = "始点"

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

                'シリーズ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のポイントにマウスを当てた時
                series4.Points.Clear()
                series3.Enabled = False
                series4.Enabled = True

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

                'シリーズ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
                    .AxisY2.Enabled = AxisEnabled.True
                End With

        End Select


    End Sub

[ツリー表示へ]
タイトルRe^2: Chartオブジェクトで特定のシリーズを消す方法(解決)
記事No11646
投稿日: 2016/03/30(Wed) 19:30
投稿者食う寝る走る
プログラム作成作業からから離れて別内容の業務をしており、確認遅れてしまい申し訳ありませんでした。
プログラム作成関しては、本日から再開始めております。コードの見直しをしております。
先ほど、希望の動作がするコードが出来あがりました。

>YuO さま
Removeは上手く動きませんでしたが、RemoveAtで指定してあげると削除できる事を確認いたしました。

>shu さま
ご指摘のように、
行き着くところは、.Points.Clear()でシリーズを全クリア Enabled = True で有効化に行きあたりました。
私の作成したコードでは、カーソルの再作成が若干重いような感じです。


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



以下、コードを貼り付けておきます。
Chartを1つ と Checkboxを2個貼り付けて下さい。

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

Public Class Form1
    Public xval() As Double '測定時間(格納配列)
    Public yval() As Double 'DMMからの抵抗値(格納配列)
    Public yval2() As Double '温度(格納配列)
    Dim series1 As New Series() '抵抗値シリーズ
    Dim series2 As New Series() '温度シリーズ
    Dim series3 As New Series() '始点カーソル
    Dim series4 As New Series() '終点カーソル

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

        CheckBox1.Appearance = Appearance.Button 'トグルボタン(始点)
        CheckBox1.Text = "始点"
        CheckBox2.Appearance = Appearance.Button 'トグルボタン(終点)
        CheckBox2.Text = "終点"

        ' 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()

        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 = 1
            .MarkerColor = Color.Blue
            .ChartType = SeriesChartType.Point
            .YAxisType = AxisType.Primary '第1軸
        End With


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

        series3 = New Series() '始点カーソル
        With series3
            .MarkerSize = 1
            .MarkerStyle = MarkerStyle.Square

            .MarkerBorderColor = Color.DarkOliveGreen
            .MarkerBorderWidth = 1
            .MarkerColor = Color.Blue
            .ChartType = SeriesChartType.Point
            .LegendText = "始点"
            .Enabled = False
        End With
        Chart1.Series.Add(series3) '表示

        series4 = New Series() '終点カーソル
        With series4
            .MarkerSize = 1
            .MarkerStyle = MarkerStyle.Square

            .MarkerBorderColor = Color.OrangeRed
            .MarkerBorderWidth = 1
            .MarkerColor = Color.Red
            .ChartType = SeriesChartType.Point
            .LegendText = "終点"
            .Enabled = False
        End With
        Chart1.Series.Add(series4) '表示


        'チャートの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

            .AxisY2.Enabled = AxisEnabled.True '第二軸を有効
        End With


        With Chart1
            .Series(0).LegendText = "DMM計測 抵抗値(kΩ)"
            .Series(1).LegendText = "換算温度(℃)"
        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 Integer)

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

                If CheckBox1.Checked = True Then '始点
                    With series3
                        .Points.Clear()
                        .Enabled = True
                        .LegendText = "始点"

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

                    'シリーズ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
                End If

                If CheckBox2.Checked = True Then '終点
                    With series4
                        .Points.Clear()
                        .Enabled = True
                        .LegendText = "終点"

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

                    'シリーズ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
                End If


            Case 1 'シリーズ2のポイントにマウスを当てた時

                If CheckBox1.Checked = True Then '始点
                    With series3
                        .Points.Clear()
                        .Enabled = True
                        .LegendText = "始点"

                        'ライン引き
                        For n = Chart1.ChartAreas(0).AxisY2.Minimum To Chart1.ChartAreas(0).AxisY2.Maximum Step 0.001
                            .Points.AddXY(xval(st), n)
                        Next n
                    End With

                    'シリーズ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
                        .AxisY2.Enabled = AxisEnabled.True '第二軸を有効
                    End With
                End If


                If CheckBox2.Checked = True Then '終点
                    With series4
                        .Points.Clear()
                        .Enabled = True
                        .LegendText = "終点"

                        'ライン引き
                        For n = Chart1.ChartAreas(0).AxisY2.Minimum To Chart1.ChartAreas(0).AxisY2.Maximum Step 0.001
                            .Points.AddXY(xval(st), n)
                        Next n
                    End With

                    'シリーズ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
                        .AxisY2.Enabled = AxisEnabled.True '第二軸を有効
                    End With
                End If

        End Select

    End Sub

    Private Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox1.CheckedChanged
        '始点のトグルが押されている場合
        If CheckBox1.Checked = True Then
            CheckBox2.Checked = False
        End If
    End Sub

    Private Sub CheckBox2_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox2.CheckedChanged
        '終点のトグルが押されている場合
        If CheckBox2.Checked = True Then
            CheckBox1.Checked = False
        End If
    End Sub
End Class

[ツリー表示へ]