记得刚进公司不久,老板要求在生产线前的电视机上实时显示产量等各种信息,并且用曲线图和柱状图显示出来。那时候对asp.net还不熟悉,只能用asp+vml的方式画图,虽然最后的图形很漂亮,但vml是ie only的技术,而且已经非常老旧了。现在同样的工作,我们完全可以用asp.net实现,而且更简单。
先看看效果图:
代码:
using System; using System.Collections; using System.Configuration; using System.Data; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Xml.Linq; using System.Drawing; namespace WebApplication1 { public partial class _Default : System.Web.UI.Page { private string[,] data = new string[6, 2]; protected void Page_Load(object sender, EventArgs e) { DrawingAPic(); } private void DrawingAPic() { int i; // 实例化Bitmap对象 Bitmap objbitmap; objbitmap = new Bitmap(400, 300); Graphics objGraphics; // 实例化Graphics类 objGraphics = Graphics.FromImage(objbitmap); // 填充背景色 objGraphics.Clear(Color.White); // 画圆 objGraphics.DrawRectangle(Pens.Black, 1, 1, 398, 298); // 写标题 objGraphics.DrawString("本公司上半年营业额统计图", new Font("宋体", 16, FontStyle.Bold), Brushes.Black, new PointF(60, 5)); // 获取数据,这里模拟出6个月的公司业务数据,实际应用可以从数据库读取 getdata(); PointF monthcolor = new PointF(260, 40); PointF fontinfor = new PointF(285, 36); for (i = 0; i < = 5; i++) { // 画出填充矩形 objGraphics.FillRectangle(new SolidBrush(getcolor(i)), monthcolor.X, monthcolor.Y, 20, 10); //画出矩形边框。 objGraphics.DrawRectangle(Pens.Black, monthcolor.X, monthcolor.Y, 20, 10); //画出图例说明文字--data(i, 0) objGraphics.DrawString(data[i, 0], new Font("宋体", 10), Brushes.Black, fontinfor); //移动坐标位置,只移动Y方向的值即可。 monthcolor.Y += 15; fontinfor.Y += 15; } // 遍历数据源的每一项数据,并根据数据的大小画出矩形图(即柱形图的柱)。 for (i = 0; i <= 5; i++) { //画出填充矩形。 objGraphics.FillRectangle(new SolidBrush(getcolor(i)), (i * 25) + 35, 270 - System.Convert.ToInt32(data[i, 1]), 15, System.Convert.ToInt32(data[i, 1])); //'画出矩形边框线。 objGraphics.DrawRectangle(Pens.Black, (i * 25) + 35, 270 - System.Convert.ToInt32(data[i, 1]), 15, System.Convert.ToInt32(data[i, 1])); } //画出示意坐标 objGraphics.DrawLine(new Pen(Color.Blue, 1), 10, 0, 10, 320); objGraphics.DrawLine(new Pen(Color.Blue, 1), 10, 270, 200, 270); // 在示意坐标上添加数值标志,注意坐标的计算 for (i = 0; i <= 5; i++) { objGraphics.DrawLine(new Pen(Color.Blue, 1), 10, i * 50 + 20, 20, i * 50 + 20); objGraphics.DrawString((250 - i * 50).ToString(), new Font("宋体", 10), Brushes.Black, 12, i * 50 + 8); } //统计总销售额 float scount = 0; for (i = 0; i <= 5; i++) { scount += float.Parse((data[i, 1])); } //定义画出扇形角度变量 float scg = 0; float stg = 0; for (i = 0; i <= 5; i++) { //计算当前角度值:当月销售额 / 总销售额 * 360,得到饼图中当月所占的角度大小。 float num = float.Parse(data[i, 1]); scg = (num / scount) * 360; //画出填充圆弧。 objGraphics.FillPie(new SolidBrush(getcolor(i)), 220, 150, 120, 120, stg, scg); //画出圆弧线。 objGraphics.DrawPie(Pens.Black, 220, 150, 120, 120, stg, scg); // 把当前圆弧角度加到总角度上。 stg += scg; } // 画出说明文字 objGraphics.DrawString("柱状图", new Font("宋体", 15, FontStyle.Bold), Brushes.Blue, 50, 272); objGraphics.DrawString("饼状图", new Font("宋体", 15, FontStyle.Bold), Brushes.Blue, 250, 272); // 输出到客户端 objbitmap.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Gif); } // 为数组赋值 // 即生成模拟业务数据 private void getdata() { data[0, 0] = "一月份"; data[1, 0] = "二月份"; data[2, 0] = "三月份"; data[3, 0] = "四月份"; data[4, 0] = "五月份"; data[5, 0] = "六月份"; data[0, 1] = "85"; data[1, 1] = "135"; data[2, 1] = "85"; data[3, 1] = "110"; data[4, 1] = "130"; data[5, 1] = "200"; } // 产生色彩值,便于显示区别 private Color getcolor(int i) { Color newcolor; i += 1; if (i == 1) { newcolor = Color.Blue; } else if (i == 2) { newcolor = Color.ForestGreen; } else if (i == 3) { newcolor = Color.Gainsboro; } else if (i == 4) { newcolor = Color.Moccasin; } else if (i == 5) { newcolor = Color.Indigo; } else if (i == 6) { newcolor = Color.BurlyWood; } else newcolor = Color.Goldenrod; return newcolor; } } }
回复自“ASP.NET(C#)生成柱状图和饼图”