c# 曲线图生成代码

 

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 

using System.Drawing; 
using System.Drawing.Drawing2D; 
using System.IO; 
using System.Drawing.Imaging; 
using System.Collections; 

namespace Curve 
{ 
public class CurveDrawing 
{ 
string title, title2, ytitle, xtitle; 
/// <summary> 
/// X坐标的标题 
/// </summary> 
public string Xtitle 
{ 
get { return xtitle; } 
set { xtitle = value; } 
} 
/// <summary> 
/// Y坐标的标题 
/// </summary> 
public string Ytitle 
{ 
get { return ytitle; } 
set { ytitle = value; } 
} 
/// <summary> 
/// 副标题 
/// </summary> 
public string Title2 
{ 
get { return title2; } 
set { title2 = value; } 
} 
/// <summary> 
/// 主标题 
/// </summary> 
public string Title 
{ 
get { return title; } 
set { title = value; } 
} 
double yMax, yMin; 
List<ArrayList> itemlist; 

public CurveDrawing(List<ArrayList> itemlist, string title, string title2 = "") 
{ 
this.itemlist = itemlist; 
this.title = title; 
this.title2 = title2; 

yMax = -100000000; 
yMin = 100000000; 
for (int i = 0; i < itemlist.Count; i++) 
{ 
if (Convert.ToDouble(itemlist[i][1]) > yMax) 
yMax = Convert.ToDouble(itemlist[i][1]); 
if (Convert.ToDouble(itemlist[i][1]) < yMin) 
yMin = Convert.ToDouble(itemlist[i][1]); 
} 
} 
/// <summary> 
/// 创建并输出图片 
/// </summary> 
/// <returns>生成的文件路径</returns> 
public string Draw() 
{ 
#region 基础定义 
//取得记录数量 
int count = itemlist.Count; 

//记算图表宽度 
int wd = 80 + 50 * (count - 1); 
//设置最小宽度为640 
if (wd < 640) wd = 640; 
//生成Bitmap对像 
Bitmap img = new Bitmap(wd, 400); 
//定义黑色画笔 
Pen Bp = new Pen(Color.Black); 
//加粗的黑色 
Pen BBp = new Pen(Color.Black, 2); 
//定义红色画笔 
Pen Rp = new Pen(Color.Red); 
//定义银灰色画笔 
Pen Sp = new Pen(Color.Silver); 
//定义大标题字体 
Font Bfont = new Font("黑体", 12, FontStyle.Bold); 
//定义一般字体 
Font font = new Font("Arial", 8); 
//定义大点的字体 
Font Tfont = new Font("Arial", 9); 
//定义黑色过渡型笔刷 
LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, img.Width, img.Height), Color.Black, Color.Black, 1.2F, true); 
//定义蓝色过渡型笔刷 
LinearGradientBrush Bluebrush = new LinearGradientBrush(new Rectangle(0, 0, img.Width, img.Height), Color.Blue, Color.Blue, 1.2F, true); 
LinearGradientBrush Silverbrush = new LinearGradientBrush(new Rectangle(0, 0, img.Width, img.Height), Color.Silver, Color.Silver, 1.2F, true); 
#endregion 

//生成绘图对像 
try 
{ 
using (Graphics g = Graphics.FromImage(img)) 
{ 
#region 绘制图表 
//绘制底色 
g.DrawRectangle(new Pen(Color.White, 400), 0, 0, img.Width, img.Height); 
//绘制大标题 
g.DrawString(title, Bfont, brush, wd / 2 - title.Length * 10, 5); 
//绘制小标题 
g.DrawString(title2, Tfont, Silverbrush, wd / 2 - title.Length * 10 + 40, 25); 
//绘制图片边框 
g.DrawRectangle(Bp, 0, 0, img.Width - 1, img.Height - 1); 

//绘制Y坐标线 
for (int i = 0; i < (count < 12 ? 12 : count); i++) 
g.DrawLine(Sp, 40 + 50 * i, 60, 40 + 50 * i, 360); 
//绘制X轴坐标标签 
for (int i = 0; i < count; i++) 
g.DrawString(itemlist[i][0].ToString(), font, brush, 30 + 50 * i, 370); 
//绘制X坐标线 
for (int i = 0; i < 11; i++) 
{ 
g.DrawLine(Sp, 40, 60 + 30 * i, 40 + 50 * ((count < 12 ? 12 : count) - 1), 60 + 30 * i); 
double s = yMax - (yMax + Math.Abs(yMin)) / 10 * i;//最大的Y坐标值 
g.DrawString(Math.Floor(s).ToString(), font, brush, 10, 55 + 30 * i); 
} 


//绘制Y坐标轴 
g.DrawLine(BBp, 40, 50, 40, 360); 
//绘制X坐标轴 
g.DrawLine(BBp, 40, 360, 40 + 50 * ((count < 12 ? 12 : count) - 1) + 10, 360); 

#endregion 

#region 绘制曲线 
//定义曲线转折点 
Point[] p = new Point[count]; 
for (int i = 0; i < count; i++) 
{ 
p[i].X = 40 + 50 * i; 
p[i].Y = 360 - (int)(((Convert.ToDouble(itemlist[i][1]) + Math.Abs(yMin)) / ((yMax + Math.Abs(yMin)) / 10)) * 30); 
} 
//绘制发送曲线 
g.DrawLines(Rp, p); 

for (int i = 0; i < count; i++) 
{ 
//绘制发送记录点的数值 
g.DrawString(itemlist[i][1].ToString(), font, Bluebrush, p[i].X + 5, p[i].Y - 10); 
//绘制发送记录点 
g.DrawRectangle(Rp, p[i].X - 2, p[i].Y - 2, 4, 4); 
} 

#endregion 

//绘制Y坐标标题 
g.DrawString(ytitle, Tfont, brush, 10, 40); 
//绘制X坐标标题 
g.DrawString(xtitle, Tfont, brush, 30, 385); 
//图片质量 
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; 
//保存绘制的图片 
string basePath = HttpContext.Current.Server.MapPath("/Curve/"), 
fileName = Guid.NewGuid() + ".jpg"; 

using (FileStream fs = new FileStream(basePath + fileName, FileMode.CreateNew)) 
{ 
if (!System.IO.Directory.Exists(basePath)) 
System.IO.Directory.CreateDirectory(basePath); 
img.Save(fs, ImageFormat.Jpeg); 
return "/Curve/" + fileName; 
} 
} 

} 
catch (Exception) 
{ 
throw; 
} 

} 
} 
} 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值