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,效果還挺不錯的。