65.9K
CodeProject 正在变化。 阅读更多。
Home

2D数据的线性和对数显示:一个增强功能

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.50/5 (7投票s)

2007年1月29日

CPOL

5分钟阅读

viewsIcon

50811

downloadIcon

1286

DataPlotter 是一个用于图形化显示 2D 数据的 .NET 控件。对于 X 和 Y 轴,都可以选择线性或对数(任意基数)缩放。

Sample Image - DataPlotter2007.jpg

引言

这是对 2003 年由 Hans-Jürgen Schmidt 引入的著名 DataPlotter 进行的 2007 年增强。它包含了在此期间提出的功能请求。在本文中,我包含了原始文章中的“引言”、“背景”和“使用代码”部分。最后,我添加了我自己的增强功能。

DataPlotter 是一个用于图形化显示 2D 数据的 .NET 控件。对于 X 和 Y 轴,都可以选择线性或对数(任意基数)缩放。对于两个轴,还可以指定数据范围。

也许这会对其他人有所帮助。至少,它可以作为另一个关于如何在 .NET 中玩转 GDI+ 的示例。

背景

在 .NET 领域进行图表绘制,仍然有老牌的 MSChart ActiveX 控件,或者您需要购买市面上新的 .NET 控件。

由于 MSChart 控件并不满足我的需求,我也不想花钱,所以我决定自己开发。这个项目没有什么特别之处或新颖之处——它只是我在 .NET 图形领域的初步尝试。

Using the Code

DataPlotter 的实现相当简单:它是一个 .NET Windows 控件库,包含了一系列属性。其他所有内容都在 OnPaint 函数中处理。

这些是属性

Color ColorDraw 数据线的颜色
Color ColorGrid 网格线的颜色
Color ColorBg 背景颜色
Color ColorAxis 坐标轴和文本的颜色
Font FontAxis 文本的字体
long PenWidth 数据线的宽度
DrawModeType drawMode 数据点的绘制模式(LineDotBarCurve
long BorderTop 顶部内边距
long BorderLeft 左侧内边距
long BorderBottom 底部内边距
long BorderRight 右侧内边距
double XRangeStart X 轴上的数据范围起点
double XRangeEnd X 轴上的数据范围终点
double YRangeStart Y 轴上的数据范围起点
double YRangeEnd Y 轴上的数据范围终点
double XGrid X 方向线性网格的间距。对数视图忽略
double YGrid Y 方向线性网格的间距。对数视图忽略
long XLogBase X 方向对数视图的基数。如果小于 2,则显示线性视图
long YLogBase Y 方向对数视图的基数。如果小于 2,则显示线性视图
double[] XData 要显示的 X 数据
double[] YData 要显示的 Y 数据

增强功能

GridDrawModeType XGridDrawMode

X 值垂直网格的绘制方式
LineDashedDottedTickOutside

GridDrawModeType YGridDrawMode

Y 值水平网格的绘制方式
LineDashedDottedTickOutside

string XLabelFormat

X 值标签的格式字符串

string YLabelFormat

Y 值标签的格式字符串

Rectangle ChartArea

图表的内部(活动)区域

Point CalculatePoint(double x, double y)

计算 x 和 y 值的坐标

关于一些属性的提示

  • 边框定义了内部坐标轴矩形。在左侧和底部使用较大的边框,以便为刻度数字留出足够的空间。
  • 如果 LogBase 属性小于 2,则选择线性缩放。否则,该数字是对数缩放的基数。通常使用 0 表示线性刻度,10 表示对数刻度。
  • 对于对数缩放,请为 RangeStartRangeEnd 属性使用完整的数量级,例如,对于 LogBase 为 10 的情况,范围是 0.01 到 1000。
  • 数据数组的大小必须相同。
  • 标准格式字符串是“g”,它是一个 5 位浮点数。有关更多详细信息,请参阅 double.ToString(string)

OnPaint 函数的简要流程

  • 检查属性值是否一致。
  • 准备图形工具。有用于绘制图、网格线和坐标轴的画笔,以及用于绘制刻度数字的画刷。
  • 通过减去边框属性从客户端矩形大小计算出内部坐标轴矩形。
  • 内部矩形(= ChartArea)经过调整以适应等距的网格线。
  • 根据格式设置绘制 X 和 Y 方向的网格线。
  • 此处也绘制了格式化后的刻度数字。
  • 刻度数字的绘制方式可以避免重叠。
  • 然后创建坐标轴矩形。
  • 将数据数组转换为点数组。通过考虑 LogBase 刻度,将 RangeStartRangeEnd 的值映射到坐标轴网格的点上。无效点(通过异常处理程序检测)会被跳过,并重用上一个有效点。
  • 裁剪矩形可防止线条绘制超出图表区域。
  • 根据 DrawMode 绘制点。

DataPlotter 是一个可以像 DataPlotterTest 应用程序中所示那样使用的程序集。该演示包含四个按钮,提供用于可能的线性/对数缩放的示例数据。还有一个属性网格,用于查看/更改 DataPlotter 的属性。

下一步该做什么

DataPlotter 的当前实现对我来说非常有用。但我可以想到许多有用的扩展和增强功能:

  • 使用多个数据集在同一图表中以不同颜色绘制。
  • 添加描述属性,如标题、坐标轴名称等。
  • 扩展绘制模式,例如虚线或点线等。

您也可以自行尝试,并让我知道您的增强功能。

嗯,正如您所见,在此良好的基础上进行增强很容易。Hans-Jürgen,谢谢您!

© . All rights reserved.