【问题标题】:Plotting Data to WinForms Chart XY(Time, Int)将数据绘制到 WinForms 图表 XY(Time, Int)
【发布时间】:2018-07-10 20:24:30
【问题描述】:

我是 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;
}

图表将如下所示:

现在这就是我卡住的地方。当X Axis 是Time 时,我不知道如何添加数据点。谁能告诉我如何或指出正确的方向?

【问题讨论】:

  • 由于最小值和最大值是作为双精度给出的,因此您还需要从日期时间计算双精度:chrtAdamHistory.Series[0].Points.AddXY(timeValue.ToOADate(), intValue);
  • 请注意,这将位于图表的最末端,并且不会真正显示为样条线,至少需要两个点!请参阅我对卡米尔回答的其他评论!
  • 我认为每个人都应该密切关注第一个半小时并回复任何 cmets 或答案。这不是网站的要求,而是寻求帮助的人的基本礼貌。不过,我倾向于在至少一天过去之前投反对票。 - 但也许这只是我,谁甚至不确定你的绰号有多礼貌,这让我想起了不愉快的画面。 (开个玩笑)
  • 我强烈反对一般条款和网站规则。这直接来自帮助页面: 发布问题并回复反馈 发布后,将问题在浏览器中打开一会儿,看看是否有人参与。如果您错过了一条明显的信息,请准备好通过编辑您的问题以包含它来做出回应。如果有人发布答案,请准备好尝试并提供反馈! 但是,耐心也是必需的行为。所以我会妥协并删除一条评论,但不会删除其他评论;-)
  • @TaW 抱歉,如果我看起来不礼貌,我昨晚在晚餐前发布了这个,并想“我会给它一些时间,明天上班再回来看看。”无论如何,谢谢你的建议,我回家后会尝试这个并在这里发布更新。

标签: c# winforms charts


【解决方案1】:

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

您为坐标轴的 Minimun&Maximum 值做到了这一点,正如您所看到的,它工作正常。但其中一个后果是,现在您的数据必须落入您为显示设置的范围。

这对于数字来说很简单,因为Chart 中的所有值在内部都是double。但是当使用Date、DateTime 等时,事情会变得很棘手。

虽然可以直接添加DateTime 值,但它们仍将在内部转换为double。您已选择通过ToOADate 函数转换DateTime 值,将它们实际添加为double。但是您还告诉图表,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 产生的大双精度值是有启发性的;自动取款机是:43291.412605081。

【讨论】:

    【解决方案2】:

    你尝试过这样的事情吗?

    DateTime timeValue = DateTime.Now; // for example
    Int32 intValue = 324;
    
    chrtAdamHistory.Series[0].Points.AddXY(timeValue, int32value);
    

    【讨论】:

    • 由于图表类型是样条曲线,因此添加另一个点会有很大帮助。也使它比最大值早一点;-) - 由于最小值和最大值是作为双精度给出的,因此您还需要从日期时间计算双精度:chrtAdamHistory.Series[0].Points.AddXY(timeValue.ToOADate(), intValue);chrtAdamHistory.Series[0].Points.AddXY(timeValue.AddHours(-1).ToOADate(), intValue);
    【解决方案3】:

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

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

    【讨论】:

    • 我缺少的是@TaWs 评论中的ToOADate()。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多