用到.Net中绘图类,实现折线图的绘制,生成图片,在页面的显示,代码如下:

  /// <summary>
/// 获取数据
/// strChartName:图名称;
/// yName:纵坐标名称;
/// xName:横坐标名称;
/// iyMaxValue:纵坐标最大值;
/// dyAveValue:纵坐标单位值=(纵坐标最大值/标量30)
/// ----100 30 :3
/// ----200 30 :1.5;
/// xdbColumnName:横坐标绑定显示数据表值的列名;
/// ydbColumnName:纵坐标绑定显示数据表值得列名;
/// </summary>
public void Get_CurveData(string strSql,string strChartName,string yName,string xName,int iyMaxValue, double dyAveValue,string xdbColumnName,string ydbColumnName)
{
try
{
DataSet ds = sqlAccess.ReadFromDB(strSql);
draw(ds.Tables[], strChartName, yName, xName, iyMaxValue, dyAveValue, xdbColumnName, ydbColumnName);
}
catch (Exception exp)
{
Response.Write(sqlAccess.ExceptionMessage);
}
} public void draw(DataTable dt, string strChartName, string yName, string xName, int iyMaxValue, double dyAveValue, string xdbColumnName, string ydbColumnName)
{
//取得记录数量
int count = dt.Rows.Count;
//记算图表宽度
int wd = + * (count - );
//设置最小宽度为800
if (wd < ) wd = ;
//生成Bitmap对像
Bitmap img = new Bitmap(wd, );
//生成绘图对像
Graphics g = Graphics.FromImage(img);
//定义黑色画笔
Pen Bp = new Pen(Color.Black);
//定义红色画笔
Pen Rp = new Pen(Color.Red);
//定义银灰色画笔
Pen Sp = new Pen(Color.Silver);
//定义蓝色画笔
Pen Blp = new Pen(Color.Blue);
//定义大标题字体
Font Bfont = new Font("Arial", , FontStyle.Bold);
//定义一般字体
Font font = new Font("Arial", );
//定义大点的字体
Font Tfont = new Font("Arial", );
//定义横坐标间隔,(最佳值是总宽度-留空宽度[左右侧都需要])/(记录数量-1)
int xSpace = (wd - ) / (count - );
//定义纵坐标间隔,不能随便修改,跟高度和横坐标线的条数有关,最佳值=(绘图的高度-上面留空-下面留空)
int ySpace = ;
//纵坐标最大值和间隔值
int yMaxValue = iyMaxValue;
//绘制底色
g.DrawRectangle(new Pen(Color.White, ), , , img.Width, img.Height);
//定义黑色过渡型笔刷
LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(, , img.Width, img.Height), Color.Black, Color.Black, 1.2F, true);
//定义蓝色过渡型笔刷
LinearGradientBrush Bluebrush = new LinearGradientBrush(new Rectangle(, , img.Width, img.Height), Color.Blue, Color.Blue, 1.2F, true);
//绘制大标题
g.DrawString(strChartName, Bfont, brush, , );
//绘制信息简报
//string info = " 曲线图生成时间:" + DateTime.Now.ToString();
//g.DrawString(info, Tfont, Bluebrush, 40, 25);
//绘制图片边框
g.DrawRectangle(Bp, , , img.Width - , img.Height - );
//绘制竖坐标轴
g.DrawLine(Bp, , , , );
//绘制横坐标轴 x2的60是右侧空出部分
g.DrawLine(Bp, , , + xSpace * (count - ), );
//绘制竖坐标标题
g.DrawString(yName, Tfont, brush, , );
//绘制横坐标标题
g.DrawString(xName, Tfont, brush, , );
//绘制竖坐标线
for (int i = ; i < count; i++)
{
g.DrawLine(Sp, + xSpace * i, , + xSpace * i, );
}
//绘制时间轴坐标标签
for (int i = ; i < count; i++)
{
//string st = Convert.ToDateTime(dt.Rows[i]["testdate"]).ToString("MM:dd");
//string st = "第" + dt.Rows[i]["testdate"].ToString() + "周";
string st = dt.Rows[i][xdbColumnName].ToString();
g.DrawString(st, font, brush, + xSpace * i, );
}
//绘制横坐标线
for (int i = ; i < ; i++)
{
g.DrawLine(Sp, , + ySpace * i, + xSpace * (count - ), + ySpace * i);
//横坐标轴的值间隔是最大值除以间隔数
int s = yMaxValue - i * (yMaxValue / );
//绘制发送量轴坐标标签
g.DrawString(s.ToString(), font, brush, , + ySpace * i);
} //处理39.6%形式的数据
string[] strArr = new string[dt.Rows.Count];
for (int i = ; i < count; i++)
{
string strValue = dt.Rows[i][ydbColumnName].ToString();
if (strValue.Contains("%"))
{
strArr[i] = strValue.Split('%')[];
}
else
{
strArr[i] = strValue;
}
}
//200/30
//定义纵坐标单位数值=纵坐标最大值/标量最大值
double yAveValue = dyAveValue;
//定义曲线转折点
Point[] p = new Point[count];
for (int i = ; i < count; i++)
{
p[i].X = + xSpace * i;
p[i].Y = - Convert.ToInt32(Convert.ToDouble(strArr[i]) * yAveValue);
} //绘制折线图
//g.DrawLines(Rp, p);
//绘制曲线图
//g.DrawCurve(Rp, p);
//绘制自定义张力的曲线图(0.5F是张力值,默认就是这个值)
g.DrawCurve(Rp, p, 0.5F);
//g.DrawLines(Rp, p);
//当需要在一个图里绘制多条曲线的时候,就多定义个point数组,然后画出来就可以了。
for (int i = ; i < count; i++)
{
//绘制发送记录点的发送量
g.DrawString(strArr[i], font, Bluebrush, p[i].X, p[i].Y - );
//绘制发送记录点
g.DrawRectangle(Rp, p[i].X - , p[i].Y - , , );
} ///*******************画中值线///
//for (int i = 0; i < count; i++)
//{
// p[i].X = 40 + xSpace * i;
// p[i].Y = 360 - Convert.ToInt32("50") * yAveValue;
//}
//for (int i = 0; i < count; i++)
//{
// //绘制发送记录点的发送量
// g.DrawString("", font, Bluebrush, p[i].X, p[i].Y - 10);
// //绘制发送记录点
// g.DrawRectangle(Rp, p[i].X - 1, p[i].Y - 1, 2, 2);
//}
//g.DrawLine(Blp, 40, 360 - Convert.ToInt32("50") * yAveValue, 60 + xSpace * (count - 1), 360 - Convert.ToInt32("50") * yAveValue);
///**************************/// //保存绘制的图片
MemoryStream stream = new MemoryStream();
img.Save(stream, ImageFormat.Jpeg);
//图片输出
Response.Clear();
Response.ContentType = "image/jpeg";
Response.BinaryWrite(stream.ToArray());
}
}

ASP.NET实现折线图的绘制的更多相关文章

  1. 使用python内置库matplotlib,实现折线图的绘制

    环境准备: 需要安装matplotlib,安装方式: pip install matplotlib 直接贴代码喽: #引入模块 from matplotlib import pyplot,font_m ...

  2. 【带着canvas去流浪】(2)绘制折线图

    目录 一. 任务说明 二. 重点提示 三. 示例代码 3.1 一般折线图 3.2 用贝塞尔曲线绘制平滑折线图 四. 大数据量场景 示例代码托管在:https://github.com/dashnowo ...

  3. 【Android开源框架】使用andbase开发框架实现绘制折线图

    在Android中,当有绘制折线图的需求时.大多数人使用的AChartEngine,来进行折线图的绘制.AChartEngine图表引擎确实能够实现折线图的功能.除此之外,我们还能够使用andbase ...

  4. 带着canvas去流浪系列之二 绘制折线图

    [摘要] 用canvasAPI实现echarts简易图表 示例代码托管在:http://www.github.com/dashnowords/blogs 一. 任务说明 使用原生canvasAPI绘制 ...

  5. java代码实现highchart与数据库数据结合完整案例分析(二)---折线图

    作者原创:未经博主允许不许转载 在上一篇的博客中,展示和分析了如何做一个饼状图,有疑问可以参考上一篇博客. 现在分析和展示折线图的绘制和案例分析, 先展示效果图: 与饼状图不同的是,折线图展现更多的数 ...

  6. IOS使用Core-Plot画折线图

    关于Core-Plot的配置.大家能够參考我的上一篇博客:http://1.wildcat.sinaapp.com/?p=99 版权全部.转载请注明原文转自:http://blog.csdn.net/ ...

  7. pyhton matplotlib可视化图像基础(二维函数图、柱状图、饼图、直方图以及折线图)

    //2019.07.22pyhton中matplotlib模块的应用pyhton中matplotlib是可视化图像库的第三方库,它可以实现图像的可视化,输出不同形式的图形1.可视化图形的输出和展示需要 ...

  8. Matplotlib数据可视化(4):折线图与散点图

    In [1]: from matplotlib import pyplot as plt import numpy as np import matplotlib as mpl mpl.rcParam ...

  9. 用canvas绘制折线图

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

随机推荐

  1. 【转】使用GDB调试Coredump文件

    来自:http://blog.ddup.us/?p=176 写C/C++程序经常要直接和内存打交道,一不小心就会造成程序执行时产生Segment Fault而挂掉.一般这种情况都是因为数组越界访问,空 ...

  2. 网络编程中常见地址结构与转换(IPv4/IPv6)

    1. sockaddr/sockaddr_in/in_addr (IPv4).sockaddr6_in/in6_addr/addrinfo (IPv6) struct sockaddr { unsig ...

  3. MaterialDesignLibrary

    https://github.com/navasmdc/MaterialDesignLibrary MaterialDesignLibrary.zip

  4. HTTP协议报文、工作原理及Java中的HTTP通信技术详解

    一.web及网络基础       1.HTTP的历史            1.1.HTTP的概念:                 HTTP(Hyper Text Transfer Protocol ...

  5. cocos2dx 3.1从零学习(一)——入门篇(一天学会打飞机)

    没办法,浏览这么高,为啥没人投票呢?朋友们,我这篇文章參加了csdn博文大赛.喜欢的来点个赞吧!点击:http://vote.blog.csdn.net/Article/Details?article ...

  6. mysql 5.7 多源复制 原创

    一从两主:多源复制 每台mysql 服务器都需要加my.cnf要加两个参数才可以在GTID多源复制 master-info-repository=TABLE relay-log-info-reposi ...

  7. mysql中 case when的使用

    SELECT a.hsid, a.house_code, a.sale_date, a.pjid, COUNT( sdid ) AS num, b.hsid, b.pscid, b.hscode, b ...

  8. Redis 有序集合(sorted set)

    Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员. 不同的是每个元素都会关联一个double类型的分数.redis正是通过分数来为集合中的成员进行从小到大的排序. 有序 ...

  9. Linux 学习笔记 文件权限

    * Linux系统会为各种各样的功能创建不同的用户账户,而这些账户并不是真的用户.这些账户称作系统账户,是系统上运行的各种服务进程访问资源用的特殊账户. 所有运行在后台的服务都需要用一个系统用户账户登 ...

  10. BootStrap2学习日记2--将固定布局换成响应式布局

    概要:响应式页面是指页面根据浏览平台(尺寸)的不同显示不同的CSS. 原理:在Html的的头加入代码 <style> /*当浏览器宽度大于767是 采用括号里面的CSS样式*/ @medi ...