制作统计图__柱状图/饼图__可直接调用(附全码)
【需求】
最近做了个稍微有点复杂的投票系统,竟然忙活了一周,汗!~ 最后的投票统计,刚开始弄了个图片,根据数据来控制图片的长度,感觉太恶心了,而且没有技术含量,于是想弄个好看的图片来显示结果
【要点】
其实真做起来,发现主要是对Bitmap和Graphics两个类的简单操作,真正的难点还是数学的加减法,另外被除数为零的情况考虑下就行了.
【总结】
我把画统计图的方法抽出来了,供大家直接调用,我小学数学可是得过100分,做这玩意简直是小菜一碟!
【效果图】
下面那个统计就是控制图片的宽度来显示统计效果的.
【源码】前台页面没内容
1using System;
2using System.Collections;
3using System.ComponentModel;
4using System.Data;
5using System.Drawing;
6using System.Drawing.Imaging;
7using System.Web;
8using System.Web.SessionState;
9using System.Web.UI;
10using System.Web.UI.WebControls;
11using System.Web.UI.HtmlControls;
12
13namespace Vote
14{
15 /**//// <summary>
16 /// Chart 的摘要说明。
17 /// </summary>
18 public class Chart : System.Web.UI.Page
19 {
20 private void Page_Load(object sender, System.EventArgs e)
21 {
22 /**//*arrValues是数量
23 *AXzhz是与数量对应的内容(只能显示10个汉字)
24 *AX是主题
25 *只要把这三个参数设置好了,调用Initialize()方法就OK了
26 * */
27 float[] arrValues={10,110,50,0};
28 string[] AXzhz={"AX","AXzhz","斧头帮少帮主","Show me the money!"};
29 string AX="Hello World!";
30 Initialize(AX,arrValues,AXzhz);
31 }
32
33 private void Initialize(string AX,float[] arrValues,string[] AXzhz)
34 {
35 Graphics objGraphics;
36 Bitmap objBitMap=new Bitmap(400,225);
37 objGraphics=Graphics.FromImage(objBitMap);
38 objGraphics.Clear(Color.White);
39
40 //画主题
41 objGraphics.DrawString(AX,new Font("宋体",16),Brushes.Black,new Point(0,205));
42
43 PointF symbolLeg=new PointF(200,20);
44 PointF descLeg=new PointF(225,20);
45
46 //求出总数
47 float sglCurrentAngle=0;
48 float sglTotalAngle=0;
49
50 for(int a=0;a<arrValues.Length;a++)
51 {
52 sglTotalAngle+=arrValues[a];
53 }
54
55 //画出标识
56 for(int i=0;i<arrValues.Length;i++)
57 {
58 objGraphics.DrawRectangle(Pens.Black,symbolLeg.X,symbolLeg.Y,20,10);
59 objGraphics.FillRectangle(new SolidBrush(GetColor(i)),symbolLeg.X,symbolLeg.Y,20,10);
60 if(sglTotalAngle!=0)
61 {
62 if(Convert.ToInt32(arrValues[i]*100/sglTotalAngle)<10)
63 {
64 objGraphics.DrawString(Convert.ToInt32(arrValues[i]*100/sglTotalAngle)+"% "+AXzhz[i],new Font("宋体",10),Brushes.Black,descLeg);
65 }
66 else if(Convert.ToInt32(arrValues[i]*100/sglTotalAngle)==100)
67 {
68 objGraphics.DrawString(Convert.ToInt32(arrValues[i]*100/sglTotalAngle)+"% "+AXzhz[i],new Font("宋体",10),Brushes.Black,descLeg);
69 }
70 else
71 {
72 objGraphics.DrawString(Convert.ToInt32(arrValues[i]*100/sglTotalAngle)+"% "+AXzhz[i],new Font("宋体",10),Brushes.Black,descLeg);
73 }
74 }
75 else
76 {
77 objGraphics.DrawString("0% "+AXzhz[i],new Font("宋体",10),Brushes.Black,descLeg);
78 }
79 symbolLeg.Y+=15;
80 descLeg.Y+=15;
81 }
82
83 //画出矩形
84 for(int j=0;j<arrValues.Length;j++)
85 {
86 if(sglTotalAngle!=0)
87 {
88 objGraphics.FillRectangle(new SolidBrush(GetColor(j)),(j*35)+15,200-arrValues[j]*200/sglTotalAngle,20,arrValues[j]*200/sglTotalAngle+1);
89 objGraphics.DrawRectangle(Pens.Black,(j*35)+15,200-arrValues[j]*200/sglTotalAngle,20,arrValues[j]*200/sglTotalAngle+1);
90 }
91 else
92 {
93 objGraphics.FillRectangle(new SolidBrush(GetColor(j)),(j*35)+15,199,20,arrValues[j]+1);
94 objGraphics.DrawRectangle(Pens.Black,(j*35)+15,199,20,arrValues[j]+1);
95 }
96 }
97
98 //画圆
99 float sum=0;
100 for(int b=0;b<arrValues.Length;b++)
101 {
102 if(sglTotalAngle!=0)
103 {
104 sglCurrentAngle=arrValues[b]/sglTotalAngle*360;
105 objGraphics.FillPie(new SolidBrush(GetColor(b)),220,110,100,100,sum,sglCurrentAngle);
106 objGraphics.DrawPie(Pens.Black,220,110,100,100,sum,sglCurrentAngle);
107 sum+=sglCurrentAngle;
108 }
109 else
110 {
111 objGraphics.FillPie(new SolidBrush(GetColor(b)),220,110,100,100,0,0);
112 objGraphics.DrawPie(Pens.Black,220,110,100,100,0,360);
113 }
114 }
115
116 //输出图片
117 objBitMap.Save(Response.OutputStream,ImageFormat.Gif);
118 }
119
120 //颜色设置
121 private Color GetColor(int itemIndex)
122 {
123 Color objColor=new Color();
124 switch(itemIndex)
125 {
126 case 0:
127 objColor=Color.Blue;
128 break;
129 case 1:
130 objColor=Color.Yellow;
131 break;
132 case 2:
133 objColor=Color.Red;
134 break;
135 case 3:
136 objColor=Color.Orange;
137 break;
138 case 4:
139 objColor=Color.Purple;
140 break;
141 case 5:
142 objColor=Color.Brown;
143 break;
144 case 124:
145 objColor=Color.White;
146 break;
147 default:
148 objColor=Color.Blue;
149 break;
150 }
151 return objColor;
152 }
153
154 Web 窗体设计器生成的代码#region Web 窗体设计器生成的代码
155 override protected void OnInit(EventArgs e)
156 {
157 //
158 // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
159 //
160 InitializeComponent();
161 base.OnInit(e);
162 }
163
164 /**//// <summary>
165 /// 设计器支持所需的方法 - 不要使用代码编辑器修改
166 /// 此方法的内容。
167 /// </summary>
168 private void InitializeComponent()
169 {
170 this.Load += new System.EventHandler(this.Page_Load);
171
172 }
173 #endregion
174 }
175}
176
【后记】
传给这个页面参数时,
用控件:<asp:Image id="Image1" runat="server"></asp:Image>不能传递带绑定的参数
如果需要传递带绑定的参数,请使用:<img src="Chart.aspx">
【致谢】
感谢我的同事无私的让我使用了两晚上他的电脑,才有了这篇文章!
斧头帮少帮主 博客园
最近做了个稍微有点复杂的投票系统,竟然忙活了一周,汗!~ 最后的投票统计,刚开始弄了个图片,根据数据来控制图片的长度,感觉太恶心了,而且没有技术含量,于是想弄个好看的图片来显示结果
【要点】
其实真做起来,发现主要是对Bitmap和Graphics两个类的简单操作,真正的难点还是数学的加减法,另外被除数为零的情况考虑下就行了.
【总结】
我把画统计图的方法抽出来了,供大家直接调用,我小学数学可是得过100分,做这玩意简直是小菜一碟!
【效果图】
下面那个统计就是控制图片的宽度来显示统计效果的.
【源码】前台页面没内容
1using System;
2using System.Collections;
3using System.ComponentModel;
4using System.Data;
5using System.Drawing;
6using System.Drawing.Imaging;
7using System.Web;
8using System.Web.SessionState;
9using System.Web.UI;
10using System.Web.UI.WebControls;
11using System.Web.UI.HtmlControls;
12
13namespace Vote
14{
15 /**//// <summary>
16 /// Chart 的摘要说明。
17 /// </summary>
18 public class Chart : System.Web.UI.Page
19 {
20 private void Page_Load(object sender, System.EventArgs e)
21 {
22 /**//*arrValues是数量
23 *AXzhz是与数量对应的内容(只能显示10个汉字)
24 *AX是主题
25 *只要把这三个参数设置好了,调用Initialize()方法就OK了
26 * */
27 float[] arrValues={10,110,50,0};
28 string[] AXzhz={"AX","AXzhz","斧头帮少帮主","Show me the money!"};
29 string AX="Hello World!";
30 Initialize(AX,arrValues,AXzhz);
31 }
32
33 private void Initialize(string AX,float[] arrValues,string[] AXzhz)
34 {
35 Graphics objGraphics;
36 Bitmap objBitMap=new Bitmap(400,225);
37 objGraphics=Graphics.FromImage(objBitMap);
38 objGraphics.Clear(Color.White);
39
40 //画主题
41 objGraphics.DrawString(AX,new Font("宋体",16),Brushes.Black,new Point(0,205));
42
43 PointF symbolLeg=new PointF(200,20);
44 PointF descLeg=new PointF(225,20);
45
46 //求出总数
47 float sglCurrentAngle=0;
48 float sglTotalAngle=0;
49
50 for(int a=0;a<arrValues.Length;a++)
51 {
52 sglTotalAngle+=arrValues[a];
53 }
54
55 //画出标识
56 for(int i=0;i<arrValues.Length;i++)
57 {
58 objGraphics.DrawRectangle(Pens.Black,symbolLeg.X,symbolLeg.Y,20,10);
59 objGraphics.FillRectangle(new SolidBrush(GetColor(i)),symbolLeg.X,symbolLeg.Y,20,10);
60 if(sglTotalAngle!=0)
61 {
62 if(Convert.ToInt32(arrValues[i]*100/sglTotalAngle)<10)
63 {
64 objGraphics.DrawString(Convert.ToInt32(arrValues[i]*100/sglTotalAngle)+"% "+AXzhz[i],new Font("宋体",10),Brushes.Black,descLeg);
65 }
66 else if(Convert.ToInt32(arrValues[i]*100/sglTotalAngle)==100)
67 {
68 objGraphics.DrawString(Convert.ToInt32(arrValues[i]*100/sglTotalAngle)+"% "+AXzhz[i],new Font("宋体",10),Brushes.Black,descLeg);
69 }
70 else
71 {
72 objGraphics.DrawString(Convert.ToInt32(arrValues[i]*100/sglTotalAngle)+"% "+AXzhz[i],new Font("宋体",10),Brushes.Black,descLeg);
73 }
74 }
75 else
76 {
77 objGraphics.DrawString("0% "+AXzhz[i],new Font("宋体",10),Brushes.Black,descLeg);
78 }
79 symbolLeg.Y+=15;
80 descLeg.Y+=15;
81 }
82
83 //画出矩形
84 for(int j=0;j<arrValues.Length;j++)
85 {
86 if(sglTotalAngle!=0)
87 {
88 objGraphics.FillRectangle(new SolidBrush(GetColor(j)),(j*35)+15,200-arrValues[j]*200/sglTotalAngle,20,arrValues[j]*200/sglTotalAngle+1);
89 objGraphics.DrawRectangle(Pens.Black,(j*35)+15,200-arrValues[j]*200/sglTotalAngle,20,arrValues[j]*200/sglTotalAngle+1);
90 }
91 else
92 {
93 objGraphics.FillRectangle(new SolidBrush(GetColor(j)),(j*35)+15,199,20,arrValues[j]+1);
94 objGraphics.DrawRectangle(Pens.Black,(j*35)+15,199,20,arrValues[j]+1);
95 }
96 }
97
98 //画圆
99 float sum=0;
100 for(int b=0;b<arrValues.Length;b++)
101 {
102 if(sglTotalAngle!=0)
103 {
104 sglCurrentAngle=arrValues[b]/sglTotalAngle*360;
105 objGraphics.FillPie(new SolidBrush(GetColor(b)),220,110,100,100,sum,sglCurrentAngle);
106 objGraphics.DrawPie(Pens.Black,220,110,100,100,sum,sglCurrentAngle);
107 sum+=sglCurrentAngle;
108 }
109 else
110 {
111 objGraphics.FillPie(new SolidBrush(GetColor(b)),220,110,100,100,0,0);
112 objGraphics.DrawPie(Pens.Black,220,110,100,100,0,360);
113 }
114 }
115
116 //输出图片
117 objBitMap.Save(Response.OutputStream,ImageFormat.Gif);
118 }
119
120 //颜色设置
121 private Color GetColor(int itemIndex)
122 {
123 Color objColor=new Color();
124 switch(itemIndex)
125 {
126 case 0:
127 objColor=Color.Blue;
128 break;
129 case 1:
130 objColor=Color.Yellow;
131 break;
132 case 2:
133 objColor=Color.Red;
134 break;
135 case 3:
136 objColor=Color.Orange;
137 break;
138 case 4:
139 objColor=Color.Purple;
140 break;
141 case 5:
142 objColor=Color.Brown;
143 break;
144 case 124:
145 objColor=Color.White;
146 break;
147 default:
148 objColor=Color.Blue;
149 break;
150 }
151 return objColor;
152 }
153
154 Web 窗体设计器生成的代码#region Web 窗体设计器生成的代码
155 override protected void OnInit(EventArgs e)
156 {
157 //
158 // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
159 //
160 InitializeComponent();
161 base.OnInit(e);
162 }
163
164 /**//// <summary>
165 /// 设计器支持所需的方法 - 不要使用代码编辑器修改
166 /// 此方法的内容。
167 /// </summary>
168 private void InitializeComponent()
169 {
170 this.Load += new System.EventHandler(this.Page_Load);
171
172 }
173 #endregion
174 }
175}
176
【后记】
传给这个页面参数时,
用控件:<asp:Image id="Image1" runat="server"></asp:Image>不能传递带绑定的参数
如果需要传递带绑定的参数,请使用:<img src="Chart.aspx">
【致谢】
感谢我的同事无私的让我使用了两晚上他的电脑,才有了这篇文章!
斧头帮少帮主 博客园
少帮主的斧头好久不饮血了!