【问题标题】:Oxyplot to interrupt DateTimeAxis serieOxyplot 中断 DateTimeAxis 系列
【发布时间】:2016-06-14 20:01:46
【问题描述】:

我怎样才能在某个时刻打断意甲,然后从稍后的时刻继续? 例如,我将日期时间轴设为 Y,然后数据存在直到某个日期,然后没有数据,然后我又有数据。我想要的不是插入数据被连续中断的最后一个数据点,但我想停止绘图并在数据仍然存在时继续。

在上面的屏幕截图中,线性斜率是由于缺少数据。我想要的是避免这条线。我仍然希望所有中断的数据都在同一个系列中。

更新:

foreach (var dp in readings)
{
    data.Add(new DateValue {
        Date = dp.Date,
        Temperature = dp.Data.Where(y => y.Cell == c.Number).
                              Select(x => Convert.ToDouble(x.GetType().GetProperty(sensor.PropertyName).GetValue(x, null))).
                              FirstOrDefault() });

    if (lastDate != null && (dp.Date - lastDate).TotalMinutes > 10)
    {
        data.Add(new DateValue
        {
            Date = dp.Date,
            Temperature = double.NaN
        });
        Console.WriteLine("break");
    }

    lastDate = dp.Date;
}
mode1Data.Add(c.Number, data);

【问题讨论】:

  • 什么算作数据不存在?这意味着如果您的日期时间是 12/12/2012 10:00:00,而下一个值是 12/12/2012 10:30:00,那么这两个时间之间不存在数据,但我假设那不是你是什​​么意思。换句话说,两点之间的时间有多长算数据不存在?
  • 每 5 分钟采样一次数据。如果间隔大于这个值,则认为是中断
  • 你在使用lineeries吗?
  • 是的先生,LineSeries 是我正在使用的。

标签: c# oxyplot


【解决方案1】:

添加DataPoint.Undefined,会在行中创建一个中断。您还可以设置“虚线”的样式(取自 oxyplot LineSeriesExample.cs 的代码示例):

无数据绑定:

 var model = new PlotModel("Broken line");

 var s1 = new LineSeries
     {
         // If you want to style
         //BrokenLineColor = OxyColors.Gray,
         //BrokenLineThickness = 1,
         //BrokenLineStyle = LineStyle.Dash
         BrokenLineStyle = LineStyle.None
     };

 s1.Points.Add(new DataPoint(0, 26));
 s1.Points.Add(new DataPoint(10, 30));
 s1.Points.Add(DataPoint.Undefined);
 s1.Points.Add(new DataPoint(10, 25));
 s1.Points.Add(new DataPoint(20, 26));
 s1.Points.Add(new DataPoint(25, 36));
 s1.Points.Add(new DataPoint(30, 40));
 s1.Points.Add(DataPoint.Undefined);
 s1.Points.Add(new DataPoint(30, 20));
 s1.Points.Add(new DataPoint(40, 10));
 model.Series.Add(s1);

有数据绑定:

xaml:

<oxy:Plot x:Name="plot1" Title="Binding ItemsSource" Subtitle="{Binding Subtitle}">
  <oxy:Plot.Series>
    <oxy:LineSeries Title="Maximum" DataFieldX="Time" DataFieldY="Maximum" Color="Red" LineStyle="Solid" StrokeThickness="2" ItemsSource="{Binding Measurements}"/>
  </oxy:Plot.Series>
</oxy:Plot>

型号:

Measurements = new Collection<Measurement>();
int N = 500;
Subtitle = "N = " + N;

var r = new Random(385);
double dy = 0;
double y = 0;
for (int i = 0; i < N; i++)
{
    dy += r.NextDouble() * 2 - 1;
    y += dy;

    // Create a line break
    if (i % 10 == 0)
    {
        Measurements.Add(new Measurement
        {
            Time = double.NaN, // For DateTime put DateTime.MinValue
            Value = double.NaN
        });   
    }
    else
    {
        Measurements.Add(new Measurement
        {
            Time = 2.5 * i / (N - 1),
            Value = y / (N - 1),
        });   
    }
}

结果:

【讨论】:

  • 这正是我想要的,但如果我不使用DataPoint 类,我怎么能拥有它呢?相反,我在系列中使用我自己的对象,在 ItemSource 中指定,然后是 DataFieldXDataFieldY
  • 我没试过,但是 DataPoint.Undefined 有 double.NaN 作为 x, y。尝试将 DataFieldX 和 DataFieldY 设置为 double.NaN。
  • 问题是我不能为日期时间轴添加 double.NaN。我尝试将值添加为 NaN,但没有成功。
  • Time = double.NaN 是我不能做的,因为我有 DateTime 变量...我还用一些代码更新了我的问题。
  • 尝试将其设置为 DateTime.MinValue
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多