チャートのデータ シリーズを管理するクラスを開発しています。ただし、新しいシリーズを追加すると、最初の dataPoint の XValue が 0 の場合、代わりに XValue が 1 としてプロットに表示されます。さらに dataPoint を追加すると、自動的に修正されるようです。以下のコードを使用すると、コンストラクターが最初に (明らかに) 呼び出され、次に Initialize ("Series1",0,0 のようなデータを使用) が呼び出され、後で AddPoint を呼び出すことができます。誰が何が起こっているのか知っていますか?
編集:私が見つけたものから、これはシリーズにデータポイントが1つしかなく、そのデータポイントのxValueが0の場合にいつでも発生します。シリーズは、ゼロ以外のデータポイントが1つ(またはそれ以上)になるまで正しく動作しませんxValues が追加されます。私の回避策は、追加するデータ ポイントの xValue が 0 の場合、代わりにその xValue を非常に小さくすることです (1x10^-150)。動作しているように見えますが、これはまだ私の本の奇妙なバグです。私もそれに関する情報を見つけることができませんでした。
Public Sub New(ByVal chartObj As Chart)
'Init m_chart
m_chart = chartObj
m_chart.BackColor = Color.Gainsboro
'Init Legend
m_legend = New Legend("Legend")
m_legend.Docking = Docking.Bottom
m_chart.Legends.Add(m_legend)
'Init m_chartArea
m_chartArea = New ChartArea("Default")
m_chartArea.BackColor = Color.Black
m_chartArea.AxisX.LabelStyle.Format = "{0:0.00}"
setXLimits(-10, 10)
setYLimits(-0.5, 0.5)
m_chartArea.AxisX.Title = "Position (mm)"
m_chartArea.AxisX.TitleFont = New Font("Arial", 10, FontStyle.Regular)
m_chartArea.AxisY.Title = "Peak-To-Peak (Volts)"
m_chartArea.AxisY.TitleFont = New Font("Arial", 10, FontStyle.Regular)
m_chartArea.AxisX.MajorGrid.LineDashStyle = ChartDashStyle.Dash
m_chartArea.AxisX.MajorGrid.LineColor = Color.DarkGreen
m_chartArea.AxisY.MajorGrid.LineDashStyle = ChartDashStyle.Dash
m_chartArea.AxisY.MajorGrid.LineColor = Color.DarkGreen
m_chart.ChartAreas.Add(m_chartArea)
'Init m_dataSeries
m_dataSeries = New List(Of Series)
'Init m_markerSeries
m_markerSeries = New Series("Peaking Markers")
m_markerSeries.ChartType = SeriesChartType.Point
m_markerSeries.MarkerColor = Color.Red
m_markerSeries.MarkerStyle = MarkerStyle.Triangle
m_markerSeries.MarkerSize = 10
m_chart.Series.Add(m_markerSeries)
'Init m_title
m_title = New Title("Plots")
m_title.Font = New Font("Arial", 20, FontStyle.Regular)
m_chart.Titles.Add(m_title)
End Sub
Public Sub Initialize(ByVal Legend As String, ByVal xVal As Double, ByVal yVal As Double)
Dim temp As New Series(Legend)
temp.ChartType = SeriesChartType.Line
temp.Points.Clear()
If nextAxis = "X" Then
temp.Color = xColor
nextAxis = "Y"
Else
temp.Color = yColor
nextAxis = "X"
End If
temp.MarkerStyle = MarkerStyle.Circle
m_dataSeries.Add(temp)
m_chart.Series.Add(temp)
AddPoint(xVal, yVal)
End Sub
Public Sub AddPoint(ByVal x As Double, ByVal y As Double)
If m_chart.InvokeRequired Then
m_chart.Invoke(New Action(Of Double, Double)(AddressOf AddPoint), x, y)
Else
Dim temp As New DataPoint(x, y)
m_dataSeries.Item(m_dataSeries.Count - 1).Points.Add(temp)
End If
End Sub