ChartDirector應用筆記(一)

24K純開源發表於2013-12-29

ChartDirector介紹

      ChartDirector是一款小巧精細的商業圖表庫。其適用的語言範圍非常廣泛,包括.Net, Java, Asp, VB, PHP, Python, Ruby, C++等。ChartDirector既可以為WEB應用提供圖表支援,還能為桌面應用提供良好的圖表體驗。除此之外,ChartDirector還能與MFC, Qt等介面框架無縫結合。這一點,在官方提供的幫助文件中即可窺知一二。在本系列文章中,也將以Qt應用程式框架作為基礎,編寫各種圖表的應用例項。

     正如上面所說的,ChartDirector是一款商業圖表庫。在未獲得官方使用授權的情況下使用,圖表中會出現黃色識別符號。作為獨立的個人開發者,顯然無法也不必要去購買該庫的使用證照。網上的破解方式也比較多,基本上是對官方附帶的Dll檔案進行破解覆蓋即可。

ChartDirector類層次

ChartDirector庫中有三大類繼承結構較為常用,下面畫出了這三大類繼承結構:

 

圖表類繼承層次是對整個ChartDirector庫的功能總結。從上圖可以看出,ChartDirector類庫能夠繪製七大種類的圖表:MultiChart, PolarChart, ThreeDChart, BaseMeter, PieChart, XYChart, PyramidChart。其中,金融類圖表FinanceChart繼承自MultiChart。金融類圖表常常包含各種引數和指標,因此使用MultiChart作為基類繼承也是情理中的事情。ThreeDChart類派生出了兩個子類:SurfaceChart和ThreeDScatterChart。這兩個子類用於繪製3D圖表,3D圖表經常用於立體表現資料差異,繪製出來的圖表具有較強的立體視效。BaseMeter類代表儀表基類,派生子類包括:AngularMeter和LinearMeter類。如類名所示的那樣,AngularMeter繪製的儀表常常帶有弧度,而LinearMeter類則是線性繪製儀表,通常具有水平或者垂直外觀。

XYChart類是ChartDirector類庫中的一個大類,凡是包含X、Y座標的圖表都屬於XYChart。因此,用於XYChart類的Layer類也派生出了豐富的子類,用於實現不同型別的XY圖表。Layer類的具體作用是什麼呢?由於官方文件上並未對ChartDirector的設計架構進行闡述,因此只能對Layer的功能進行推測理解。我的理解是,Layer就是一般意義上的圖層,如果需要在同一個畫板上繪製多個XY圖表,需要組合不同的Layer類。不同的Layer可以組合在一起,實現複雜的功能。一般在繪製圖表的時候,需要根據不同的圖表型別新增不同的Layer派生類。

下面是Polar/Radar類的圖層類繼承層次:

可以看到,PolarChart類的圖層類相對較少,樣式比較固定。以PolarLayer類為基類派生出了PolarLineLayer, PolarAreaLayer, PolarVectorLayer三個類。

整個ChartDirector類庫基本上主要就是由上述這些類組成的。當然,還包括Array, Axis, Box, Sector類輔助類。從這方面考察,ChartDirector類庫還是足夠輕巧的,學習使用上也較為簡單。遺憾的是,附帶的說明文件並未涉及太多的架構方面的說明。因此,在完全理解ChartDirector庫的設計理念方面存在一定困難。

重要概念

要熟練運用ChartDirector類庫需要理解好一些概念。下面是本人的一些總結和理解:

  • Chart物件。Chart物件是繪圖的基礎,可以是上述圖表類繼承層次中的任意一個類的物件。每一個繪製出來的圖表都屬於特定的圖表類。如幫助文件中的Simple Bar Chart,這是一個簡單的XYChart的應用例項,生成的chart物件是XYChart類的例項。總之,在繪製每一個圖表前都需要例項化一個Chart物件。
  • Layer類。Layer類在上面稍微提過,我將之理解為圖片處理中的圖層。Layer之間可以疊加以組合繪製出更加複雜的圖表。值得注意的是,不同的圖表元件需要對應的Layer類來實現。在XYChart類中,實現了很多了add*函式用於給chart物件新增圖層。如addLineLayer, addBarLayer,  addBoxLayer等。
  • PlotArea。PlotArea類表示XY圖表中的繪圖區域。在繪製XY圖表的過程中,設定PlotArea是Chart物件例項化完成後需要做的第一件事。PlotArea使用畫素座標系統,也就是說:(0,0)位於繪製區域的左上方,X軸往右增加,Y軸往下增加。對於其他種類的圖表,PlotArea這個概念並不存在。
  • DrawArea。DrawArea類處於繪圖底層,是整個類庫繪圖的重要基礎。ChartDirector類庫中所有的圖表類都在內部維護一個DrawArea物件,該物件用於提供繪製原語,如繪製線條、形狀、文字等。使用者也可以通過獲取DrawArea物件來自定義繪製選項。
  • QChartViewer. QChartViewer是用來整合ChartDirector類庫到Qt框架中來的中間類。該類繼承自QLabel和ViewPortManager類,用於表現圖表繪製結果,處理滑鼠、鍵盤互動事件等。在ChartDirector類庫中,QChartViewer類以原始碼的形式附帶。使用者可以檢視其的實現方式,也可以直接包含進Qt工程中進行使用。

繪製步驟

以simple bar chart為例:

  1. 生成Chart物件:XYChart* c = new XYChart(250, 250);
  2. 設定繪圖區域(可選):c->setPlotArea(30, 20, 200, 200);
  3. 新增圖層(可選):c->addBarLayer(...);
  4. 設定座標引數:c->xAxis()->setLabels(...); c->yAxis()->setLabels(...);

下一篇講述Simple Bar Chart的使用。

相關文章