ZedGraph是很好下的統計圖開源項目在以前的一篇隨筆中提到與其他的一些統計圖控件相比ZedGraph由於是直接在畫布上作畫而不是生成圖片顯示所以性能比較好在諸如股市的實時走勢圖顯示cpu使用率等實時性較強的應用中有很好的表現方法並不難但是由於很少有人寫這方面的文章又正巧在其他論壇中看到有這方面的問題所以寫了下面的例子
ZedGraph在描畫折線圖的時候將所有的坐標點都保存在PointPairList中在畫線的時候以這個為XY坐標要作動態的折線圖實際上就是不斷在這個PointPairList中添加點坐標然後刷新就可以了
代碼很簡單
Random ran = new Random();
PointPairList list = new PointPairList();
LineItem myCurve ;
Random用來生成示例數據也就是Y坐標PointPairList用來存放點集合myCarve就是要畫的線了當然不能忘了在窗體上添加zedGraph的控件
為了突出效果我們在Form的Load事件中加上下面的代碼
thiszedGraphControlGraphPaneTitleText = 動態折線圖;
thiszedGraphControlGraphPaneXAxisTitleText = 時間;
thiszedGraphControlGraphPaneYAxisTitleText = 數量;
thiszedGraphControlGraphPaneXAxisType = ZedGraphAxisTypeDateAsOrdinal;
for (int i = ; i <= ; i++)
{
double x = (double)new XDate(DateTimeNowAddSeconds(( i)));
double y = ranNextDouble();
listAdd(x y);
}
DateTime dt = DateTimeNow;
myCurve = zedGraphControlGraphPaneAddCurve(My Curve
list ColorDarkGreen SymbolTypeNone);
thiszedGraphControlAxisChange();
thiszedGraphControlRefresh();
這樣窗體加載後就可以看到已經畫出了一條折線圖可能象下面的樣子
但是現在這條線現在還不會動為了讓它動起來就要定時給PointPairList中添加坐標
添加一個Timer控件設置Interval屬性為然後在Timer的Tick事件中添加代碼
zedGraphControlGraphPaneXAxisScaleMaxAuto = true;
double x = (double)new XDate(DateTimeNow);
double y = ranNextDouble();
listAdd(x y);
thiszedGraphControlAxisChange();
thiszedGraphControlRefresh();
運行就會看到線條動起來了
如果要在折線圖內顯示指定數量的點只需要在添加坐標之前把第一個坐標點去掉
if (listCount >= )
{
listRemoveAt();
}
如果要象windows任務管理器中的cpu使用率那樣剛開始的時候是空的隨著時間的推移才逐漸畫滿可以在初始化的時候填幾個Y坐標為的點
for (int i = ; i <= ; i++)
{
double x = (double)new XDate(DateTimeNowAddSeconds(( i)));
double y = ;
listAdd(x y);
}
實際上代碼是比較簡單的關鍵就在於性能在上面的代碼中在生成折線的時候使用的是SymbolTypeNone如果使用其他幾種折點可以表示為方型星形等圖形性能就要下降很多例如按照上面的代碼在我windows 專業版賽揚G內存的條件下可以顯示個點而且沒有明顯的停頓現象但是如果將折點的圖形設置為SymbolTypeDiamond例如下圖這樣
在個點的情況下停頓現象非常嚴重實際上不到個點就已經有明顯的感覺了同時在描線的時候沒有使用抗鋸齒一樣可以提高性能不過對性能的提升還是很有限的
如果以股市實時走勢圖為例每天個小時如果每秒更新一次××=可以看出ZedGraph完全可以適用
From:http://tw.wingwit.com/Article/program/net/201311/12922.html