ASP.NET实现折线图的绘制
用到.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实现折线图的绘制的更多相关文章
- 使用python内置库matplotlib,实现折线图的绘制
环境准备: 需要安装matplotlib,安装方式: pip install matplotlib 直接贴代码喽: #引入模块 from matplotlib import pyplot,font_m ...
- 【带着canvas去流浪】(2)绘制折线图
目录 一. 任务说明 二. 重点提示 三. 示例代码 3.1 一般折线图 3.2 用贝塞尔曲线绘制平滑折线图 四. 大数据量场景 示例代码托管在:https://github.com/dashnowo ...
- 【Android开源框架】使用andbase开发框架实现绘制折线图
在Android中,当有绘制折线图的需求时.大多数人使用的AChartEngine,来进行折线图的绘制.AChartEngine图表引擎确实能够实现折线图的功能.除此之外,我们还能够使用andbase ...
- 带着canvas去流浪系列之二 绘制折线图
[摘要] 用canvasAPI实现echarts简易图表 示例代码托管在:http://www.github.com/dashnowords/blogs 一. 任务说明 使用原生canvasAPI绘制 ...
- java代码实现highchart与数据库数据结合完整案例分析(二)---折线图
作者原创:未经博主允许不许转载 在上一篇的博客中,展示和分析了如何做一个饼状图,有疑问可以参考上一篇博客. 现在分析和展示折线图的绘制和案例分析, 先展示效果图: 与饼状图不同的是,折线图展现更多的数 ...
- IOS使用Core-Plot画折线图
关于Core-Plot的配置.大家能够參考我的上一篇博客:http://1.wildcat.sinaapp.com/?p=99 版权全部.转载请注明原文转自:http://blog.csdn.net/ ...
- pyhton matplotlib可视化图像基础(二维函数图、柱状图、饼图、直方图以及折线图)
//2019.07.22pyhton中matplotlib模块的应用pyhton中matplotlib是可视化图像库的第三方库,它可以实现图像的可视化,输出不同形式的图形1.可视化图形的输出和展示需要 ...
- Matplotlib数据可视化(4):折线图与散点图
In [1]: from matplotlib import pyplot as plt import numpy as np import matplotlib as mpl mpl.rcParam ...
- 用canvas绘制折线图
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
随机推荐
- 图片攻击-BMP图片中注入恶意JS代码 <转载>
昨天看到一篇文章<hacking throung images>,里面介绍了如何在BMP格式的图片里注入JS代码,使得BMP图片既可以正常显示, 也可以运行其中的JS代码,觉得相当有趣. ...
- C# : 操作Word文件的API - (将C# source中的xml注释转换成word文档)
这篇博客将要讨论的是关于: 如何从C#的source以及注释, 生成一份Word格式的关于各个类,函数以及成员变量的说明文档. 他的大背景如下...... 最近的一个项目使用C#, 分N个模块, 在项 ...
- 归并排序的C语言实现
归并排序的核心思想是 Divide-and-Conquer 算法,即将要解决的size为n的问题,分成a个size为n/b的子问题,这些子问题的结果经过O(n^d)的时间复杂度合并,即可解决最初的问题 ...
- [AngularJS] Javascript scope and AngularJS $scope
Scope resolution of our Angular documents works exactly the same way scope resolution works in plain ...
- Online ddl 思维导图
http://blog.itpub.net/22664653/viewspace-2056953/ 整理一份 MySQL DDL 的思维导图,介绍5.5版本以及之前 和 5.6 版本的 MySQL ...
- 服务器控件HyperLink的NavigateUrl绑定传参问题
<asp:HyperLink ID="HyperLink1" NavigateUrl='<%# Eval("ProjectID","Mar ...
- Peter's Hobby
Problem Description Recently, Peter likes to measure the humidity of leaves. He recorded a leaf humi ...
- [转载]BigPipe技术
1. 技术背景 FaceBook页面加载技术 试想这样一个场景,一个经常访问的网站,每次打开它的页面都要要花费6 秒:同时另外一个网站提供了相似的服务,但响应时间只需3 秒,那么你会如何选择呢?数据表 ...
- css笔记08:id选择器之父子选择器
1.父子选择器 (1)01.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " ...
- font拓展字体
最近接触了一个将字体拓展的方法,感觉很不错,所以积累一下. 最近接触的项目一直再用antd,它本身已经提供了很多图标,但是依然不够用,所以需要我们拓展出来一些. 当我们下载到本地之后,就会有几个文件, ...