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,谢谢您!