【程序设计】12.3 [图画师] 更多坐标系
12.3 更多坐标系
第一节中我们还看到过饼图,但要在坐标系描述清这些圆和扇形的位置似乎太麻烦了。这是怎么画出来的?
除了直角坐标系,SPL 还提供了极坐标系。
极坐标系也需要两个轴(平面图形总是要两个轴):极轴和角轴。轴图元的位置属性除了选择横轴和纵轴外,还可以选择极轴和角轴:
有极坐标系知识的读者也很容易理解这两种轴图元的位置属性,这里不再赘述了。
把前面那个柱图改成极坐标系来画:
A |
B |
|
1 |
[10,20,40,30,50] |
[East,North,West,South,Center] |
2 |
=canvas() |
|
3 |
=A2.plot("EnumAxis","name":"area","location":3) |
|
4 |
=A2.plot("NumericAxis","name":"amount","location":4) |
|
5 |
=A2.plot("Column","axis1":"area","data1":B1,"axis2":"amount","data2":A1) |
|
6 |
=A2.draw(600,400) |
只修改轴的定义,A5 中的图元语句完全不改。
但是,画成了这样:
这不是我们想要的。但是认真想一下,SPL 画得没有错,它就是把横轴和纵轴给扭成了极轴和角轴。横轴的位置变成了极轴的半径,而纵轴的数值变成了角轴的角度。柱图元在极坐标系下也没有问题。
我们要把这些“柱子”堆积到一个位置上。找一下图元确实有这个属性,但用了之后画出来是五个整圈,并没有堆积到一个位置上。
原来,枚举轴的坐标对应的是两节序列,前一节称为分类,后一节叫系列,堆积只能在系列之间。其实分类和系列相当于两个层次,但用两层序列并不容易描述,需要用个有字段的序表,这有点麻烦,所以 SPL 就用逗号分隔的字符串来描述这种关系。比如
[“USA,NY”,“USA,CA”,“USA,TX”,…,
“CHN,BJ”,“CHN,SH”,“CHN,TJ”,…,
…]
就可以描述一个两层关系,前一节相同的被认为是同一个分类。不同分类下的系列可以相同也可以不同。
而我们现在的情况,要把这些地区视为一个分类下的系列,也只有一个分类。
调整代码:
A |
B |
|
1 |
[10,20,40,30,50] |
[East,North,West,South,Center] |
2 |
=canvas() |
=B1.(","+~) |
… |
… |
|
5 |
=A2.plot("Column","stackType":1,"axis1":"area","data1":B2,"axis2":"amount","data2":A1) |
|
6 |
=A2.draw(600,400) |
A5 中要使用百分比堆积,这样将保证把整个 360 度的角轴占满。同时第一轴的数据要改成 B2,前面补了逗号把地区列表变成系列(只有一个为空的分类)。
现在画出来是这样,有点像了,剩下就是调整“柱子”的宽度了,另外还缺指示信息。这些都可以一步步实现出来。
不过,还是有点麻烦的,SPL 直接提供了扇图元,会自动转换分类为系列并堆积:
A |
B |
|
… |
… |
|
5 |
=A2.plot("Sector","axis1":"area","data1":B1,"axis2":"amount","data2":A1) |
|
6 |
=A2.draw(600,400) |
使用图元的缺省属性画出来,只是外观和前面画的不同,调整属性就可以了。
仔细的读者可能已经发现,我们并没有定义一个逻辑坐标系,而是每次给图元分别设置两个轴。那么,如果我们有三个轴 x,y1,y2,是不是可以 x 和 y1 配合出一个逻辑坐标系,x 和 y2 再配合出一个逻辑坐标系?
确实是可以的,这就是双轴图。
A |
B |
C |
|
1 |
[10,20,40,30,50] |
[4,2,3,4,9] |
[East,North,West,South,Center] |
2 |
=canvas() |
||
3 |
=A2.plot("EnumAxis","name":"area") |
||
4 |
=A2.plot("NumericAxis","name":"amount","location":2) |
||
5 |
=A2.plot("NumericAxis","name":"quantity","location":2,"yPosition":0.8) |
||
6 |
=A2.plot("Column","axis1":"area","data1":C1,"axis2":"amount","data2":A1) |
||
7 |
=A2.plot("Line","axis1":"area","data1":C1,"axis2":"quantity","data2":B1) |
||
8 |
=A2.draw(600,400) |
A4 和 A5 定义了两个纵轴,A6 使用 A3 和 A4 构成的坐标系,A7 使用 A3 和 A5 构成的坐标系,画出来的双轴图: