最近在做一个WPF方面的项目,需要用到一些统计功能,需要制作一些直方图和线状图。一般来说,传统的直方图和线状图的编写方法都是:
1. 确定X轴和Y轴,把刻度分别在X轴和Y轴上画出来。
2. 画出X轴和Y轴,比如分别加上两个箭头之类的装饰品。
3. 然后根据Y值,
a. 对于直方图,将Y值转换为直方图里面矩形的高度,根据X值确定矩形在X轴的位置。
b. 对于线状图,将Y值转换为直方图里面点的高度,根据X值确定点在X轴的位置。
4. 如果直方图里面有多个数据序列的话,需要考虑使用不同的颜色来表示矩形,对于线状图也是一样。
看起来,还是蛮麻烦的嘛。以下面的直方图为例:
一个直方图实际上由以下部分组成:
1. 坐标轴,坐标轴需要确定刻度,需要确定刻度的范围,例如上图的小刻度与大刻度的宽度需要计算好。另外还需要根据坐标轴表示的数据来确定大刻度代表多大的范围,小刻度代表多大的范围。这里面就又涉及到,如果坐标轴表示的数据是整数应该怎么办,数据是日期类型又应该怎么办,数据是字符串类型又应该怎么办……。
坐标轴除了需要考虑数据的问题以外,还需要考虑格式排版的问题,例如刻度是显示在坐标轴的下面(左边),上面(右边)还是直接显示在坐标轴上?坐标轴的标题(Axis Title)如何显示……
还需要考虑坐标轴式样的问题,例如有些人喜欢给坐标轴添加一个小箭头,表示数据的趋势,因此在确定坐标轴(长度或者高度)的时候,需要增加一点额外的空间(为箭头做准备的)。
还有一些,例如如果用户有需要,要求你的坐标轴的刻度不是用字符串显示,而是用图片显示,你的 直方图控件需要能够很方便地扩展到这种情况。
另外,坐标轴的原点的位置也是可以变换的。例如,你可能需要指定X轴从Y轴的一个值穿过,而不是从0这个位置穿过,当然Y轴也可能会需要从X轴的非0值穿过。
2. 对于Y轴,还有一些特殊的需求,例如,有些时候,Y轴的值相差过大,比如说很多值可能在1以下,而又有一些值在1000以上,按照平常的10进制的刻度计量方法,不可避免地会有一些数据不能显示,或者就是显示的高度过大,不美观。因此刻度的计量方法会有点变化,例如按照Log的方式来设置刻度(可以参考Office 2007里面的直方图设置界面来体验这一点)……
3. 统计图区域。直方图里面不应该只能显示 一个系列的数据,上图的直方图就可以显示三个系列的数据(Series 1, Series 2和Series 3)。因此这就导出了另外几个问题:
a. 第一当然是每一个系列数据的矩形的高度应该是计算出来的,这个时候你需要确保Y轴的刻度和矩形的高度是相匹配的。
b. 如果有超过一个系列的数据的话,你需要用不同的醒目的颜色来标识不同的系列,请注意醒目的颜色就决定了我们不能使用随机数来生成颜色,因为浅蓝色和蓝色之间的差别肯定没有绿色和蓝色之间的差别明显。
c. 统计图里面可能要求显示网格(宽度),这样可以更直观地显示直方图中矩形所代表的数据。
d. 用户也可能会要求在直方图上面显示数据,跟我们例子里面的直方图的显示方式一样。当然,这个数据的摆放也会有讲究,例如是放在矩形的上面,还是放在矩形的中间。
4. 统计图的标题部分以及其他部分的布局。例如标题可以放在绘图区域的上方,下方,左边,右边,或者用户可以自己定义放在什么地方。
5. 等等
6. …
看起来,这个直方图的确是有很多事情要做呀,路漫漫、革命尚未成功、未完待续。