タイトル : 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 '--------------------------------------------------------------------------------------------------- |