将数据绘制到WinForms图表XY(时间,整数)

时间:2018-07-08 11:05:34

标签: c# winforms charts

我是WinForms的新手,并希望在学习如何绘制数据点方面寻求帮助。

我有一个图,并使用以下代码对其进行了初始化:

public Form1()
{
    InitializeComponent();
    var _chartArea = chrtAdamHistory.ChartAreas[0];
    var _chartSeries = chrtAdamHistory.Series[0];
    var _currDateTime = DateTime.Now;

    //Set X Axis Properties
    _chartArea.AxisX.LabelStyle.Format = "HH:mm";
    _chartArea.AxisX.IntervalType = DateTimeIntervalType.Minutes;
    _chartArea.AxisX.Interval = 30;
    _chartArea.AxisX.Minimum = 
            new DateTime(_currDateTime.Year, _currDateTime.Month, _currDateTime.Day, 0, 0, 0).ToOADate();
    _chartArea.AxisX.Maximum = 
            new DateTime(_currDateTime.Year, _currDateTime.Month, _currDateTime.Day, _currDateTime.Hour, 
            _currDateTime.Minute, _currDateTime.Second).ToOADate();

    //Set Y Axis Properties
    _chartArea.AxisY.Minimum = 0;
    _chartArea.AxisY.Maximum = 500;
    _chartArea.AxisY.Interval = 50;

    //Set Series Properties
    _chartSeries.ChartType = SeriesChartType.Spline;
    _chartSeries.XValueType = ChartValueType.Time;
    _chartSeries.YValueType = ChartValueType.Int32;
}

图表将如下所示:

enter image description here

现在这就是我遇到的问题。我不知道当X AxisTime时如何添加数据点。有人可以告诉我如何或将我指向正确的方向吗?

3 个答案:

答案 0 :(得分:1)

默认情况下,Chart中的所有属性都设置为Auto,这使工作变得更轻松。但是要获得完全控制,必须将其中一些设置为实际需要的值。

您对轴的MinimunMaximum值进行了此操作,正如人们所看到的那样,它可以正常工作。但是后果之一是,现在您的数据必须落入您要显示的范围

这对于数字很简单,因为Chart中的所有值在内部都是double。但是,在使用DateDateTime等工具时,事情可能会变得棘手。

虽然可以直接添加DateTime值,但它们仍将在内部转换为double。您已选择通过double函数转换DateTime值,将它们实际添加为ToOADate。但是您还告诉图表,x值为Time。这是令人困惑的,因为C#中没有Time类型。 (而不仅仅是我们,更重要的是Chart控件会引起混乱;-)

要立即添加DataPoints,您需要执行以下任一操作:

  • 对x值使用相同的转换,否则它们将不属于图表范围。

下面是添加一些数据点的示例。

chrtAdamHistory.Series[0].Points.AddXY(timeValue.AddHours(-2).ToOADate(), intValue);   
chrtAdamHistory.Series[0].Points.AddXY(timeValue.AddHours(-1).ToOADate(), intValue + 12);
chrtAdamHistory.Series[0].Points.AddXY(timeValue.ToOADate(), intValue + 17);
  • 或者您可以直接添加DateTime的值,而无需进行ToOADate转换,只要且仅当您告诉图表或者期望那些Auto上工作。

示例:

 _chartSeries.XValueType = ChartValueType.Auto;      // either that or..
 _chartSeries.XValueType = ChartValueType.DateTime;  // ..that will work 

要了解DateTime值的内部范围,请仔细研究一下DateTime.Now.ToOADate() btw产生的较大倍数; atm是:43291.412605081

答案 1 :(得分:0)

您尝试过这样的事情吗?

DateTime timeValue = DateTime.Now; // for example
Int32 intValue = 324;

chrtAdamHistory.Series[0].Points.AddXY(timeValue, int32value);

答案 2 :(得分:-1)

您必须设置值。
您实际尝试了什么?也许错过了无效?

    for (int i=0; i < 1440; i++)
    {
        _chartSeries.Points.AddXY(i, f(i));
    }
    chrtAdamHistory.Invalidate();