C# 绘制统计图(柱状图, 折线图, 扇形图)

转贴:http://www.cnblogs.com/ly5201314/archive/2009/04/01/1427226.html

 

private void CreateImage()
{
int height = 500, width = 700
;
Bitmap image
= new
Bitmap(width, height);
//创建Graphics类对象

Graphics g = Graphics.FromImage(image);

try

{
//清空图片背景色
g.Clear(Color.White);

Font font
= new Font("Arial", 10
, FontStyle.Regular);
Font font1
= new Font("宋体", 20
, FontStyle.Bold);

LinearGradientBrush brush
= new LinearGradientBrush(new Rectangle(0, 0
, image.Width, image.Height),
Color.Blue, Color.BlueViolet,
1.2f, true
);
g.FillRectangle(Brushes.WhiteSmoke,
0, 0
, width, height);
// Brush brush1 = new SolidBrush(Color.Blue);


g.DrawString(
this.ddlTaget.SelectedItem.Text + " " + this.ddlYear.SelectedItem.Text +
" 成绩统计柱状图", font1, brush, new PointF(70, 30
));
//画图片的边框线

g.DrawRectangle(new Pen(Color.Blue), 0, 0, image.Width - 1, image.Height - 1);


Pen mypen
= new Pen(brush, 1
);
//
绘制线条
//绘制横向线条

int x = 100;
for (int i = 0; i < 14; i++
)
{
g.DrawLine(mypen, x,
80, x, 340
);
x
= x + 40
;
}
Pen mypen1
= new Pen(Color.Blue, 2
);
x
= 60
;
g.DrawLine(mypen1, x,
80, x, 340
);

//绘制纵向线条

int y = 106;
for (int i = 0; i < 9; i++
)
{
g.DrawLine(mypen,
60, y, 620
, y);
y
= y + 26
;
}
g.DrawLine(mypen1,
60, y, 620
, y);

//x轴

String[] n = { "第一期", "第二期", "第三期", "第四期", "上半年", "下半年", "全年统计" };
x
= 78
;
for (int i = 0; i < 7; i++
)
{
g.DrawString(n[i].ToString(), font, Brushes.Blue, x,
348); //设置文字内容及输出位置

x = x + 78;
}

//y轴

String[] m = {"250","225", "200", "175", "150", "125", "100", " 75",
" 50", " 25", " 0"
};
y
= 72
;
for (int i = 0; i < 10; i++
)
{
g.DrawString(m[i].ToString(), font, Brushes.Blue,
25, y); //设置文字内容及输出位置

y = y + 26;
}

int[] Count1 = new int[7
];
int[] Count2 = new int[7
];

SqlConnection Con
= new SqlConnection("Server=(Local);Database=committeeTraining;Uid=sa;Pwd=**"
);
Con.Open();
string cmdtxt2 = "SELECT * FROM ##Count where Company='" + this.ddlTaget.SelectedItem.Text.Trim() + "'"
;
SqlDataAdapter da
= new
SqlDataAdapter(cmdtxt2, Con);
DataSet ds
= new
DataSet();
da.Fill(ds);

Count1[
0] = Convert.ToInt32(ds.Tables[0].Rows[0]["count1"
].ToString());
Count1[
1] = Convert.ToInt32(ds.Tables[0].Rows[0]["count3"
].ToString());
Count1[
2] = Convert.ToInt32(ds.Tables[0].Rows[0]["count5"
].ToString());
Count1[
3] = Convert.ToInt32(ds.Tables[0].Rows[0]["count7"
].ToString());

Count1[
4] = Count1[0] + Count1[1
];
Count1[
5] = Count1[2] + Count1[3
];

Count1[
6] = Convert.ToInt32(ds.Tables[0].Rows[0]["count9"
].ToString());


Count2[
0] = Convert.ToInt32(ds.Tables[0].Rows[0]["count2"
].ToString());
Count2[
1] = Convert.ToInt32(ds.Tables[0].Rows[0]["count4"
].ToString());
Count2[
2] = Convert.ToInt32(ds.Tables[0].Rows[0]["count6"
].ToString());
Count2[
3] = Convert.ToInt32(ds.Tables[0].Rows[0]["count8"
].ToString());

Count2[
4] = Count2[0] + Count2[1
];
Count2[
5] = Count2[2] + Count2[3
];

Count2[
6] = Convert.ToInt32(ds.Tables[0].Rows[0]["count10"
].ToString());

//绘制柱状图.

x = 80;
Font font2
= new System.Drawing.Font("Arial", 10
, FontStyle.Bold);
SolidBrush mybrush
= new
SolidBrush(Color.Red);
SolidBrush mybrush2
= new
SolidBrush(Color.Green);

//第一期

g.FillRectangle(mybrush, x, 340 - Count1[0], 20, Count1[0]);
g.DrawString(Count1[
0].ToString(), font2, Brushes.Red, x, 340 - Count1[0] - 15
);

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
);


//第二期

x = x + 60;
g.FillRectangle(mybrush, x,
340 - Count1[1], 20, Count1[1
]);
g.DrawString(Count1[
1].ToString(), font2, Brushes.Red, x, 340 - Count1[1] - 15
);


x
= x + 20
;
g.FillRectangle(mybrush2, x,
340 - Count2[1], 20, Count2[1
]);
g.DrawString(Count2[
1].ToString(), font2, Brushes.Green, x, 340 - Count2[1] - 15
);


//第三期

x = x + 60;
g.FillRectangle(mybrush, x,
340 - Count1[2], 20, Count1[2
]);
g.DrawString(Count1[
2].ToString(), font2, Brushes.Red, x, 340 - Count1[2] - 15
);

x
= x + 20
;
g.FillRectangle(mybrush2, x,
340 - Count2[2], 20, Count2[2
]);
g.DrawString(Count2[
2].ToString(), font2, Brushes.Green, x, 340 - Count2[2] - 15
);

//第四期

x = x + 60;
g.FillRectangle(mybrush, x,
340 - Count1[3], 20, Count1[3
]);
g.DrawString(Count1[
3].ToString(), font2, Brushes.Red, x, 340 - Count1[3] - 15
);

x
= x + 20
;
g.FillRectangle(mybrush2, x,
340 - Count2[3], 20, Count2[3
]);
g.DrawString(Count2[
3].ToString(), font2, Brushes.Green, x, 340 - Count2[3] - 15
);

//上半年

x = x + 60;
g.FillRectangle(mybrush, x,
340 - Count1[4], 20, Count1[4
]);
g.DrawString(Count1[
4].ToString(), font2, Brushes.Red, x, 340 - Count1[4] - 15
);

x
= x + 20
;
g.FillRectangle(mybrush2, x,
340 - Count2[4], 20, Count2[4
]);
g.DrawString(Count2[
4].ToString(), font2, Brushes.Green, x, 340 - Count2[4] - 15
);

//下半年

x = x + 60;
g.FillRectangle(mybrush, x,
340 - Count1[5], 20, Count1[5
]);
g.DrawString(Count1[
5].ToString(), font2, Brushes.Red, x, 340 - Count1[5] - 15
);

x
= x + 20
;
g.FillRectangle(mybrush2, x,
340 - Count2[5], 20, Count2[5
]);
g.DrawString(Count2[
5].ToString(), font2, Brushes.Green, x, 340 - Count2[5] - 15
);

//全年

x = x + 60;
g.FillRectangle(mybrush, x,
340 - Count1[6], 20, Count1[6
]);
g.DrawString(Count1[
6].ToString(), font2, Brushes.Red, x, 340 - Count1[6] - 15
);


x
= x + 20
;
g.FillRectangle(mybrush2, x,
340 - Count2[6], 20, Count2[6
]);
g.DrawString(Count2[
6].ToString(), font2, Brushes.Green, x, 340 - Count2[6] - 15
);


//绘制标识

Font font3 = new System.Drawing.Font("Arial", 10, FontStyle.Regular);
g.DrawRectangle(
new Pen(Brushes.Blue), 170, 400, 250, 50); //绘制范围框

g.FillRectangle(Brushes.Red, 270, 410, 20, 10); //绘制小矩形
g.DrawString("报名人数", font3, Brushes.Red, 292, 408);

g.FillRectangle(Brushes.Green,
270, 430, 20, 10
);
g.DrawString(
"通过人数", font3, Brushes.Green, 292, 428
);

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());
}
finally

{
g.Dispose();
image.Dispose();
}
}

 

private void CreateImage()
{
int height = 480, width = 700
;
Bitmap image
= new
Bitmap(width, height);
Graphics g
=
Graphics.FromImage(image);

try

{
//清空图片背景色
g.Clear(Color.White);

Font font
= new System.Drawing.Font("Arial", 9
, FontStyle.Regular);
Font font1
= new System.Drawing.Font("宋体", 20
, FontStyle.Regular);
Font font2
= new System.Drawing.Font("Arial", 8
, FontStyle.Regular);
LinearGradientBrush brush
= new
LinearGradientBrush(
new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.Blue, 1.2f, true
);
g.FillRectangle(Brushes.AliceBlue,
0, 0
, width, height);
Brush brush1
= new
SolidBrush(Color.Blue);
Brush brush2
= new
SolidBrush(Color.SaddleBrown);

g.DrawString(
this.ddlTaget.SelectedItem.Text + " " + this.ddlYear.SelectedItem.Text +

" 成绩统计折线图", font1, brush1, new PointF(85, 30
));
//画图片的边框线

g.DrawRectangle(new Pen(Color.Blue), 0, 0, image.Width - 1, image.Height - 1);

Pen mypen
= new Pen(brush, 1
);
Pen mypen2
= new Pen(Color.Red, 2
);
//
绘制线条
//绘制纵向线条

int x = 60;
for (int i = 0; i < 8; i++
)
{
g.DrawLine(mypen, x,
80, x, 340
);
x
= x + 80
;
}
Pen mypen1
= new Pen(Color.Blue, 3
);
x
= 60
;
g.DrawLine(mypen1, x,
82, x, 340
);

//绘制横向线条

int y = 106;
for (int i = 0; i < 10; i++
)
{
g.DrawLine(mypen,
60, y, 620
, y);
y
= y + 26
;
}
// y = 106;

g.DrawLine(mypen1, 60, y - 26, 620, y - 26);

//x轴

String[] n = { "第一期", "第二期", "第三期", "第四期", "上半年", "下半年", "全年统计" };
x
= 45
;
for (int i = 0; i < 7; i++
)
{
g.DrawString(n[i].ToString(), font, Brushes.Red, x,
348); //设置文字内容及输出位置

x = x + 77;
}

//y轴

String[] m = { "220人", " 200人", " 175人", "150人", " 125人", " 100人", " 75人", " 50人",
" 25人"
};
y
= 100
;
for (int i = 0; i < 9; i++
)
{
g.DrawString(m[i].ToString(), font, Brushes.Red,
10, y); //设置文字内容及输出位置

y = y + 26;
}

int[] Count1 = new int[7
];
int[] Count2 = new int[7
];

SqlConnection Con
= new SqlConnection("Server=(Local);Database=committeeTraining;Uid=sa;Pwd=eesoft"
);
Con.Open();
string cmdtxt2 = "SELECT * FROM ##Count where Company='" + this.ddlTaget.SelectedItem.Text.Trim() + "'"
;
SqlDataAdapter da
= new
SqlDataAdapter(cmdtxt2, Con);
DataSet ds
= new
DataSet();
da.Fill(ds);

//报名人数

Count1[0] = Convert.ToInt32(ds.Tables[0].Rows[0]["count1"].ToString());
Count1[
1] = Convert.ToInt32(ds.Tables[0].Rows[0]["count3"
].ToString());
Count1[
2] = Convert.ToInt32(ds.Tables[0].Rows[0]["count5"
].ToString());
Count1[
3] = Convert.ToInt32(ds.Tables[0].Rows[0]["count7"
].ToString());

Count1[
6] = Convert.ToInt32(ds.Tables[0].Rows[0]["count9"].ToString()); //全年


Count1[
4] = Count1[0] + Count1[1];
Count1[
5] = Count1[2] + Count1[3
];


Count2[
0] = Convert.ToInt32(ds.Tables[0].Rows[0]["count2"
].ToString());
Count2[
1] = Convert.ToInt32(ds.Tables[0].Rows[0]["count4"
].ToString());
Count2[
2] = Convert.ToInt32(ds.Tables[0].Rows[0]["count6"
].ToString());
Count2[
3] = Convert.ToInt32(ds.Tables[0].Rows[0]["count8"
].ToString());

Count2[
6] = Convert.ToInt32(ds.Tables[0].Rows[0]["count10"].ToString()); //全年


Count2[
4] = Count2[0] + Count2[1];
Count2[
5] = Count2[2] + Count2[3
];


//显示折线效果

Font font3 = new System.Drawing.Font("Arial", 10, FontStyle.Bold);
SolidBrush mybrush
= new
SolidBrush(Color.Red);
Point[] points1
= new Point[7
];
points1[
0].X = 60; points1[0].Y = 340 - Count1[0]; //从106纵坐标开始, 到(0, 0)坐标时

points1[1].X = 140; points1[1].Y = 340 - Count1[1];
points1[
2].X = 220; points1[2].Y = 340 - Count1[2
];
points1[
3].X = 300; points1[3].Y = 340 - Count1[3
];

points1[
4].X = 380; points1[4].Y = 340 - Count1[4
];
points1[
5].X = 460; points1[5].Y = 340 - Count1[5
];

points1[
6].X = 540; points1[6].Y = 340 - Count1[6
];
g.DrawLines(mypen2, points1);
//
绘制折线

//绘制数字

g.DrawString(Count1[0].ToString(), font3, Brushes.Red, 58, points1[0].Y - 20);
g.DrawString(Count1[
1].ToString(), font3, Brushes.Red, 138, points1[1].Y - 20
);
g.DrawString(Count1[
2].ToString(), font3, Brushes.Red, 218, points1[2].Y - 20
);
g.DrawString(Count1[
3].ToString(), font3, Brushes.Red, 298, points1[3].Y - 20
);

g.DrawString(Count1[
4].ToString(), font3, Brushes.Red, 378, points1[4].Y - 20
);
g.DrawString(Count1[
5].ToString(), font3, Brushes.Red, 458, points1[5].Y - 20
);

g.DrawString(Count1[
6].ToString(), font3, Brushes.Red, 538, points1[6].Y - 20
);

Pen mypen3
= new Pen(Color.Green, 2
);
Point[] points2
= new Point[7
];
points2[
0].X = 60; points2[0].Y = 340 - Count2[0
];
points2[
1].X = 140; points2[1].Y = 340 - Count2[1
];
points2[
2].X = 220; points2[2].Y = 340 - Count2[2
];
points2[
3].X = 300; points2[3].Y = 340 - Count2[3
];

points2[
4].X = 380; points2[4].Y = 340 - Count2[4
];
points2[
5].X = 460; points2[5].Y = 340 - Count2[5
];

points2[
6].X = 540; points2[6].Y = 340 - Count2[6
];
g.DrawLines(mypen3, points2);
//
绘制折线

//绘制通过人数

g.DrawString(Count2[0].ToString(), font3, Brushes.Green, 61, points2[0].Y - 15);
g.DrawString(Count2[
1].ToString(), font3, Brushes.Green, 131, points2[1].Y - 15
);
g.DrawString(Count2[
2].ToString(), font3, Brushes.Green, 221, points2[2].Y - 15
);
g.DrawString(Count2[
3].ToString(), font3, Brushes.Green, 301, points2[3].Y - 15
);

g.DrawString(Count2[
4].ToString(), font3, Brushes.Green, 381, points2[4].Y - 15
);
g.DrawString(Count2[
5].ToString(), font3, Brushes.Green, 461, points2[5].Y - 15
);

g.DrawString(Count2[
6].ToString(), font3, Brushes.Green, 541, points2[6].Y - 15
);

//绘制标识

g.DrawRectangle(new Pen(Brushes.Red), 180, 390, 250, 50); //绘制范围框
g.FillRectangle(Brushes.Red, 270, 402, 20, 10); //绘制小矩形
g.DrawString("报名人数", font2, Brushes.Red, 292, 400);

g.FillRectangle(Brushes.Green,
270, 422, 20, 10
);
g.DrawString(
"通过人数", font2, Brushes.Green, 292, 420
);

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());
}
finally

{
g.Dispose();
image.Dispose();
}
}

 

private void CreateImage()
{
//把连接字串指定为一个常量

SqlConnection Con = new SqlConnection("Server=(Local);
Database=committeeTraining;Uid=sa;Pwd=**");
Con.Open();
string cmdtxt = selectString; // "select * from ##Count"; //

//SqlCommand Com = new SqlCommand(cmdtxt, Con);
DataSet ds = new DataSet();
SqlDataAdapter Da
= new
SqlDataAdapter(cmdtxt, Con);
Da.Fill(ds);
Con.Close();
float Total = 0.0f
, Tmp;

//转换成单精度。也可写成Convert.ToInt32

Total = Convert.ToSingle(ds.Tables[0].Rows[0][this.count[0]]);

//
Total=Convert.ToSingle(ds.Tables[0].Rows[0][this.count[0]]);
//设置字体,fonttitle为主标题的字体

Font fontlegend = new Font("verdana", 9);
Font fonttitle
= new Font("verdana", 10
, FontStyle.Bold);

//背景宽

int width = 350;
int bufferspace = 15
;
int legendheight = fontlegend.Height * 10 + bufferspace; //高度

int titleheight = fonttitle.Height + bufferspace;
int height = width + legendheight + titleheight + bufferspace;//白色背景高

int pieheight = width;
Rectangle pierect
= new Rectangle(0
, titleheight, width, pieheight);

//加上各种随机色

ArrayList colors = new ArrayList();
Random rnd
= new
Random();
for (int i = 0; i < 2; i++
)
colors.Add(
new SolidBrush(Color.FromArgb(rnd.Next(255), rnd.Next(255), rnd.Next(255
))));

//创建一个bitmap实例

Bitmap objbitmap = new Bitmap(width, height);
Graphics objgraphics
=
Graphics.FromImage(objbitmap);

//画一个白色背景

objgraphics.FillRectangle(new SolidBrush(Color.White), 0, 0, width, height);

//画一个亮黄色背景

objgraphics.FillRectangle(new SolidBrush(Color.Beige), pierect);

//以下为画饼图(有几行row画几个)

float currentdegree = 0.0f;

//画通过人数

objgraphics.FillPie((SolidBrush)colors[1], pierect, currentdegree,
Convert.ToSingle(ds.Tables[
0].Rows[0][this.count[1]]) / Total * 360
);
currentdegree
+= Convert.ToSingle(ds.Tables[0].Rows[0][this.count[1]]) / Total * 360
;

//未通过人数饼状图

objgraphics.FillPie((SolidBrush)colors[0], pierect, currentdegree,
((Convert.ToSingle(ds.Tables[
0].Rows[0][this.count[0]]))-(Convert.ToSingle(ds.Tables[0].Rows[0][this.count[1]]))) / Total * 360
);
currentdegree
+= ((Convert.ToSingle(ds.Tables[0].Rows[0][this.count[0]])) -

(Convert.ToSingle(ds.Tables[
0].Rows[0][this.count[1]]))) / Total * 360
;


//以下为生成主标题

SolidBrush blackbrush = new SolidBrush(Color.Black);
SolidBrush bluebrush
= new
SolidBrush(Color.Blue);
string title = " 机关单位成绩统计饼状图: "

+ "/n /n/n";
StringFormat stringFormat
= new
StringFormat();
stringFormat.Alignment
=
StringAlignment.Center;
stringFormat.LineAlignment
=
StringAlignment.Center;

objgraphics.DrawString(title, fonttitle, blackbrush,
new Rectangle(0, 0
, width, titleheight), stringFormat);

//列出各字段与得数目

objgraphics.DrawRectangle(new Pen(Color.Red, 2), 0, height + 10 - legendheight, width, legendheight + 50);

objgraphics.DrawString(
"----------------统计信息------------------"
,
fontlegend, bluebrush,
20, height - legendheight + fontlegend.Height * 1 + 1
);
objgraphics.DrawString(
"统计单位: " + this
.ddlTaget.SelectedItem.Text,
fontlegend, blackbrush,
20, height - legendheight + fontlegend.Height * 3 + 1
);
objgraphics.DrawString(
"统计年份: " + this
.ddlYear.SelectedItem.Text,
fontlegend, blackbrush,
20, height - legendheight + fontlegend.Height * 4 + 1
);
objgraphics.DrawString(
"统计期数: " + this
.ddlSpan.SelectedItem.Text,
fontlegend, blackbrush,
20, height - legendheight + fontlegend.Height * 5 + 1
);

objgraphics.FillRectangle((SolidBrush)colors[
1], 5,height - legendheight + fontlegend.Height * 8 + 1, 10, 10
);
objgraphics.DrawString(
"报名总人数: " + Convert.ToString(Convert.ToSingle(ds.Tables[0].Rows[0][this.count[0
]])),
fontlegend, blackbrush,
20, height - legendheight + fontlegend.Height * 7 + 1
);
objgraphics.FillRectangle((SolidBrush)colors[
0], 5, height - legendheight + fontlegend.Height * 9 + 1, 10, 10
);
objgraphics.DrawString(
"通过总人数: " + Convert.ToString(Convert.ToSingle(ds.Tables[0].Rows[0][this.count[1
]])),
fontlegend, blackbrush,
20, height - legendheight + fontlegend.Height * 8 + 1
);
objgraphics.DrawString(
"未通过人数: " + ((Convert.ToSingle(ds.Tables[0].Rows[0][this.count[0]])) -

(Convert.ToSingle(ds.Tables[
0].Rows[0][this.count[1]]))), fontlegend, blackbrush, 20, height - legendheight + fontlegend.Height * 9 + 1
);

objgraphics.DrawString(
"通过率: " + Convert.ToString((Convert.ToSingle(ds.Tables[0].Rows[0][this.count[1]]) /

Convert.ToSingle(ds.Tables[
0].Rows[0][this.count[0]])) * 100)+ " %"
, fontlegend,
blackbrush,
20, height - legendheight + fontlegend.Height * 10 + 1
);

Response.ContentType
= "image/Jpeg"
;
objbitmap.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
objgraphics.Dispose();
objbitmap.Dispose();

}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值