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

 

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

 

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

 

代碼很簡單:

Random ran = new Random();

PointPairList list = new PointPairList();

LineItem myCurve ;

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

 

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

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,然後在TimerTick事件中添加代碼:

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.7G512內存的條件下,可以顯示10000個點,而且沒有明顯的停頓現象,但是如果將折點的圖形設置爲SymbolType.Diamond,例如下圖這樣:


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

如果以股市實時走勢圖爲例,每天4個小時,如果每10秒更新一次,6×60×41440,可以看出ZedGraph完全可以適用。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章