C#下用zedGraph生成大量数据统计图表的方法(通过修改一些源码)

时间:2021-09-10 20:31:42

 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,效果还挺不错的。