1. 程式人生 > >C#下用zedGraph生成大量資料統計圖表的方法(通過修改一些原始碼)

C#下用zedGraph生成大量資料統計圖表的方法(通過修改一些原始碼)

 zedGraph是C#下非常優秀的開源的生成統計圖表的庫,最近需要用zedGraph生成大量資料的圖表(資料非常多,圖表非常大),遇到了一些問題,通過修改了一些原始碼實現

zedGraph的原始碼可以在這裡下載,http://dxdown1.onlinedown.net/down/Zegraph.rar,使用時引用zedGraph.dll和zedGraph.Web.dll即可。

zedGraph初始化:

           List<string> xtitles = new List<string>();   //xtitles是x軸的資料 
           this.zedGraphControl1.Size = new Size(xtitles.Count * 20, 700);    //根據x軸資料的個數設定寬度
            this.zedGraphControl1.GraphPane.Title.FontSpec.Size = 20f;    //設定標題字號
            this.zedGraphControl1.GraphPane.IsFontsScaled = false;     //設定字型不隨控制元件大小而自動縮放
            this.zedGraphControl1.GraphPane.XAxis.Type = ZedGraph.AxisType.Text;   //設定x軸是字串
            this.zedGraphControl1.GraphPane.XAxis.Scale.TextLabels = xtitles.ToArray();    //設定x軸資料

需要注意的時,如果寬度很大要顯示出來,需要設定zedGraph顯示x軸的滾動軸,AutoSize設為true,同時在外面放一個panel,設定AutoScroll為true,這樣可以滾動顯示圖表。

畫柱狀體

List<double> yValues  = new List<double();   //y軸的資料
string yTitle = "資料“;   //x軸的標題
GraphPane graphPane = this.zedGraphControl1.GraphPane;
BarItem myBar = graphPane.AddBar(yTitle, null, yValues.ToArray(), Color.Blue);   //畫柱狀圖
myBar.Bar.Fill = new Fill(Color.Blue, Color.White, Color.Blue);   //給柱狀圖設定顏色
myBar.Bar.Border.Color = Color.Transparent;   


重新整理顯示圖表

this.zedGraphControl1.AxisChange();

儲存為png圖片
string imageName = "D:\\統計圖表.png";
RectangleF rect = this.zedGraphControl1.GraphPane.Rect;
Bitmap bitmap = new Bitmap((int)rect.Width, (int)rect.Height);
            using (Graphics bitmapGraphics = Graphics.FromImage(bitmap))
            {
                bitmapGraphics.TranslateTransform(-rect.Left, -rect.Top);
                this.zedGraphControl1.MasterPane.Draw(bitmapGraphics);
            }
bitmap.Save(imageName, ImageFormat.Png);


遇到的一些問題

1. 設定柱狀圖的寬度無效

設定this.zedGraphControl1.GraphPane.BarSettings.ClusterScaleWidth = 0.5 無效,可以通過修改原始碼

在scale.cs中

將return Math.Abs( Transform( basisVal + ( IsAnyOrdinal ? 1.0 : pane._barSettings._clusterScaleWidth ) ) - Transform( basisVal ) );

改為return Math.Abs(Transform(basisVal + (pane._barSettings._clusterScaleWidth)) - Transform(basisVal));

當XAxis.Type為AxisType.Text時,IsAnyOrdinal始終為true, 使得clusterScaleWidth不起作用。

2.大資料 當寬度超過10000時,後面的不會畫出來,同時寬度很大時,x軸後面的資料不顯示

在Bar.cs中,將

if ( top < -10000 )
				top = -10000;
			else if ( top > 10000 )
				top = 10000;
			if ( left < -10000 )
				left = -10000;
			else if ( left > 10000 )
				left = 10000;
			if ( right < -10000 )
				right = -10000;
			else if ( right > 10000 )
				right = 10000;
			if ( bottom < -10000 )
				bottom = -10000;
			else if ( bottom > 10000 )
				bottom = 10000;
中的10000都改為100000

 在Scale.cs,CalcNumTics()中將

if ( nTics < 1 )
nTics = 1;

else if ( nTics > 1000 )

nTics = 1000;

中的1000改為10000

在Scale.cs,DrawLabels函式中,

float lastPixVal = -10000;
// loop for each major tic
for ( int i = firstTic; i < nTics + firstTic; i++ )

在這兩行中間加上

               nTics = 50000;

變為

float lastPixVal = -10000;
// loop for each major tic
nTics = 50000;
for ( int i = firstTic; i < nTics + firstTic; i++ )

PS:這個是胡亂加上的,發現有效,也沒出現什麼問題

修改原始碼後,重新編譯,將新的zedGraph.dll重新匯入即可

3. 尺寸過大,儲存為圖片時出現error

發現當寬度*高度 大約大於 70000*2500時出現問題,這個是bitmap生成時記憶體不夠,只能控制寬度和高度不要過大

我最後生成的圖片最大的是50000*3000,8MB,效果還挺不錯的。