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






4.50/5 (7投票s)
DataPlotter 是一个用于图形化显示 2D 数据的 .NET 控件。对于 X 和 Y 轴,都可以选择线性或对数(任意基数)缩放。
 
 
引言
这是对 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 | 数据点的绘制模式( Line、Dot、Bar、Curve) | 
| 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 值垂直网格的绘制方式 | 
| GridDrawModeType YGridDrawMode | Y 值水平网格的绘制方式 | 
| string XLabelFormat | X 值标签的格式字符串 | 
| 
 | Y 值标签的格式字符串 | 
| 
 | 图表的内部(活动)区域 | 
| Point CalculatePoint(double x, double y) | 计算 x 和 y 值的坐标 | 
关于一些属性的提示
- 边框定义了内部坐标轴矩形。在左侧和底部使用较大的边框,以便为刻度数字留出足够的空间。
- 如果 LogBase属性小于 2,则选择线性缩放。否则,该数字是对数缩放的基数。通常使用 0 表示线性刻度,10 表示对数刻度。
- 对于对数缩放,请为 RangeStart和RangeEnd属性使用完整的数量级,例如,对于LogBase为 10 的情况,范围是 0.01 到 1000。
- 数据数组的大小必须相同。
- 标准格式字符串是“g”,它是一个 5 位浮点数。有关更多详细信息,请参阅 double.ToString(string)。
OnPaint 函数的简要流程
- 检查属性值是否一致。
- 准备图形工具。有用于绘制图、网格线和坐标轴的画笔,以及用于绘制刻度数字的画刷。
- 通过减去边框属性从客户端矩形大小计算出内部坐标轴矩形。
- 内部矩形(= ChartArea)经过调整以适应等距的网格线。
- 根据格式设置绘制 X 和 Y 方向的网格线。
- 此处也绘制了格式化后的刻度数字。
- 刻度数字的绘制方式可以避免重叠。
- 然后创建坐标轴矩形。
- 将数据数组转换为点数组。通过考虑 LogBase刻度,将RangeStart到RangeEnd的值映射到坐标轴网格的点上。无效点(通过异常处理程序检测)会被跳过,并重用上一个有效点。
- 裁剪矩形可防止线条绘制超出图表区域。
- 根据 DrawMode绘制点。
DataPlotter 是一个可以像 DataPlotterTest 应用程序中所示那样使用的程序集。该演示包含四个按钮,提供用于可能的线性/对数缩放的示例数据。还有一个属性网格,用于查看/更改 DataPlotter 的属性。
下一步该做什么
DataPlotter 的当前实现对我来说非常有用。但我可以想到许多有用的扩展和增强功能:
- 使用多个数据集在同一图表中以不同颜色绘制。
- 添加描述属性,如标题、坐标轴名称等。
- 扩展绘制模式,例如虚线或点线等。
您也可以自行尝试,并让我知道您的增强功能。
嗯,正如您所见,在此良好的基础上进行增强很容易。Hans-Jürgen,谢谢您!


