用ASP.NET with C# 绘制曲线图(Curve图)

画曲线图,网上有很多代码可以参考,也有不少开放的组件可以用,但是我是本着自己能写就自己写的原则,毕竟自己写的代码所有过程清楚明白,放心!错了也得了一个教训,值得!

网上的例子多数画曲线图是用DrawLine()函数将各个点一点一点连接起来,所以大部分时候也叫折线图。但是.NET中还有一个DrawCurve()函数,它可以直接画出一条曲线或者折线,还可以设置张力(Tension)值,比用DrawLine()方便德多也好用得多!

好了,不废话,先看看最终生成的效果图:

曲线图可以缩放,随意定义X轴和Y轴代表的大小,还可以定义Y轴的起始值,张力值等等。全部元素颜色都可以自定义。

用ASP.NET with C# 绘制曲线图(Curve图)

怎么样?还可以吧,呵呵,下边开始说明画图步骤:

首先,需要初始化图像,例如定义图像对象,填充背景,画出X轴和Y轴以及轴上的刻度等,先来看看我们Curve类的初始化函数InitializeGraph():

 

用ASP.NET with C# 绘制曲线图(Curve图)            //初始化和填充图像区域,画出边框,初始标题
用ASP.NET with C# 绘制曲线图(Curve图)
            private void InitializeGraph()
用ASP.NET with C# 绘制曲线图(Curve图)用ASP.NET with C# 绘制曲线图(Curve图)            
用ASP.NET with C# 绘制曲线图(Curve图){
用ASP.NET with C# 绘制曲线图(Curve图)            
用ASP.NET with C# 绘制曲线图(Curve图)                
//根据给定的高度和宽度创建一个位图图像
用ASP.NET with C# 绘制曲线图(Curve图)
                objBitmap = new Bitmap(Width,Height);
用ASP.NET with C# 绘制曲线图(Curve图)
用ASP.NET with C# 绘制曲线图(Curve图)                
//从指定的 objBitmap 对象创建 objGraphics 对象 (即在objBitmap对象中画图)
用ASP.NET with C# 绘制曲线图(Curve图)
                objGraphics = Graphics.FromImage(objBitmap);
用ASP.NET with C# 绘制曲线图(Curve图)
用ASP.NET with C# 绘制曲线图(Curve图)                
//根据给定颜色(LightGray)填充图像的矩形区域 (背景)
用ASP.NET with C# 绘制曲线图(Curve图)
                objGraphics.DrawRectangle(new Pen(BorderColor,1),0,0,Width,Height);
用ASP.NET with C# 绘制曲线图(Curve图)                objGraphics.FillRectangle(
new SolidBrush(BgColor),1,1,Width-2,Height-2);
用ASP.NET with C# 绘制曲线图(Curve图)
用ASP.NET with C# 绘制曲线图(Curve图)                
//画X轴,pen,x1,y1,x2,y2 注意图像的原始X轴和Y轴计算是以左上角为原点,向右和向下计算的
用ASP.NET with C# 绘制曲线图(Curve图)
                objGraphics.DrawLine(new Pen(new SolidBrush(AxisColor),1),100,Height - 100,Width - 75,Height - 100);
用ASP.NET with C# 绘制曲线图(Curve图)
用ASP.NET with C# 绘制曲线图(Curve图)                
//画Y轴,pen,x1,y1,x2,y2
用ASP.NET with C# 绘制曲线图(Curve图)
                objGraphics.DrawLine(new Pen(new SolidBrush(AxisColor),1),100,Height - 100,100,75);
用ASP.NET with C# 绘制曲线图(Curve图)
用ASP.NET with C# 绘制曲线图(Curve图)                
//初始化轴线说明文字
用ASP.NET with C# 绘制曲线图(Curve图)
                SetAxisText(ref objGraphics);
用ASP.NET with C# 绘制曲线图(Curve图)
用ASP.NET with C# 绘制曲线图(Curve图)                
//初始化X轴上的刻度和文字
用ASP.NET with C# 绘制曲线图(Curve图)
                SetXAxis(ref objGraphics);
用ASP.NET with C# 绘制曲线图(Curve图)
用ASP.NET with C# 绘制曲线图(Curve图)                
//初始化Y轴上的刻度和文字
用ASP.NET with C# 绘制曲线图(Curve图)
                SetYAxis(ref objGraphics);
用ASP.NET with C# 绘制曲线图(Curve图)
用ASP.NET with C# 绘制曲线图(Curve图)                
//初始化标题
用ASP.NET with C# 绘制曲线图(Curve图)
                CreateTitle(ref objGraphics);
用ASP.NET with C# 绘制曲线图(Curve图)            }

具体每个函数有什么作用代码注释已经很清楚了。现在我们继续来看SetAxisText()

 

用ASP.NET with C# 绘制曲线图(Curve图)            private void SetAxisText(ref Graphics objGraphics)
用ASP.NET with C# 绘制曲线图(Curve图)用ASP.NET with C# 绘制曲线图(Curve图)            
用ASP.NET with C# 绘制曲线图(Curve图){
用ASP.NET with C# 绘制曲线图(Curve图)                objGraphics.DrawString(XAxisText,
new Font("宋体",10),new SolidBrush(AxisTextColor),Width/2 - 50,Height - 50);
用ASP.NET with C# 绘制曲线图(Curve图)
用ASP.NET with C# 绘制曲线图(Curve图)                
int X = 30;
用ASP.NET with C# 绘制曲线图(Curve图)                
int Y = (Height/2- 50;
用ASP.NET with C# 绘制曲线图(Curve图)                
for(int i = 0;i < YAxisText.Length;i++)
用ASP.NET with C# 绘制曲线图(Curve图)用ASP.NET with C# 绘制曲线图(Curve图)                
用ASP.NET with C# 绘制曲线图(Curve图){
用ASP.NET with C# 绘制曲线图(Curve图)                    objGraphics.DrawString(YAxisText[i].ToString(),
new Font("宋体",10),new SolidBrush(AxisTextColor),X,Y);
用ASP.NET with C# 绘制曲线图(Curve图)                    Y 
+= 15;
用ASP.NET with C# 绘制曲线图(Curve图)                }

用ASP.NET with C# 绘制曲线图(Curve图)            }

SetAxisText()的作用是初始化轴线的说明文字,注意这不是刻度上的文字哦。呵呵,下边这两个才是初始化刻度和刻度上的文字,SetXAxis()和SetYAxis():

 

用ASP.NET with C# 绘制曲线图(Curve图)            private  void SetXAxis(ref Graphics objGraphics)
用ASP.NET with C# 绘制曲线图(Curve图)用ASP.NET with C# 绘制曲线图(Curve图)            
用ASP.NET with C# 绘制曲线图(Curve图){
用ASP.NET with C# 绘制曲线图(Curve图)                
int x1 = 100;
用ASP.NET with C# 绘制曲线图(Curve图)                
int y1 = Height - 110;
用ASP.NET with C# 绘制曲线图(Curve图)                
int x2 = 100;
用ASP.NET with C# 绘制曲线图(Curve图)                
int y2 = Height - 90;
用ASP.NET with C# 绘制曲线图(Curve图)                
int iCount = 0;
用ASP.NET with C# 绘制曲线图(Curve图)                
int iSliceCount = 1;
用ASP.NET with C# 绘制曲线图(Curve图)                
float Scale = 0;
用ASP.NET with C# 绘制曲线图(Curve图)                
int iWidth = (int)((Width-200)*(50/XSlice));
用ASP.NET with C# 绘制曲线图(Curve图)
用ASP.NET with C# 绘制曲线图(Curve图)                objGraphics.DrawString(Keys[
0].ToString(),new Font("宋体",10),new SolidBrush(SliceTextColor),85,Height - 90);
用ASP.NET with C# 绘制曲线图(Curve图)
用ASP.NET with C# 绘制曲线图(Curve图)                
for(int i = 0;i <= iWidth;i += 10)
用ASP.NET with C# 绘制曲线图(Curve图)用ASP.NET with C# 绘制曲线图(Curve图)                
用ASP.NET with C# 绘制曲线图(Curve图){
用ASP.NET with C# 绘制曲线图(Curve图)                    Scale 
= i * ( XSlice / 50 );
用ASP.NET with C# 绘制曲线图(Curve图)
用ASP.NET with C# 绘制曲线图(Curve图)                    
if(iCount == 5)
用ASP.NET with C# 绘制曲线图(Curve图)用ASP.NET with C# 绘制曲线图(Curve图)                    
用ASP.NET with C# 绘制曲线图(Curve图){
用ASP.NET with C# 绘制曲线图(Curve图)                        objGraphics.DrawLine(
new Pen(new SolidBrush(AxisColor)),x1+Scale,y1,x2+Scale,y2);
用ASP.NET with C# 绘制曲线图(Curve图)                        
//The Point!这里显示X轴刻度
用ASP.NET with C# 绘制曲线图(Curve图)
                        if(iSliceCount <= Keys.Length-1)
用ASP.NET with C# 绘制曲线图(Curve图)用ASP.NET with C# 绘制曲线图(Curve图)                        
用ASP.NET with C# 绘制曲线图(Curve图){
用ASP.NET with C# 绘制曲线图(Curve图)                            objGraphics.DrawString(Keys[iSliceCount].ToString(),
new Font("宋体",10),new SolidBrush(SliceTextColor),x1 + Scale - 15,y2);
用ASP.NET with C# 绘制曲线图(Curve图)                        }

用ASP.NET with C# 绘制曲线图(Curve图)                        
else
用ASP.NET with C# 绘制曲线图(Curve图)用ASP.NET with C# 绘制曲线图(Curve图)                        
用ASP.NET with C# 绘制曲线图(Curve图){
用ASP.NET with C# 绘制曲线图(Curve图)                            
//超过范围,不画任何刻度文字
用ASP.NET with C# 绘制曲线图(Curve图)
                        }

用ASP.NET with C# 绘制曲线图(Curve图)                        iCount 
= 0;
用ASP.NET with C# 绘制曲线图(Curve图)                        iSliceCount
++;
用ASP.NET with C# 绘制曲线图(Curve图)                        
if(x1+Scale > Width - 100)
用ASP.NET with C# 绘制曲线图(Curve图)用ASP.NET with C# 绘制曲线图(Curve图)                        
用ASP.NET with C# 绘制曲线图(Curve图){
用ASP.NET with C# 绘制曲线图(Curve图)                            
break;
用ASP.NET with C# 绘制曲线图(Curve图)                        }

用ASP.NET with C# 绘制曲线图(Curve图)                    }

用ASP.NET with C# 绘制曲线图(Curve图)                    
else
用ASP.NET with C# 绘制曲线图(Curve图)用ASP.NET with C# 绘制曲线图(Curve图)                    
用ASP.NET with C# 绘制曲线图(Curve图){
用ASP.NET with C# 绘制曲线图(Curve图)                        objGraphics.DrawLine(
new Pen(new SolidBrush(SliceColor)),x1+Scale,y1+5,x2+Scale,y2-5);
用ASP.NET with C# 绘制曲线图(Curve图)                    }

用ASP.NET with C# 绘制曲线图(Curve图)                    iCount
++;
用ASP.NET with C# 绘制曲线图(Curve图)                }

用ASP.NET with C# 绘制曲线图(Curve图)            }

用ASP.NET with C# 绘制曲线图(Curve图)
用ASP.NET with C# 绘制曲线图(Curve图)            
private void SetYAxis(ref Graphics objGraphics)
用ASP.NET with C# 绘制曲线图(Curve图)用ASP.NET with C# 绘制曲线图(Curve图)            
用ASP.NET with C# 绘制曲线图(Curve图){
用ASP.NET with C# 绘制曲线图(Curve图)                
int x1 = 95
用ASP.NET with C# 绘制曲线图(Curve图)                
int y1 = (int)(Height - 100 - 10*(YSlice/50));
用ASP.NET with C# 绘制曲线图(Curve图)                
int x2 = 105;
用ASP.NET with C# 绘制曲线图(Curve图)                
int y2 = (int)(Height - 100 - 10*(YSlice/50));
用ASP.NET with C# 绘制曲线图(Curve图)                
int iCount = 1;
用ASP.NET with C# 绘制曲线图(Curve图)                
float Scale = 0;
用ASP.NET with C# 绘制曲线图(Curve图)                
int iSliceCount = 1;
用ASP.NET with C# 绘制曲线图(Curve图)
用ASP.NET with C# 绘制曲线图(Curve图)                
int iHeight = (int)((Height-200)*(50/YSlice));
用ASP.NET with C# 绘制曲线图(Curve图)
用ASP.NET with C# 绘制曲线图(Curve图)                objGraphics.DrawString(YSliceBegin.ToString(),
new Font("宋体",10),new SolidBrush(SliceTextColor),60,Height - 110);
用ASP.NET with C# 绘制曲线图(Curve图)
用ASP.NET with C# 绘制曲线图(Curve图)                
for(int i = 0;i < iHeight;i+=10)
用ASP.NET with C# 绘制曲线图(Curve图)用ASP.NET with C# 绘制曲线图(Curve图)                
用ASP.NET with C# 绘制曲线图(Curve图){
用ASP.NET with C# 绘制曲线图(Curve图)                    Scale 
= i * ( YSlice / 50 );
用ASP.NET with C# 绘制曲线图(Curve图)
用ASP.NET with C# 绘制曲线图(Curve图)                    
if(iCount == 5)
用ASP.NET with C# 绘制曲线图(Curve图)用ASP.NET with C# 绘制曲线图(Curve图)                    
用ASP.NET with C# 绘制曲线图(Curve图){
用ASP.NET with C# 绘制曲线图(Curve图)                        objGraphics.DrawLine(
new Pen(new SolidBrush(AxisColor)),x1 - 5, y1 - Scale,x2 + 5,y2 - Scale);
用ASP.NET with C# 绘制曲线图(Curve图)                        
//The Point!这里显示Y轴刻度
用ASP.NET with C# 绘制曲线图(Curve图)
                        objGraphics.DrawString(Convert.ToString(YSliceValue * iSliceCount+YSliceBegin),new Font("宋体",10),new SolidBrush(SliceTextColor),60,y1 - Scale );
用ASP.NET with C# 绘制曲线图(Curve图)
用ASP.NET with C# 绘制曲线图(Curve图)                        iCount 
= 0;
用ASP.NET with C# 绘制曲线图(Curve图)                        iSliceCount
++;
用ASP.NET with C# 绘制曲线图(Curve图)                    }

用ASP.NET with C# 绘制曲线图(Curve图)                    
else
用ASP.NET with C# 绘制曲线图(Curve图)用ASP.NET with C# 绘制曲线图(Curve图)                    
用ASP.NET with C# 绘制曲线图(Curve图){
用ASP.NET with C# 绘制曲线图(Curve图)                        objGraphics.DrawLine(
new Pen(new SolidBrush(SliceColor)),x1,y1 - Scale,x2,y2 - Scale);
用ASP.NET with C# 绘制曲线图(Curve图)                    }

用ASP.NET with C# 绘制曲线图(Curve图)                    iCount 
++;
用ASP.NET with C# 绘制曲线图(Curve图)                }

用ASP.NET with C# 绘制曲线图(Curve图)            }

需要注意的是两个函数都定义了一个Scale的浮点值,该值就是缩放X轴和Y轴的关键,因为X轴一般代表日期,Y轴一般代表数值,所以Y轴还定义多了一个YSliceValue和YSliceBegin一起完成Y轴的缩放操作。具体看代码应该可以看出来。

最后初始化的是图像的标题:

 

用ASP.NET with C# 绘制曲线图(Curve图)            //初始化标题
用ASP.NET with C# 绘制曲线图(Curve图)
            private void CreateTitle(ref Graphics objGraphics)
用ASP.NET with C# 绘制曲线图(Curve图)用ASP.NET with C# 绘制曲线图(Curve图)            
用ASP.NET with C# 绘制曲线图(Curve图){
用ASP.NET with C# 绘制曲线图(Curve图)                objGraphics.DrawString(Title,
new Font("宋体",16),new SolidBrush(TextColor),new Point(5,5));
用ASP.NET with C# 绘制曲线图(Curve图)            }

至此,图像初始化已经顺利完成了,初始化后的图像如下:

用ASP.NET with C# 绘制曲线图(Curve图)

万事俱备,只欠曲线了,这时候,我们要用到DrawCurve()函数了,该函数具体用法可以自己看MSDN,先看看代码:

 

用ASP.NET with C# 绘制曲线图(Curve图)            private void DrawContent(ref Graphics objGraphics)
用ASP.NET with C# 绘制曲线图(Curve图)用ASP.NET with C# 绘制曲线图(Curve图)            
用ASP.NET with C# 绘制曲线图(Curve图){
用ASP.NET with C# 绘制曲线图(Curve图)                
if(Keys.Length == Values.Length)
用ASP.NET with C# 绘制曲线图(Curve图)用ASP.NET with C# 绘制曲线图(Curve图)                
用ASP.NET with C# 绘制曲线图(Curve图){
用ASP.NET with C# 绘制曲线图(Curve图)                    Pen CurvePen 
= new Pen(CurveColor,1);
用ASP.NET with C# 绘制曲线图(Curve图)                    PointF[] CurvePointF 
= new PointF[Keys.Length];
用ASP.NET with C# 绘制曲线图(Curve图)                    
float keys = 0;
用ASP.NET with C# 绘制曲线图(Curve图)                    
float values = 0;
用ASP.NET with C# 绘制曲线图(Curve图)                    
float Offset1 = (Height-100+ YSliceBegin;
用ASP.NET with C# 绘制曲线图(Curve图)                    
float Offset2 = (YSlice/50)*(50/YSliceValue);
用ASP.NET with C# 绘制曲线图(Curve图)
用ASP.NET with C# 绘制曲线图(Curve图)                    
for(int i=0;i<Keys.Length;i++)
用ASP.NET with C# 绘制曲线图(Curve图)用ASP.NET with C# 绘制曲线图(Curve图)                    
用ASP.NET with C# 绘制曲线图(Curve图){
用ASP.NET with C# 绘制曲线图(Curve图)                        keys 
= XSlice*i+100;
用ASP.NET with C# 绘制曲线图(Curve图)                        values 
= Offset1 - Values[i]*Offset2;
用ASP.NET with C# 绘制曲线图(Curve图)                        CurvePointF[i] 
= new PointF(keys,values);
用ASP.NET with C# 绘制曲线图(Curve图)                    }

用ASP.NET with C# 绘制曲线图(Curve图)                    objGraphics.DrawCurve(CurvePen,CurvePointF,Tension);
用ASP.NET with C# 绘制曲线图(Curve图)                }

用ASP.NET with C# 绘制曲线图(Curve图)                
else
用ASP.NET with C# 绘制曲线图(Curve图)用ASP.NET with C# 绘制曲线图(Curve图)                
用ASP.NET with C# 绘制曲线图(Curve图){
用ASP.NET with C# 绘制曲线图(Curve图)                    objGraphics.DrawString(
"Error!The length of Keys and Values must be same!",new Font("宋体",16),new SolidBrush(TextColor),new Point(150,Height/2));
用ASP.NET with C# 绘制曲线图(Curve图)                }

用ASP.NET with C# 绘制曲线图(Curve图)            }

由于X轴Y轴都有缩放,所以要设置两个编译量Offset1和Offset2,使曲线产生相应变化。

至此,曲线图完成,当然,画折线也是可以的,下图就是更改属性后生成的折线,数值和第一幅图片一样。

用ASP.NET with C# 绘制曲线图(Curve图)

由于int值和float值之间的转换有误差,所以设置缩放某些值的时候曲线会产生小许误差,知道如何解决的请指教,直接提出或Mail我,我Mail是[email protected]

收到很多朋友的Mail说代码不全,工作太忙近期都不能更新blog和讲解了。放出源代码,大家自己看吧!

点击下载Curve.rar

posted on 2006-07-27 15:09 KenBlove 阅读(353) 评论(5)  编辑 收藏 引用 网摘 所属分类: QS_Web之Chart

 

相关文章: