七月 22

使用 ZedGraph 製作統計圖

程式 沒有回應 »   瀏覽人數:[ 885user+549bot ]

這幾天研究了 ZedGraph,發現它是一套很好用的畫圖表工具,練習做了一個統計圖,大家參考看看!

C#:
  1. //記得要加入參考
  2. using ZedGraph;
  3.  
  4. //資料來源       
  5. private DataTable getDT()
  6. {
  7.     DataTable dt = new DataTable();
  8.     dt.Columns.Add("學號", System.Type.GetType("System.String"));
  9.     dt.Columns.Add("姓名", System.Type.GetType("System.String"));
  10.     dt.Columns.Add("國文", System.Type.GetType("System.Int32"));
  11.     dt.Columns.Add("英文", System.Type.GetType("System.Int32"));
  12.     dt.Columns.Add("數學", System.Type.GetType("System.Int32"));
  13.  
  14.     dt.Rows.Add("B9510001", "崔昱翰", 85, 66, 71);
  15.     dt.Rows.Add("B9510002", "王詩光", 65, 92, 88);
  16.     dt.Rows.Add("B9510003", "劉育白", 52, 66, 63);
  17.     dt.Rows.Add("B9510004", "許威宇", 98, 70, 61);
  18.     dt.Rows.Add("B9510005", "李佩珊", 81, 63, 76);
  19.     dt.Rows.Add("B9510006", "潘紹興", 91, 77, 76);
  20.  
  21.     return dt;
  22. }
  23.  
  24. //學生成績
  25. public void StudentChart1(ZedGraphControl zgc)
  26. {
  27.     // Google網域搜尋:Fill site:http://zedgraph.sourceforge.net/documentation
  28.  
  29.     GraphPane myPane = zgc.GraphPane;
  30.    
  31.     //
  32.     DataTable dt = getDT();
  33.  
  34.     // Set the title and axis labels
  35.     myPane.Title.Text = "學生成績量化表";
  36.     myPane.XAxis.Title.Text = "學生姓名";
  37.     myPane.YAxis.Title.Text = "分數";
  38.  
  39.     PointPairList list1 = new PointPairList();
  40.     PointPairList list2 = new PointPairList();
  41.     PointPairList list3 = new PointPairList();
  42.    
  43.     Random rand = new Random();
  44.  
  45.     // Generate random data for three curves
  46.     for (int i = 0; i <dt.Rows.Count; i++)
  47.     {
  48.        
  49.         double x = (double)i;
  50.         double y1_chian = Convert.ToDouble(dt.Rows[i]["國文"]);
  51.         double y2_eng = Convert.ToDouble(dt.Rows[i]["英文"]);
  52.         double y3_math = Convert.ToDouble(dt.Rows[i]["數學"]);
  53.         list1.Add(x, y1_chian);
  54.         list2.Add(x, y2_eng);
  55.         list3.Add(x, y3_math);
  56.     }
  57.  
  58.     // create the curves
  59.     // BarItem.Bar.Fill(Color) 填入單一顏色
  60.     // BarItem.Bar.Fill(Color, Color, Color, 90) 填入漸層顏色,第4參數是旋轉角度
  61.     BarItem myCurve1 = myPane.AddBar("國文", list1, Color.Red);
  62.     myCurve1.Bar.Fill = new Fill(Color.FromArgb(255, 238, 221));
  63.    
  64.     BarItem myCurve2 = myPane.AddBar("英文", list2, Color.Blue);
  65.     myCurve2.Bar.Fill = new Fill(Color.FromArgb(221, 255, 238));
  66.    
  67.     BarItem myCurve3 = myPane.AddBar("數學", list3, Color.Green);
  68.     myCurve3.Bar.Fill = new Fill(Color.FromArgb(238, 221, 255));
  69.  
  70.    
  71.    
  72.     // Fill the axis background with a color gradient
  73.     // 背景色
  74.     // myPane.Chart.Fill = new Fill(Color.White, Color.FromArgb(255, 255, 166), 45.0F);
  75.  
  76.     myPane.XAxis.MajorTic.IsBetweenLabels = true;
  77.  
  78.     //加入X LabelText
  79.     string[] labels = new string[6];
  80.     for (int i = 0; i <dt.Rows.Count; i++)
  81.     {
  82.         labels[i] = Convert.ToString(dt.Rows[i]["姓名"]);
  83.     }
  84.     myPane.XAxis.Scale.TextLabels = labels; //X軸的說明文字
  85.     myPane.XAxis.Type = AxisType.Text;      //X軸類型
  86.  
  87.     //重新計算目前數據範圍
  88.     zgc.AxisChange();
  89.  
  90.     // expand the range of the Y axis slightly to accommodate the labels
  91.     // myPane.YAxis.Scale.Max += myPane.YAxis.Scale.MajorStep;
  92.     // YAxis最大值
  93.     myPane.YAxis.Scale.Max = 110;
  94.  
  95.     // Create TextObj's to provide labels for each bar
  96.     // 在bar上顯示數值
  97.     BarItem.CreateBarLabels(myPane, false, "f0");
  98.  
  99.     //顯示格點
  100.     myPane.YAxis.MajorGrid.IsVisible = true;
  101.     myPane.XAxis.MajorGrid.IsVisible = true;
  102. }

七月 21

        最近參考了幾個統計圖表控件包,OpenSource 的有 ZedGraphNplot 等,但是相比之下還是 ZedGraph 強大,方便一些,其他的感覺還是半成品。

        收費的套件就多了,只要是商業的報表開發工具都有統計圖表的功能,水晶報表,ActiveReport,Reporting Service,不過要方便,功能單一的還是 dotnetCharting。下面主要從 winform 使用上說說 ZedGraph 和 dotnetCharting。

        從效果上說 dotnetCharting 確實沒的說,水晶式效果很是炫目,這應該是其最大的賣點。為了便於開發者學習,帶了各種效果的示例代碼。DotnetCharting 在產生統計圖的時候需要設置一個臨時目錄,用來保存產生的統計圖的圖片,dotnetCharting 的圖表效果好,很大程度上是因為它生成了圖片,然後將其顯示在界面上。當然,作為代價,它犧牲了性能。同時,它不支持縮放,雖然你可以通過更改坐標軸的刻度來實現這個功能,但是性能上就差了很多。

如果你對性能要求不高,dotnetCharting 是非常好的選擇。

        ZedGraph 最大的賣點在哪裡?應該是OpenSource,你可以修改代碼以適應自己的需求,例如:ZedGraph 在畫線型圖的時候,線條沒有使用抗鋸齒,你只要修改 Line類的 Default 結構中的預設設置就可以了。和 dotnetCharting 相比,ZedGraph 的效果要差一些,不過,要是自己調整的好,也還不錯,但是 ZedGraph 的優勢不在這裡。

        由於 ZedGraph 是使用 GDI+ 直接在 Canvas 上進行描畫,所以,性能得到了保證,如果你改變坐標軸的刻度,和 dotnetCharing 相比,ZedGraph 的反應速度是很快的。基於此,ZedGraph 提供了很重要的縮放和拖動功能,你可以通過鼠標滾輪進行方法,縮小圖表,可以通過鼠標中鍵來拖動,非常方便。

        對於類似股市的實時走勢,CPU 使用率等實時變化的數據,使用 ZedGraph 也可以很方便地作到。ZedGraph 在基於 PointPairList 作畫,所以你只要在 PointPairList 這個集合中添加新的數據,然後進行重畫就可以實現了,對於性能,上面說了,由於是直接使用 GDI+,性能是比較好的,我測過 400 個點是沒問題的。所以,ZedGraph 對於實時要求比較強的需求也是可以應對的。

        總結的來說,dotnetCHARTING 產出的圖表效果好,但是性能方面較差,對實時要求強的需求不適應。ZedGraph 開放原始碼,效果比起 dotnetCHARTING 差,但是性能好,能適應有實時要求的數據。

本文章轉貼於:http://blog.csai.cn/user1/17072/archives/2009/37706.html