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