制作统计图__柱状图/饼图__可直接调用(附全码)
【需求】
最近做了个稍微有点复杂的投票系统,竟然忙活了一周,汗!~ 最后的投票统计,刚开始弄了个图片,根据数据来控制图片的长度,感觉太恶心了,而且没有技术含量,于是想弄个好看的图片来显示结果
【要点】
其实真做起来,发现主要是对Bitmap和Graphics两个类的简单操作,真正的难点还是数学的加减法,另外被除数为零的情况考虑下就行了.
【总结】
我把画统计图的方法抽出来了,供大家直接调用,我小学数学可是得过100分,做这玩意简直是小菜一碟!
【效果图】
下面那个统计就是控制图片的宽度来显示统计效果的.
![]()
【源码】前台页面没内容
![]()
![]()
1
using System;
2
using System.Collections;
3
using System.ComponentModel;
4
using System.Data;
5
using System.Drawing;
6
using System.Drawing.Imaging;
7
using System.Web;
8
using System.Web.SessionState;
9
using System.Web.UI;
10
using System.Web.UI.WebControls;
11
using System.Web.UI.HtmlControls;
12![]()
13
namespace 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分,做这玩意简直是小菜一碟!
【效果图】
下面那个统计就是控制图片的宽度来显示统计效果的.
【源码】前台页面没内容
1
using System;2
using System.Collections;3
using System.ComponentModel;4
using System.Data;5
using System.Drawing;6
using System.Drawing.Imaging;7
using System.Web;8
using System.Web.SessionState;9
using System.Web.UI;10
using System.Web.UI.WebControls;11
using System.Web.UI.HtmlControls;12

13
namespace Vote14


{15

/**//// <summary>16
/// Chart 的摘要说明。17
/// </summary>18
public class Chart : System.Web.UI.Page19

{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
else71

{72
objGraphics.DrawString(Convert.ToInt32(arrValues[i]*100/sglTotalAngle)+"% "+AXzhz[i],new Font("宋体",10),Brushes.Black,descLeg);73
}74
}75
else76

{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
else92

{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
else110

{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
#endregion174
}175
}176

【后记】
传给这个页面参数时,
用控件:<asp:Image id="Image1" runat="server"></asp:Image>不能传递带绑定的参数
如果需要传递带绑定的参数,请使用:<img src="Chart.aspx">
【致谢】
感谢我的同事无私的让我使用了两晚上他的电脑,才有了这篇文章!
斧头帮少帮主 博客园
少帮主的斧头好久不饮血了!
浙公网安备 33010602011771号