タイトル | : Re: Chartオブジェクトで特定のシリーズを消す方法(半解決?) |
記事No | : 11642 |
投稿日 | : 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
'-------------------------------------------------------------------------------------------------
|