统计图形种类繁多, 有柱状图, 折线图, 扇形图等等, 而统计图形的绘制方法也有很多, 有Flash制作的统计图形, 有水晶报表生成统计图形, 有专门制图软件制作, 也有编程语言自己制作的;这里我们用就C# 制作三款最经典的统计图: 柱状图, 折线图和扇形图;既然是统计, 当然需要数据, 这里演示的数据存于Sql Server2000中, 三款统计图形都是动态生成. 其中柱状图我会附上制作步骤, 其他两款统计图直接附源码.
说明: 需求不一样, 统计图形绘制后的显示效果也不一样, 比如这里柱状图的主要需求是为了比较每一期报名人数与通过人数的差, 因此会把两根柱子放在一起会使比较结果一目了然. 因此大家可以根据需要灵活绘制.
一. 柱状图的绘制.
绘制步骤如下:
1. 定义绘图用到的类.
定义绘图类
int height = 500 , width = 700 ; Bitmap image = new Bitmap(width, height); Graphics g = Graphics.FromImage(image); Pen mypen = new Pen(brush, 1 );
2. 绘制图框.
绘制图框
g.FillRectangle(Brushes.WhiteSmoke, 0 , 0 , width, height);
3. 绘制横向坐标线
绘制横向坐标线
for ( int i = 0 ; i < 14 ; i ++ ) {
g.DrawLine(mypen, x, 80 , x, 340 ); x = x + 40 ; }
4. 绘制纵向坐标线
绘制纵向坐标线
for ( int i = 0 ; i < 9 ; i ++ ) {
g.DrawLine(mypen, 60 , y, 620 , y); y = y + 26 ; }
5. 绘制横坐标值
绘制横坐标值
String[] n = { " 第一期 " , " 第二期 " , " 第三期 " , " 第四期 " , " 全年 " }; for ( int i = 0 ; i < 7 ; i ++ ) {
g.DrawString(n[i].ToString(), font, Brushes.Blue, x, 348 ); x = x + 78 ; }
6. 绘制纵坐标值
绘制纵坐标
String[] m = {
" 250 " , " 225 " , " 200 " , " 175 " , " 150 " , " 125 " , " 100“}; for ( int i = 0 ; i < 10 ; i ++ ) {
g.DrawString(m[i].ToString(), font, Brushes.Blue, 25 , y); y = y + 26 ; }
7. 定义数组存储数据库中统计的数据
定义存储统计数据的数组
int [] Count1 = new int [ 7 ]; // 存储从数据库读取的报名人数 int [] Count2 = new int [ 7 ]; // 存储从数据库读取的通过人数
8. 从数据库中读取报名人数与通过人数
读取数据
SqlConnection Con = new SqlConnection( " Server=(Local);Database=committeeTraining; " ); Con.Open(); string cmdtxt2 = " SELECT * FROM ##Count where Company = ' " + ****+ " '" ; SqlDataAdapter da = new SqlDataAdapter(cmdtxt2, Con); DataSet ds = new DataSet(); da.Fill(ds);
9. 将读取的数据存储到数组中
将数据存储到数组中
Count1[ 0 ] = Convert.ToInt32(ds.Tables[ 0 ].Rows[ 0 ][“count1”].ToString()); Count1[ 1 ] = Convert.ToInt32(ds.Tables[ 0 ].Rows[ 0 ][“count3”].ToString()); Count2[ 0 ] = Convert.ToInt32(ds.Tables[ 0 ].Rows[ 0 ][“count2”].ToString()); Count2[ 1 ] = Convert.ToInt32(ds.Tables[ 0 ].Rows[ 0 ][ " count4 " ].ToString());
10. 定义画笔和画刷准备绘图
准备绘制柱状图
x = 80 ; Font font2 = new System.Drawing.Font( " Arial " , 10 , FontStyle.Bold); SolidBrush mybrush = new SolidBrush(Color.Red); SolidBrush mybrush2 = new SolidBrush(Color.Green);
11. 根据数组中的值绘制柱状图
绘制柱状图
(1 )第一期报名人数 g.FillRectangle(mybrush, x, 340 - Count1[ 0 ], 20 , Count1[ 0 ]); g.DrawString(Count1[ 0 ].ToString(), font2, Brushes.Red, x, 340 - Count1[ 0 ] - 15 ); ( 2 ) 第一期通过人数 x = x + 20 ; g.FillRectangle(mybrush2, x, 340 - Count2[ 0 ], 20 , Count2[ 0 ]); g.DrawString(Count2[ 0 ].ToString(), font2, Brushes.Green, x, 340 - Count2[ 0 ] - 15 );
12. 将图形输出到页面.
将页面输出到页中
System.IO.MemoryStream ms = new System.IO.MemoryStream(); image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); Response.ClearContent(); Response.ContentType = " image/Jpeg " ; Response.BinaryWrite(ms.ToArray());
最终柱状图的效果图:
柱状图的完整代码:
绘制柱状统计图的完整代码
private void CreateImage() {
int height = 500 , width = 700 ; Bitmap image = new Bitmap(