程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> 使用ZedGraph制作動態更新的統計圖

使用ZedGraph制作動態更新的統計圖

編輯:關於.NET

ZedGraph是很好的.net下的統計圖開源項目,在以前的一篇隨筆中提到,與其他的一些統計圖控件相比,ZedGraph由於是直接在畫布上作畫,而不是生成圖片顯示,所以性能比較好,在諸如股市的實時走勢圖,顯示cpu使用率等實時性較強的應用中有很好的表現,方法並不難,但是由於很少有人寫這方面的文章,又正巧在其他論壇中看到有這方面的問題,所以寫了下面的例子。

ZedGraph在描畫折線圖的時候,將所有的坐標點都保存在PointPairList中,在畫線的時候以這個為X,Y坐標。要作動態的折線圖,實際上就是不斷在這個PointPairList中添加點坐標,然後刷新就可以了。

代碼很簡單:

Random ran = new Random();
PointPairList list = new PointPairList();
LineItem myCurve ;

Random用來生成示例數據,也就是Y坐標,PointPairList用來存放點集合。myCarve就是要畫的線了。當然,不能忘了在窗體上添加zedGraph的控件。

為了突出效果,我們在Form的Load事件中加上下面的代碼:

this.zedGraphControl1.GraphPane.Title.Text = "動態折線圖";
this.zedGraphControl1.GraphPane.XAxis.Title.Text = "時間";
this.zedGraphControl1.GraphPane.YAxis.Title.Text = "數量";
this.zedGraphControl1.GraphPane.XAxis.Type = ZedGraph.AxisType.DateAsOrdinal;
for (int i = 0; i <= 100; i++)
{
    double x = (double)new XDate(DateTime.Now.AddSeconds(-(100 - i)));
    double y = ran.NextDouble();
    list.Add(x, y);
}
DateTime dt = DateTime.Now;
myCurve = zedGraphControl1.GraphPane.AddCurve("My Curve",
    list, Color.DarkGreen, SymbolType.None);
this.zedGraphControl1.AxisChange();
this.zedGraphControl1.Refresh();

這樣,窗體加載後就可以看到已經畫出了一條折線圖。可能象下面的樣子:

但是現在,這條線現在還不會動,為了讓它動起來就要定時給PointPairList中添加坐標。

添加一個Timer控件,設置Interval屬性為1000,然後在Timer的Tick事件中添加代碼:

zedGraphControl1.GraphPane.XAxis.Scale.MaxAuto = true;
double x = (double)new XDate(DateTime.Now);
double y = ran.NextDouble();
list.Add(x, y);
this.zedGraphControl1.AxisChange();
this.zedGraphControl1.Refresh();

運行,就會看到線條動起來了。

如果要在折線圖內顯示指定數量的點,只需要在添加坐標之前把第一個坐標點去掉:

if (list.Count >= 100)
{
    list.RemoveAt(0);
}

如果要象windows任務管理器中的cpu使用率那樣,剛開始的時候是空的,隨著時間的推移才逐漸畫滿,可以在初始化的時候填幾個Y坐標為0的點:

for (int i = 0; i <= 100; i++)
{
    double x = (double)new XDate(DateTime.Now.AddSeconds(-(100 - i)));
    double y = 0;
    list.Add(x, y);
}

實際上,代碼是比較簡單的,關鍵就在於性能,在上面的代碼中,在生成折線的時候使用的是SymbolType.None,如果使用其他幾種,折點可以表示為方型,星形等圖形,性能就要下降很多,例如,按照上面的代碼,在我windows2000 專業版,賽揚1.7G,512內存的條件下,可以顯示10000個點,而且沒有明顯的停頓現象,但是如果將折點的圖形設置為SymbolType.Diamond,例如下圖這樣:

在10000個點的情況下停頓現象非常嚴重,實際上,不到2000個點就已經有明顯的感覺了。同時在描線的時候沒有使用抗鋸齒,一樣可以提高性能,不過,對性能的提升還是很有限的。

如果以股市實時走勢圖為例,每天4個小時,如果每10秒更新一次,6×60×4=1440,可以看出ZedGraph完全可以適用。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved