在N久之前,我发过一个绘制曲线的文章 先发个绘制曲线图的:用ASP.NET with C# 绘制曲线图(Curve图) 里面介绍了简单的绘制曲线图的方法.近来重新翻阅了这篇文章.心情大好之下又重新修改了一下绘制方法,增加自动适应数据的处理和可以根据传入的数据绘制多条曲线
照例先上图:
比以前Cool吧?呵呵,其实就是根据数据自动计算边距和字体等.
///
<summary>
/// 自动根据参数调整图像大小
/// </summary>
public void Fit()
{
// 计算字体距离
intFontSpace = FontSize + 5 ;
// 计算图像边距
float fltSpace = Math.Min(Width / 6 , Height / 6 );
XSpace = fltSpace;
YSpace = fltSpace;
// 计算X轴刻度宽度
XSlice = (Width - 2 * XSpace) / (Keys.Length - 1 );
// 计算Y轴刻度宽度和Y轴刻度开始值
float fltMinValue = 0 ;
float fltMaxValue = 0 ;
for ( int i = 0 ; i < Values.Length; i ++ )
{
if (Values[i] < fltMinValue)
{
fltMinValue = Values[i];
}
else if (Values[i] > fltMaxValue)
{
fltMaxValue = Values[i];
}
}
if (YSliceBegin > fltMinValue)
{
YSliceBegin = fltMinValue;
}
int intYSliceCount = ( int )(fltMaxValue / YSliceValue);
if (fltMaxValue % YSliceValue != 0 )
{
intYSliceCount ++ ;
}
YSlice = (Height - 2 * YSpace) / intYSliceCount;
}
/// 自动根据参数调整图像大小
/// </summary>
public void Fit()
{
// 计算字体距离
intFontSpace = FontSize + 5 ;
// 计算图像边距
float fltSpace = Math.Min(Width / 6 , Height / 6 );
XSpace = fltSpace;
YSpace = fltSpace;
// 计算X轴刻度宽度
XSlice = (Width - 2 * XSpace) / (Keys.Length - 1 );
// 计算Y轴刻度宽度和Y轴刻度开始值
float fltMinValue = 0 ;
float fltMaxValue = 0 ;
for ( int i = 0 ; i < Values.Length; i ++ )
{
if (Values[i] < fltMinValue)
{
fltMinValue = Values[i];
}
else if (Values[i] > fltMaxValue)
{
fltMaxValue = Values[i];
}
}
if (YSliceBegin > fltMinValue)
{
YSliceBegin = fltMinValue;
}
int intYSliceCount = ( int )(fltMaxValue / YSliceValue);
if (fltMaxValue % YSliceValue != 0 )
{
intYSliceCount ++ ;
}
YSlice = (Height - 2 * YSpace) / intYSliceCount;
}
看我把数据缩小一个级别的效果:
因为代码里面充斥了大量注释,也不敲太多文字了..完整代码奉上:
using
System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.Data;
using System.Drawing.Drawing2D;
namespace SarchPMS.Business.Draw
{
public class DrawingCurve : DrawingChart
{
/// <summary>
/// 画曲线图
/// </summary>
/// <param name="dsParameter"></param>
/// <returns></returns>
public override Bitmap DrawImage(DataSet dsParameter)
{
Curve2D cuv2D = new Curve2D();
cuv2D.Fit();
return cuv2D.CreateImage();
}
}
public class Curve2D
{
private Graphics objGraphics; // Graphics 类提供将对象绘制到显示设备的方法
private Bitmap objBitmap; // 位图对象
private float fltWidth = 480 ; // 图像宽度
private float fltHeight = 248 ; // 图像高度
private float fltXSlice = 50 ; // X轴刻度宽度
private float fltYSlice = 50 ; // Y轴刻度宽度
private float fltYSliceValue = 20 ; // Y轴刻度的数值宽度
private float fltYSliceBegin = 0 ; // Y轴刻度开始值
private float fltTension = 0.5f ;
private string strTitle = " 曲线图 " ; // 标题
private string strXAxisText = " 月份 " ; // X轴说明文字
private string strYAxisText = " 万元 " ; // Y轴说明文字
private string [] strsKeys = new string [] { " 一月 " , " 二月 " , " 三月 " , " 四月 " , " 五月 " , " 六月 " , " 七月 " , " 八月 " , " 九月 " , " 十月 " , " 十一月 " , " 十二月 " }; // 键
private float [] fltsValues = new float [] { 20.0f , 30.0f , 50.0f , 55.4f , 21.6f , 12.8f , 99.5f , 36.4f , 78.2f , 56.4f , 45.8f , 66.5f , 99.5f , 36.4f , 78.2f , 56.4f , 45.8f , 66.5f , 20.0f , 30.0f , 50.0f , 55.4f , 21.6f , 12.8f }; // 值
private Color clrBgColor = Color.Snow; // 背景色
private Color clrTextColor = Color.Black; // 文字颜色
private Color clrBorderColor = Color.Black; // 整体边框颜色
private Color clrAxisColor = Color.Black; // 轴线颜色
private Color clrAxisTextColor = Color.Black; // 轴说明文字颜色
private Color clrSliceTextColor = Color.Black; // 刻度文字颜色
private
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.Data;
using System.Drawing.Drawing2D;
namespace SarchPMS.Business.Draw
{
public class DrawingCurve : DrawingChart
{
/// <summary>
/// 画曲线图
/// </summary>
/// <param name="dsParameter"></param>
/// <returns></returns>
public override Bitmap DrawImage(DataSet dsParameter)
{
Curve2D cuv2D = new Curve2D();
cuv2D.Fit();
return cuv2D.CreateImage();
}
}
public class Curve2D
{
private Graphics objGraphics; // Graphics 类提供将对象绘制到显示设备的方法
private Bitmap objBitmap; // 位图对象
private float fltWidth = 480 ; // 图像宽度
private float fltHeight = 248 ; // 图像高度
private float fltXSlice = 50 ; // X轴刻度宽度
private float fltYSlice = 50 ; // Y轴刻度宽度
private float fltYSliceValue = 20 ; // Y轴刻度的数值宽度
private float fltYSliceBegin = 0 ; // Y轴刻度开始值
private float fltTension = 0.5f ;
private string strTitle = " 曲线图 " ; // 标题
private string strXAxisText = " 月份 " ; // X轴说明文字
private string strYAxisText = " 万元 " ; // Y轴说明文字
private string [] strsKeys = new string [] { " 一月 " , " 二月 " , " 三月 " , " 四月 " , " 五月 " , " 六月 " , " 七月 " , " 八月 " , " 九月 " , " 十月 " , " 十一月 " , " 十二月 " }; // 键
private float [] fltsValues = new float [] { 20.0f , 30.0f , 50.0f , 55.4f , 21.6f , 12.8f , 99.5f , 36.4f , 78.2f , 56.4f , 45.8f , 66.5f , 99.5f , 36.4f , 78.2f , 56.4f , 45.8f , 66.5f , 20.0f , 30.0f , 50.0f , 55.4f , 21.6f , 12.8f }; // 值
private Color clrBgColor = Color.Snow; // 背景色
private Color clrTextColor = Color.Black; // 文字颜色
private Color clrBorderColor = Color.Black; // 整体边框颜色
private Color clrAxisColor = Color.Black; // 轴线颜色
private Color clrAxisTextColor = Color.Black; // 轴说明文字颜色
private Color clrSliceTextColor = Color.Black; // 刻度文字颜色
private