【程序设计】12.3 [图画师] 更多坐标系

 

12.3 更多坐标系

第一节中我们还看到过饼图,但要在坐标系描述清这些圆和扇形的位置似乎太麻烦了。这是怎么画出来的?

除了直角坐标系,SPL 还提供了极坐标系

极坐标系也需要两个轴(平面图形总是要两个轴):极轴和角轴。轴图元的位置属性除了选择横轴和纵轴外,还可以选择极轴和角轴:

imagepng imagepng

有极坐标系知识的读者也很容易理解这两种轴图元的位置属性,这里不再赘述了。

把前面那个柱图改成极坐标系来画:


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 中的图元语句完全不改。

但是,画成了这样:

imagepng

这不是我们想要的。但是认真想一下,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,前面补了逗号把地区列表变成系列(只有一个为空的分类)。

现在画出来是这样,有点像了,剩下就是调整“柱子”的宽度了,另外还缺指示信息。这些都可以一步步实现出来。

imagepng

不过,还是有点麻烦的,SPL 直接提供了扇图元,会自动转换分类为系列并堆积:


A

B

5

=A2.plot("Sector","axis1":"area","data1":B1,"axis2":"amount","data2":A1)

6

=A2.draw(600,400)

使用图元的缺省属性画出来,只是外观和前面画的不同,调整属性就可以了。

imagepng

仔细的读者可能已经发现,我们并没有定义一个逻辑坐标系,而是每次给图元分别设置两个轴。那么,如果我们有三个轴 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 构成的坐标系,画出来的双轴图:

imagepng

【程序设计】 前言及目录

【程序设计】12.2 [图画师] 坐标系

【程序设计】12.4 [图画师] 图例