• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
激情 希望 斗志昂扬
Records of growth process 专注微软技术
博客园    首页    新随笔    联系   管理    订阅  订阅

ASP.Net绘制柱状图和曲线图示例

public partial class Default2 : System.Web.UI.Page
{
    
protected void Page_Load(object sender, EventArgs e)
    {
        
int widthvalue = 800;
        
int heightvalue = 500;
        
string xTile, yTitle;
        
int offsetX = 20;
        
int offsetY = 20;
        
//柱状之间的间距
        int spaceSpan = 15;

        xTile 
= "Title";
        yTitle 
= "Sum";

        Bitmap imgbitmap 
= new Bitmap(widthvalue + 5 * offsetX, heightvalue + 2 * offsetY, PixelFormat.Format32bppArgb);
        Graphics g 
= Graphics.FromImage(imgbitmap);
        g.Clear(Color.Snow);
        Pen linePen 
= new Pen(Color.Black);
        linePen.Width 
= 2;
        
//Draw Title
        Font txtFont = new Font("Courier", 10, GraphicsUnit.Point);
        String title 
= "This is the title to be displayed";
        g.DrawString(title, txtFont, Brushes.Blue, 
new PointF(imgbitmap.Width / 2, 0));
        Point original 
= new Point(offsetX, heightvalue + offsetY);
        Point xEndPonit 
= new Point(widthvalue + offsetX, heightvalue + offsetY);
        Point yEndPonit 
= new Point(offsetX, 0);
        
//X coordinate
        g.DrawLine(linePen, original, xEndPonit);
        
//Y Coordinate
        g.DrawLine(linePen, original, yEndPonit);
        
//Draw arrows
        Point leftArrowStart = new Point(offsetX * 3 / 4, offsetY / 3);
        Point rightArrowEnd 
= new Point(offsetX * 5 / 4, offsetY / 3);
        g.DrawLine(linePen, leftArrowStart, yEndPonit);
        g.DrawLine(linePen, yEndPonit, rightArrowEnd);

        Point topArrowStart 
= new Point(widthvalue + offsetX * 3 / 4, heightvalue + offsetY * 3 / 4);
        Point bottomArrowEnd 
= new Point(widthvalue + offsetX * 3 / 4, heightvalue + offsetY * 5 / 4);
        g.DrawLine(linePen, topArrowStart, xEndPonit);
        g.DrawLine(linePen, xEndPonit, bottomArrowEnd);

        
//Draw X-Title
        g.DrawString(xTile, txtFont, Brushes.Blue, new PointF(bottomArrowEnd.X - g.MeasureString(xTile, txtFont).Width, topArrowStart.Y + 10));
        StringFormat f 
= new StringFormat();
        
//f.Alignment = StringAlignment.Center;
        
//Draw Y-Title
        f.LineAlignment = StringAlignment.Center;
        g.DrawString(yTitle, txtFont, Brushes.Blue, 
new PointF(offsetX * 5 / 3, 15), f);

        
//画单个柱状图的代码

        
//测试数据
        /**
        int[] staticData = new int[]{20,30,80,50,200,120,20,30,80,50,200,120,60,90,140};
  
        int maxValue = MaxValue(staticData);
  
        int ratio = heightvalue/maxValue;
        int groupCount = staticData.Length; //柱状图组数
        ResetValue(staticData,ratio);
  
        int rectWidth = (widthvalue - (groupCount +1)*spaceSpan )/ groupCount;
        Rectangle rect;
        int startX = offsetX + spaceSpan; //起始坐标点
        for(int i=0;i
        {
          rect = new Rectangle(startX,heightvalue +offsetY - staticData,rectWidth,staticData);
          g.DrawRectangle(Pens.Green,rect);
          g.FillRectangle(Brushes.Green,rect);
          startX = startX + rectWidth + spaceSpan;
        }
        *
*/
        
//  Type t = dataList.GetType();
        
//  if(t.IsArray)
        
//  {
        
//  }
        
//画分组柱状图代码
        ArrayList dataList = new ArrayList();
        
int[] data1 = new int[] { 20, 30, 50, 100 };
        
int[] data2 = new int[] { 50, 60, 30, 30 };
        
int[] data3 = new int[] { 80, 50, 60, 85 };
        
int[] data4 = new int[] { 20, 30, 90, 58 };
        
int[] data5 = new int[] { 50, 60, 30, 30 };
        
int[] data6 = new int[] { 80, 50, 60, 85 };
        
int[] data7 = new int[] { 20, 30, 90, 58 };
        dataList.Add(data1);
        dataList.Add(data2);
        dataList.Add(data3);
        dataList.Add(data4);
        dataList.Add(data5);
        dataList.Add(data6);
        dataList.Add(data7);
        
int maxValue = MaxValue(dataList);
        
int ratio = heightvalue / maxValue;
        
int groupCount = dataList.Count; //柱状图组数
        ResetValue(dataList, ratio);


        
//根据比率画坐标
        
//Draw X-Grids, The height value is divided into 10 parts
        int heightStep = heightvalue / 10;
        Point point1, point2;
        
for (int i = 1; i <= 10; i++)
        {
            point1 
= new Point(offsetX * 3 / 4, offsetY + heightvalue - heightStep * i);
            point2 
= new Point(offsetX, point1.Y);
            g.DrawLine(Pens.Black, point1, point2);
            String text 
= maxValue / 10 * i + "";
            g.DrawString(text, txtFont, Brushes.Blue, 
new PointF(-2, point1.Y));
        }

        
//画坐标结束
  int rectWidth = (widthvalue - (groupCount +1)*spaceSpan )/ groupCount;
  
int innerGroupCount = GetInnerGroupCount(dataList);
  
int innerWidth = rectWidth / innerGroupCount;
  Rectangle rect;
  
int startX = offsetX + spaceSpan; //起始坐标点
  for(int i=0;i<dataList.Count;i++)
  {
    
int[] staticData = (int[])dataList;
    
for(int j=0;j<staticData.Length;j++)
    {
    rect 
= new Rectangle(startX,heightvalue +offsetY - staticData[j],innerWidth,staticData[j]);
    g.DrawRectangle(GetPenColor(j),rect);
    g.FillRectangle(GetBrushColor(j),rect);
    startX 
= startX + innerWidth;
    }
    startX 
= startX + spaceSpan;
  }

        
//画曲线
  Point pnt1 = new Point(200+offsetX,heightvalue+offsetY-300);
  Point pnt2 
= new Point(300+offsetX,heightvalue+offsetY-500);
  Point pnt3 
= new Point(400+offsetX,heightvalue+offsetY-300);
  Point pnt4 
= new Point(600+offsetX,heightvalue+offsetY-600);
        g.DrawCurve(Pens.Purple,
new Point[]{pnt1,pnt2,pnt3,pnt4});
  
//g.DrawCurve(Pens.Purple,new Point[]{pnt1,pnt2,pnt3,pnt4});
  
//画饼图
  g.DrawPie ( Pens.Red , 50 , 50 , 150 , 150 , 0 , 30 ) ;
  imgbitmap.Save(Response.OutputStream,ImageFormat.Gif);
    }

    
private int MaxValue(int[] data)
  {
int maxValue = 0;
  
for(int i=0;i<data.Length;i++)
  {
    
if(data>maxValue)
    maxValue 
= data;
  }
  
return maxValue;
  }
    
private int MaxValue(ArrayList dataList)
    {
        
int maxValue = 0;
        
for (int i = 0; i < dataList.Count; i++)
        {
            
int newMaxValue = MaxValue((int[])dataList);
            
if (newMaxValue > maxValue)
                maxValue 
= newMaxValue;
        }
        
return maxValue;
    }
    
private void ResetValue(int[] data, int ratio)
    {
        
for (int i = 0; i < data.Length; i++)
            data 
*= ratio;
    }
    
private void ResetValue(ArrayList dataList, int ratio)
    {
        
for (int i = 0; i < dataList.Count; i++)
        {
            ResetValue((
int[])dataList, ratio);
        }
    }
    
private int GetInnerGroupCount(ArrayList dataList)
    {
        
int groupCount = 0;
        
for (int i = 0; i < dataList.Count; i++)
        {
            
int count = ((int[])dataList).Length;
            
if (count > groupCount)
                groupCount 
= count;
        }
        
return groupCount;
    }
    
private Pen GetPenColor(int index)
    {
        Pen linePen 
= new Pen(Color.Black);
        linePen.Width 
= 1;
        linePen.CompoundArray 
= new float[] { 0.0F, 0.2F };
        
switch (index)
        {
            
case 0:
                linePen.Color 
= Color.Gray;
                
break;
            
case 1:
                linePen.Color 
= Color.Green;
                
break;
            
case 2:
                linePen.Color 
= Color.Blue;
                
break;
            
case 3:
                linePen.Color 
= Color.Purple;
                
break;
        }
        
return linePen;
    }
    
private Brush GetBrushColor(int index)
    {
        
switch (index)
        {
            
case 0:
                
return Brushes.Gray;
            
case 1:
                
return Brushes.Green;
            
case 2:
                
return Brushes.Blue;
            
case 3:
                
return Brushes.Purple;
        }
        
return Brushes.Red;
    }
}
posted @ 2009-03-23 21:11  贤  阅读(713)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3