在坐标系与转换 中,我们了解了集算器图形中逻辑轴与物理轴的联系,以及如何设定坐标轴及图元的绘制位置。在集算器中,提供了各种不同的逻辑轴,可以满足各类统计图绘制的需求。不同种类的逻辑轴需要不同的设置,才能够正常完成坐标转换的计算。需要说明的是,逻辑轴的定义,其主要目的是为了在绘图时,将图元的逻辑坐标转换为物理坐标,即使绘图时并不绘制出逻辑轴本身,对其它图元的定位也没有影响。
在绘图时,经常需要表示图中数据数值的大小,此时就需要使用数值轴,它可以提供数值型的统计值的坐标转换。数值轴的应用最为广泛,不仅可以使用在几乎所有统计图中,还可以用来绘制函数图等。
数值轴会根据设定的值域,来计算坐标值在画布中的对应位置。例如,下面的函数图画法:
|
A |
1 |
=canvas() |
2 |
=A1.plot("BackGround") |
3 |
41 |
4 |
=A3.([round(pi(2*#-2)/(A3-1),3),round(sin(pi(2*#-2)/(A3-1)),3)]) |
5 |
=A1.plot("NumericAxis","name":"x","autoCalcValueRange":false, "maxValue":7.0,"scaleNum":7,"xPosition":0.45) |
6 |
=A1.plot("NumericAxis","name":"y","location":2,"autoCalcValueRange": false,"maxValue":1.0,"minValue":-1.0,"scaleNum":4) |
7 |
=A1.plot("Line","markerStyle":0,"axis1":"x","data1":A4.(~(1)),"axis2":"y", "data2":A4.(~(2))) |
8 |
=A1.draw@p(350,200) |
画法中采用折线图拟合正弦曲线,A3中设定一个周期内的采样点数;A4中准备绘图数据如下:
A5中设置横轴,最大值为7,最小值为默认值0,同时将横轴绘制在纵轴的中间;A6中设置纵轴,最大值为1,最小值为-1;A7中绘制折线图,折线图的逻辑坐标来源于A4绘图结果如下:
可以看到,通过设定数值轴,可以根据计算出的数值来绘图。对数值轴而言,逻辑坐标的取值是连续的,因此数值轴是一种连续轴。
在数值轴中,根据定义中轴的起始位置和结束位置的逻辑轴坐标,就确定了轴的长度;再根据数值轴的值域(由最小值和最大值决定),就可以计算出某个坐标值的物理位置,在集算器中,坐标转换的计算是自动完成的,画法中只要正确定义坐标轴即可。
在默认情况下,数值轴会将自动计算范围属性设为true,此时数值轴的值域将根据使用这个坐标轴的图元来自动设定。如果自动产生的坐标轴设定不满足需要,可以和本例一样自行设定坐标轴的值域及其刻度数。
日期轴和数值轴是相似的,但是日期轴上的逻辑坐标并非普通的数值,而是日期时间数据。日期轴常常用于时间趋势图、时序状态图等统计图中。
例如,下面的股价走势图画法:
|
A |
1 |
=canvas() |
2 |
=demo.query("select * from STOCKRECORDS where STOCKID='002242'") |
3 |
=A1.plot("BackGround") |
4 |
=A1.plot("DateAxis","name":"x","format":"dd/M","displayStep":20) |
5 |
=A1.plot("NumericAxis","name":"y","location":2,"autoCalcValueRange": false,"maxValue":50.0) |
6 |
=A1.plot("Line","markerWeight":2,"axis1":"x","data1":A2.(DATE),"axis2": "y","data2":A2.(CLOSING)) |
7 |
=A1.draw@p(450,250) |
画法中,A2中从数据库获取绘图使用的数据如下:
A3绘制白色背景;A4中设定横轴x为日期轴,自动计算值域,且在刻度标签中仅显示交易日期;A5中设定纵轴y为数值轴,且最大值为50;A6中绘制折线图,绘制的逻辑坐标为交易日期和收盘股价。A7绘制结果如下:
从图中可以注意到,由于只有交易日有数据,因此有的日期并无数据点。可见,和数值轴相同,日期轴也是一种连续轴。
在统计图中经常需要比较不同分类,或者不同系列的数据,此时就会用到枚举轴。枚举轴可以根据分类或者系列的名称,来找到绘图的位置。与数值轴不同,枚举轴的坐标是非连续的。
枚举轴中必须设定全部分类及系列的名称序列,这样就可以根据某个分类或者系列的值来获得正确的物理坐标。
比如,下面的水果单价柱形图画法:
|
A |
1 |
=canvas() |
2 |
=demo.query("select * from FRUITS") |
3 |
=A1.plot("BackGround") |
4 |
=A1.plot("EnumAxis","name":"x","categories":A2.(NAME)) |
5 |
=A1.plot("NumericAxis","name":"y","location":2) |
6 |
=A1.plot("Column","axis1":"x","data1":A2.(NAME),"axis2":"y","data2": A2.(UNITPRICE)) |
7 |
|
8 |
=A1.draw@p(350,200) |
画法中,A2中从数据库获取绘图使用的数据如下:
A3绘制白色背景;A4中设定横轴x为枚举轴,并设定分类序列为水果名称构成的序列;A5中设定纵轴y为数值轴,自动计算值域;A6中绘制柱图,绘制的逻辑坐标为水果名称和水果单价。A8绘制结果如下:
为了更明确地表现枚举轴进行坐标转换的情况,在A7中写入代码=A1.plot("Dot","markerStyle":6,"axis1":"x","data1":"Peach","axis2":"y","data2":"1.5"),再绘制一个点形图,其属性如下:
绘制结果如下,可以看到点["Peach",1.5]在图中的位置:
枚举轴中的分类和系列也可以不设定,此时将根据使用枚举轴的图元自动分析。
枚举轴中还可以同时使用分类和系列,如下面体操数据统计图的画法:
|
A |
1 |
=canvas() |
2 |
=demo.query("select * from GYMSCORE") |
3 |
=A1.plot("BackGround") |
4 |
=A1.plot("EnumAxis","name":"x") |
5 |
=A1.plot("NumericAxis","name":"y","location":2) |
6 |
=A1.plot("Column","axis1":"x","data1":A2.(EVENT+","+NAME),"axis2":"y","data2":A2.(SCORE)) |
7 |
|
8 |
=A1.draw@p(450,250) |
画法中,A2中从数据库获取绘图使用的数据如下:
A3绘制白色背景;A4中设定横轴x为枚举轴,自动分析数据;A5中设置纵轴y为数值轴;A6中绘制柱图。同时使用分类和系列时,枚举轴上的逻辑坐标需要包含分类和系列的信息,将分类和系列的值用逗号分隔开,如"Vault,Becky Downie"。
A8中绘图结果如下:
在极坐标系中,也经常使用数值轴、枚举轴或者日期轴,在将它们作为极轴或者角轴使用时,逻辑轴的属性与直角坐标系中有所不同。
如下面的跳马成绩饼图:
|
A |
1 |
=canvas() |
2 |
=demo.query("select * from GYMSCORE where EVENT = 'Vault'") |
3 |
=A1.plot("BackGround") |
4 |
=A1.plot("EnumAxis","name":"x","location":3,"polarX":0.5,"allowLabels":false) |
5 |
=A1.plot("NumericAxis","name":"y","location":4,"allowLabels":false) |
6 |
=A1.plot("Sector","text":A2.(NAME),"axis1":"x","data1":A2.(NAME), "axis2":"y","data2":A2.(SCORE)) |
7 |
=A1.draw@p(450,350) |
画法中,A2中从数据库获取绘图使用的数据:
A4中设定极轴x为枚举轴,并选择不显示标签,并设定极点的物理横坐标为0.5,居中绘制。A5中设定角轴y为数值轴,同样不显示标签,而且并不修改角轴相关属性的默认值:
A6中绘制饼图,绘制的逻辑坐标为运动员姓名和得分,并标注运动员姓名。A7绘制结果如下:
可以看到,在极轴设定中,极轴长度,即极坐标系的半径,如果按比例设定时,是按照画布宽度为单位设定的。
下面,将角轴的属性作出修改,修改A5中的代码为=A1.plot("NumericAxis","name":"y","location":4,"startAngle":30,"endAngle":300,"allowLabels":false),改变极坐标的起始角度和结束角度,如下:
设置极坐标系的起始角度和结束角度之后,极坐标系的范围就产生了变化,绘图结果如下:
图例是统计图中的重要组成部分,在图例中可以解释统计图中各种颜色或者符号所代表的内容。图例中,一种颜色或者符号,以及它的说明文字,构成一个图例项,而图例项的位置并不容易根据横轴或者纵轴的逻辑坐标来定位,因此,集算器中的图例,本身就是一种特殊的逻辑轴。
下面,我们在枚举轴这一小节中见过的水果单价柱形图中添加图例:
|
A |
1 |
=canvas() |
2 |
=demo.query("select * from FRUITS") |
3 |
=A1.plot("BackGround") |
4 |
=A1.plot("EnumAxis","name":"x","categories":A2.(NAME)) |
5 |
=A1.plot("NumericAxis","name":"y","location":2) |
6 |
=A1.plot("Column","axis1":"x","data1":A2.(NAME),"axis2":"y","data2": A2.(UNITPRICE)) |
7 |
=A1.plot("Legend","legendText":A2.(NAME),"x":0.81,"y":0.2,"width":0.18) |
8 |
=A1.draw@p(350,200) |
在A7中添加了图例图元的代码,设定了图例数据及其位置如下:
其中,图例的坐标设定与逻辑轴是相似的,其中X和Y确定图例区的左上角的物理轴坐标。需要注意的是,当图例区的Width或Height设为0时,将按照图例区所需的尺寸自动设定,如上图中的Height属性。
设置完成后,绘图结果如下:
从结果中可以看到,当图例区的文字在设定宽度内放置不下时,会自动折行显示。当未设定图例项的填充颜色时,会自动生成;当图形中的柱图颜色也是自动生成,且顺序与图例项一致时,就能够正确显示。
但是,当两者的顺序不同,或者是多系列多分类的统计图中,情况如何呢?我们再来看下面的例子,在体操成绩簇状柱图中添加图例:
|
A |
1 |
=canvas() |
2 |
=demo.query("select * from GYMSCORE") |
3 |
=A1.plot("BackGround") |
4 |
=A1.plot("EnumAxis","name":"x") |
5 |
=A1.plot("NumericAxis","name":"y","location":2) |
6 |
=A1.plot("Column","axis1":"x","data1":A2.(EVENT+","+NAME),"axis2":"y","data2":A2.(SCORE)) |
7 |
=A1.plot("Legend","legendText":A2.id(NAME),"x":0.81,"y":0.2,"width": 0.18) |
8 |
=A1.draw@p(450,250) |
在A7中添加了图例图元的代码,设定了图例数据及其位置如下:
绘图结果如下:
在这里,我们可以发现一些问题:图例中数据对运动员的姓名做了排序,使得顺序无法与柱图中对应,图例和图形并不相符。为了避免这样的情况,应该保持数据的顺序一致,如将A2中的代码改为=demo.query("select * from GYMSCORE order by NAME")。此时,绘图结果如下:
由于绘图数据已经按照姓名做了排序,此时的图例和图形就可以对应了。