asp.net 显示折线图

来源:互联网 发布:淘宝搜索购买过的店铺 编辑:程序博客网 时间:2024/05/16 08:22

//需引用的命名空间
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;

  private int[] arrValuesSJ ; //数据数组
  private int[] arrValuesFJ ; //数据数组
  private string[] arrValueNames;

  private void Page_Load(object sender, System.EventArgs e)
  {
   DateTime m_date = Convert.DateTime("1999-1-1");
   int eDay=30;
   
   arrValueNames = new string[eDay];
   arrValuesSJ = new int[eDay];
   arrValuesFJ = new int[eDay];

   FillArr(m_date);
   DrawMap(eDay);
  } 
  
  private void FillArr()
  {
   for(int i = 0; i < arrValueNames.Length; i++ )
   {
    try
    {
     arrValueNames[i] = m_date.AddDays(i).Day.ToString();
     arrValuesSJ[i] = i*50;
     arrValuesFJ[i] = i*100;
    }
    catch(Exception ex)
    {
     string sError = ex.ToString();
    }
   }
  }
  private void DrawMap(int eDay)
  {
   /**//*自写编码*/
   int ImgWidth=610;        //1.[总宽度]            ***图宽度  
   int ImgHeight=400;        //2.[总高度]            ***图高度       
   int ItemNum=eDay;            //3.[项目数量]            ***图表划分的块           
   int ChildNum=2;            //4.[块数]                ***大块中划分的子项的数量
   float ChildRate=0.7f;    //5.[各块总占空间比率]
   int ChartLeft=50;        //7.[图表左边距]        ***图表距图的左边距离
   int ChartRight=20;        //8.[图表右边距]        ***图表距图的右边距离
   int ChartTop=20;        //9.[图表顶边距]        ***图表距图顶边距离
   int ChartBottom=80;        //10.[图表底边距]        ***图表距图底边距离
   double YMaxValue=200.0;        //11.[纵坐标标尺最大值]    ***纵坐标标尺的最大值
   int YItemNum=10;        //12.[纵坐标标尺段数]    ***纵坐标标尺的段数
   int YTop=15;            //13.[距纵轴顶端间隔]
   int YStrStart=15;        //14.[纵坐标标尺文字起始X坐标]
   int XRight=20;            //15.[距横轴右端间隔]
   int XStrStart=10;        //16.[横坐标标尺文字起始Y坐标]
   StringFormat sf;

   //[图表总宽度]=[总宽度]-[图表左边距]-[图表右边距]-[距横轴右端间隔]
   int chartwidth=ImgWidth-ChartLeft-ChartRight-XRight;
   //[项目宽度]=[图表总宽度]/[项目数量]
   int itemwidth=chartwidth/ItemNum;
   //[各块总占空间比率的实际宽度]=[项目宽度]*[各块总占空间比率]
   int factwidth=Convert.ToInt32(Math.Floor(itemwidth*ChildRate));
   //[各块矩形宽度]=[各块总占空间比率的实际宽度]/[块数]
   int rectanglewidth=factwidth/ChildNum;
   //[各块间的间距]=([项目宽度]-[各块总占空间比率的实际宽度])/([块数]+1)
   //int childspace=Convert.ToInt32(Math.Floor((itemwidth-factwidth)/(ChildNum+1)));
   int chartheight = ImgHeight-ChartTop-ChartBottom-YTop;

   double rectangleheight = (ImgHeight-ChartTop-ChartBottom-YTop)/YMaxValue;
   int childspace=Convert.ToInt32(Math.Floor(itemwidth-factwidth));

   Graphics objGps;//建立画板对象
   Bitmap objBitMap = new Bitmap(ImgWidth,ImgHeight);//建立位图对象
   objGps = Graphics.FromImage(objBitMap);//根据位图对象建立画板对象B
   objGps.Clear(Color.White);//设置画板对象的背景色
   
      
   //得出矩形宽度,和画图X轴位置

   //[项目宽度]=[总宽度]/[项目数量]
   //======[各块总占空间比率]=([各块矩形宽度]+[各块间的间距])/[项目宽度]
   //[各块总占空间比率的实际宽度]=[项目宽度]*[各块总占空间比率]
   //[各块矩形宽度]=([各块总占空间比率的实际宽度]-[各块间的间距]*([块数]))/[块数]
   //[一边空余空间宽度]=([项目宽度]-[各块所占空间比率的总宽度])/2 

   System.Drawing.Point[] pis=new Point[arrValuesSJ.Length];    //定义折线点的对象数组
   System.Drawing.Point[] pif=new Point[arrValuesFJ.Length];    //定义折线点的对象数组

   System.Drawing.Point[] pit=new Point[3];    //定义坐标三角点的对象数组
   System.Drawing.Pen pe=new Pen(new SolidBrush(GetColor(7)),2f);    //定义画直线的对象
   System.Drawing.Pen pes=new Pen(new SolidBrush(GetColor(0)),3f);    //定义画直线的对象
   System.Drawing.Pen pef=new Pen(new SolidBrush(GetColor(2)),3f);    //定义画直线的对象

   //画纵轴
   objGps.DrawLine(pe,new Point(ChartLeft,ImgHeight-ChartBottom),new Point(ChartLeft,ChartTop));
   //画纵轴终点箭头
   pit[0].X=ImgWidth-ChartRight;    //确定三角形三点的位置
   pit[0].Y=ImgHeight-ChartBottom-4;
   pit[1].X=ImgWidth-ChartRight;
   pit[1].Y=ImgHeight-ChartBottom+4;
   pit[2].X=ImgWidth-ChartRight+10;
   pit[2].Y=ImgHeight-ChartBottom;
   objGps.FillPolygon(new SolidBrush(GetColor(7)),pit);
   //画纵轴标尺和标尺描述
   int ys;
   for(int i=1;i<=YItemNum;i++)
   {
    //画标尺
    objGps.DrawLine(pe,new PointF(ChartLeft,ImgHeight-ChartBottom-(ImgHeight-ChartBottom-ChartTop-YTop)/YItemNum*i),new PointF(ChartLeft-5,ImgHeight-ChartBottom-(ImgHeight-ChartBottom-ChartTop-YTop)/YItemNum*i));
    //画描述
    ys = Convert.ToInt32(YMaxValue)/YItemNum*i;
    objGps.DrawString(ys.ToString(),new Font("宋体",10),Brushes.Black,new Point(YStrStart,ImgHeight-ChartBottom-(ImgHeight-ChartBottom-ChartTop-YTop)/YItemNum*i-5));
   }
   objGps.DrawString("收发量",new Font("宋体",10),Brushes.Black,new Point(YStrStart-15,ChartTop+YTop-25));
   //画横轴
   objGps.DrawLine(pe,new Point(ChartLeft,ImgHeight-ChartBottom),new Point(ImgWidth-ChartRight,ImgHeight-ChartBottom));
   //画横轴终点箭头
   pit[0].X=ChartLeft-4;    //确定三角形三点的位置
   pit[0].Y=ChartTop;
   pit[1].X=ChartLeft+4;
   pit[1].Y=ChartTop;
   pit[2].X=ChartLeft;
   pit[2].Y=ChartTop-10;
   objGps.FillPolygon(new SolidBrush(GetColor(7)),pit);
   //画横轴标尺和标尺描述
   for(int i=1;i<=ItemNum;i++)
   {
    sf = new StringFormat();
    sf.FormatFlags = StringFormatFlags.DirectionVertical;
    
    objGps.DrawLine(pe,new PointF(ChartLeft+itemwidth*i,ImgHeight-ChartBottom),new PointF(ChartLeft+itemwidth*i,ImgHeight-ChartBottom+5));
    objGps.DrawString(arrValueNames[i-1].ToString(),new Font("宋体",9),Brushes.Black,new Point(ChartLeft-5+itemwidth*i,ImgHeight-ChartBottom+XStrStart));
   }
   objGps.DrawString("日期",new Font("宋体",9),Brushes.Black,new Point(ImgWidth-ChartRight-XRight+15,ImgHeight-ChartBottom+XStrStart));
   
   for(int j = 0;j<arrValueNames.Length;j++)
   {
    //画折线图
    pis[j].X=(j+1)*itemwidth+ChartLeft;
    pis[j].Y=ImgHeight-ChartBottom-Convert.ToInt32(arrValuesSJ[j]*rectangleheight);
    pes.SetLineCap(System.Drawing.Drawing2D.LineCap.RoundAnchor,System.Drawing.Drawing2D.LineCap.RoundAnchor,System.Drawing.Drawing2D.DashCap.Round);
    if(j>0)
     objGps.DrawLine(pes,pis[j-1],pis[j]);

    pif[j].X=(j+1)*itemwidth+ChartLeft;
    pif[j].Y=ImgHeight-ChartBottom-Convert.ToInt32(arrValuesFJ[j]*rectangleheight);
    pef.SetLineCap(System.Drawing.Drawing2D.LineCap.RoundAnchor,System.Drawing.Drawing2D.LineCap.RoundAnchor,System.Drawing.Drawing2D.DashCap.Round);
    if(j>0)
     objGps.DrawLine(pef,pif[j-1],pif[j]);

   }
   pif[0].X=chartwidth-30;
   pif[0].Y=ChartTop+YTop+10;
   pif[1].X=chartwidth-20;
   pif[1].Y=ChartTop+YTop+10;

   pef.SetLineCap(System.Drawing.Drawing2D.LineCap.RoundAnchor,System.Drawing.Drawing2D.LineCap.RoundAnchor,System.Drawing.Drawing2D.DashCap.Round);
   objGps.DrawLine(pef,pif[0],pif[1]);
   objGps.DrawString("发件量",new Font("宋体",8),Brushes.Black,new Point(chartwidth-10,ChartTop+YTop+5));
   
   pis[0].X=chartwidth-30;
   pis[0].Y=ChartTop+YTop+25;
   pis[1].X=chartwidth-20;
   pis[1].Y=ChartTop+YTop+25;

   pes.SetLineCap(System.Drawing.Drawing2D.LineCap.RoundAnchor,System.Drawing.Drawing2D.LineCap.RoundAnchor,System.Drawing.Drawing2D.DashCap.Round);
   objGps.DrawLine(pes,pis[0],pis[1]);
   objGps.DrawString("收件量",new Font("宋体",8),Brushes.Black,new Point(chartwidth-10,ChartTop+YTop+20));

   objBitMap.Save(Response.OutputStream,ImageFormat.Gif);//该位图对象以"GIF"格式输出
  }

  /// <param name="itemIndex">系统定义的颜色,有效值0到7,分别为(Blue,Yellow,Red,Orange,Purple,Brown,Pink,Black)</param>
  /// <returns></returns>
  public static Color GetColor(int itemIndex)
  {
   Color objColor = new Color();
   switch(itemIndex)
   {
    case 0:
     objColor = Color.Blue;
     break;
    case 1:
     objColor = Color.Yellow;
     break;
    case 2:
     objColor = Color.Red;
     break;
    case 3:
     objColor = Color.Orange;
     break;
    case 4:
     objColor = Color.Purple;
     break;
    case 5:
     objColor = Color.Brown;
     break;
    case 6:
     objColor = Color.Pink;
     break;
    default:
     objColor = Color.Black;
     break;
   }

   return objColor;
  }

  /// <param name="red">自定义颜色红色分量值,有效值0到255</param>
  /// <param name="green">自定义颜色绿色分量值,有效值0到255</param>
  /// <param name="blue">自定义颜色蓝色分量值,有效值0到255</param>
  /// <returns></returns>
  public static Color GetColor(int red,int green,int blue)
  {
   Color objColor = new Color();
   objColor = Color.FromArgb(red,green,blue);
   return objColor;
  } 

原创粉丝点击