2012-04-19 53 views
1

在下面我的问题"ZedGraph custom graph"我有DATAS的每一秒插入图表,现在我有其他问题:ZedGraph顺利,图表线移动Y2Axis

  1. 如何顺利与下移Y2Axis(DateTime类型)图表线和图表中总显示只有最后30分钟?

  2. 如何格式化Y2Axis标签“HH:mm”以获得10:05,10:10,10:15,...,10:30?

感谢您的帮助!

UPD1: 谢谢kmp!我尝试你的代码 - 它的好,但问题:当我开始我看到这一点: enter image description here 当几分钟后,我看到这样的画面: enter image description here

我有一个图表区域的“压缩”,但我想静态显示总是持续30分钟,然后慢慢向下移动旧数据,而不缩放或用轴“打包”图表。我希望你能理解我。

UPD2: 另一个问题 - Y2Axis的标签没有固定值。比如现在: enter image description here

而且几秒钟后: enter image description here

+0

该轴仅显示大约5分钟的数据 - 在显示30分钟之前它不会“移动” - 将代码中的TotalMinutes值调整为2,以了解我的意思。 – kmp 2012-04-19 10:41:24

回答

2

从最简单的开始 - 格式化标签可以做到像这样:你可以这样做

myPane.Y2Axis.Scale.Format = "HH:mm"; 

一种方法(和它感觉有点片状,但我会让你决定的)就是一旦超出阈值(在这种情况下超过30分钟),就从曲线上移除这些点。这样当图表重绘轴时会相应更新。

我觉得取规模最小的值可能会比这更好的办法,但做不到这一点,你可以简单地保持队列为你加分,像这样,然后当他们超越你的门槛删除:

private Queue<DateTime> axisTimes; 

private static readonly Random rnd = new Random(); 

private void button1_Click(object sender, EventArgs e) 
{ 
    GraphPane myPane = zg1.GraphPane; 

    myPane.XAxis.IsVisible = false; 

    myPane.X2Axis.IsVisible = true; 
    myPane.X2Axis.MajorGrid.IsVisible = true; 
    myPane.X2Axis.Scale.Min = 0; 
    myPane.X2Axis.Scale.Max = 600; 

    myPane.YAxis.IsVisible = false; 

    myPane.Y2Axis.IsVisible = true; 
    myPane.Y2Axis.Scale.MajorUnit = DateUnit.Minute; 
    myPane.Y2Axis.Scale.MinorUnit = DateUnit.Second; 
    myPane.Y2Axis.Scale.Format = "HH:mm"; 
    myPane.Y2Axis.Type = AxisType.DateAsOrdinal; 

    LineItem myCurve = myPane.AddCurve("Alpha", 
            new PointPairList(), 
            Color.Red, 
            SymbolType.None); 

    myCurve.Symbol.Fill = new Fill(Color.White); 
    myCurve.IsX2Axis = true; 
    myCurve.IsY2Axis = true; 

    myPane.Chart.Fill = new Fill(Color.White, Color.LightGray, 45.0f); 
    zg1.IsShowPointValues = true; 

    axisTimes = new Queue<DateTime>(); 

    var t = new System.Windows.Forms.Timer(); 
    t.Interval = 1000; 
    t.Tick += ShowData; 

    Thread.Sleep(100); 

    t.Start(); 
} 

private void ShowData(object sender, EventArgs e) 
{ 
    var t = (System.Windows.Forms.Timer) sender; 
    t.Enabled = false; 

    int x = rnd.Next(500, 600); 
    var y = new XDate(DateTime.Now); 

    var myCurve = zg1.GraphPane.CurveList[0]; 

    if (axisTimes.Any()) 
    {    
     // Remove any points that go beyond our time threshold 
     while ((((DateTime)y) - axisTimes.Peek()).TotalMinutes > 30) 
     { 
      myCurve.RemovePoint(0); 
      axisTimes.Dequeue(); 

      if (!axisTimes.Any()) 
      { 
       break; 
      } 
     } 
    } 

    // Add the new point and store the datetime that it was added in 
    // our own queue 
    axisTimes.Enqueue(y); 
    myCurve.AddPoint(x, y); 

    zg1.AxisChange(); 
    zg1.Invalidate(); 

    t.Enabled = true; 
} 
+0

如果我理解你,这段代码压缩图表(轴和线),直到30分钟发生,30分钟后将“滚动”图表? – amaranth 2012-04-19 10:53:41

+0

是的,这是正确的 - 它将只显示最后30分钟的数据并放弃其他任何内容。 – kmp 2012-04-19 11:07:47

+0

但是我最初需要30分钟才能显示30分钟而没有竞赛图表,直到30分钟发生。 – amaranth 2012-04-19 11:15:14