1

初めて C# Charting API を使用しようとしていますが、いくつか問題があります。-10 から 10 までの x 軸と -10 から 10 までの y 軸を持つグラフにプロットする 2 つのハードウェア信号があります。これには SeriesChartType.Point チャート タイプを使用しています。 1 つのケースを除いて、コードは期待どおりに動作します。AddXY 関数を使用してグラフにポイントを追加しています。実際には、値はハードウェアから取得されますが、この例では値をハードコーディングしただけです。

私が抱えている問題は、プロットされる最初のポイントの x 軸の値が 0 の場合、チャートは 0 を無視し、プロットされる後続のポイントごとに x 軸の値を 1 ずつ増やすように見えることです。

私の問題を示すために、次の簡単な例を作成しました。x 軸の値を 0 に、y 軸の値を 2 にハードコーディングしました。ポイントをプロットすると、最初のポイントが (1,2) にプロットされ、次のポイントが (2,2) にプロットされ、次に (3,2) にプロットされます。 、(4,2)、そして最後に (5,2)。

これは、プロットされる最初のポイントの x 軸の値が 0 の場合にのみ発生することに注意してください。他の値がある場合、チャートは永久に正しく機能します。何が原因なのか途方に暮れています。

次のコード例を参照してください。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        ConfigureChartSettings();

        AddFakeData();
    }

    private void AddFakeData()
    {
        this.chart1.Series["Series1"].Points.AddXY(0, 2); //Gets plotted at (1,2)
        this.chart1.Series["Series1"].Points.AddXY(0, 2); //Gets plotted at (2,2)
        this.chart1.Series["Series1"].Points.AddXY(0, 2); //Gets plotted at (3,2)
        this.chart1.Series["Series1"].Points.AddXY(0, 2); //Gets plotted at (4,2)
        this.chart1.Series["Series1"].Points.AddXY(0, 2); //Gets plotted at (5,2)
    }

    private void ConfigureChartSettings()
    {
        //Set point chart type
        this.chart1.Series["Series1"].ChartType = SeriesChartType.Point;

        //Set the market size
        this.chart1.Series["Series1"].MarkerSize = 5;

        //Set the marker shape to a circle
        this.chart1.Series["Series1"].MarkerStyle = MarkerStyle.Circle;

        //X and Y values are both between -10 and 10 so set the x and y axes accordingly
        this.chart1.ChartAreas["ChartArea1"].AxisX.Minimum = -10.0;
        this.chart1.ChartAreas["ChartArea1"].AxisX.Maximum = 10.0;
        this.chart1.ChartAreas["ChartArea1"].AxisY.Minimum = -10.0;
        this.chart1.ChartAreas["ChartArea1"].AxisY.Maximum = 10.0;

        //Set the titles of the X and Y axes
        this.chart1.ChartAreas["ChartArea1"].AxisX.Title = "XSignalName";
        this.chart1.ChartAreas["ChartArea1"].AxisY.Title = "YSignalName";

        //Set the Intervals of the X and Y axes, 
        this.chart1.ChartAreas["ChartArea1"].AxisX.Interval = 5;
        this.chart1.ChartAreas["ChartArea1"].AxisY.Interval = 5;

        //Set the MajorGrid interval to 5.
        this.chart1.ChartAreas["ChartArea1"].AxisX.MajorGrid.Interval = 5;
        this.chart1.ChartAreas["ChartArea1"].AxisY.MajorGrid.Interval = 5;

        //Set the MinorGrid interval to 1.
        this.chart1.ChartAreas["ChartArea1"].AxisX.MinorGrid.Interval = 1;
        this.chart1.ChartAreas["ChartArea1"].AxisY.MinorGrid.Interval = 1;

        //Set the MinorGrid style to Dot so that it is less obstructive.
        this.chart1.ChartAreas["ChartArea1"].AxisX.MinorGrid.LineDashStyle = ChartDashStyle.Dot;
        this.chart1.ChartAreas["ChartArea1"].AxisY.MinorGrid.LineDashStyle = ChartDashStyle.Dot;

        //Enable the minor grids.
        this.chart1.ChartAreas["ChartArea1"].AxisX.MinorGrid.Enabled = true;
        this.chart1.ChartAreas["ChartArea1"].AxisY.MinorGrid.Enabled = true;
    }
}

なぜこれが起こるのかを理解しようとして、私はすでに多くの時間を無駄にしました.それは信じられないほど単純なことだと確信していますが、答えを見つけることができないようです. どんな助けでも大歓迎です。

4

1 に答える 1

1

この場合、MsChart は役に立ちすぎています。同一X == 0のデータポイントを挿入したことを検出し、ポイントインデックスを X 値として使用するように自動的に切り替えます。X が 0 の場合にのみ発生することに注意してください。

で余分な空のポイントを追加することで修正できますX != 0。したがって、これをデータ入力の最初に追加すると、必要なプロットが得られます。

// insert an empty point with X != 0
this.chart1.Series["Series1"].Points.AddXY(10, 10);
this.chart1.Series["Series1"].Points[0].IsEmpty = true;
// add your points as normal
this.chart1.Series["Series1"].Points.AddXY(0, 2);
this.chart1.Series["Series1"].Points.AddXY(0, 2);
this.chart1.Series["Series1"].Points.AddXY(0, 2);
this.chart1.Series["Series1"].Points.AddXY(0, 2);
this.chart1.Series["Series1"].Points.AddXY(0, 2);
于 2013-02-27T10:46:37.680 に答える