4.4.2.4 绘制整个图表
在讨论第二个绘图函数之前,我们先看一下如何把内容组织到一起。图 4.2 分别显示每个层次:我们已经写好了代码绘制左图的代码,还差绘制右图标签的函数。
图 4.2 绘制图表的两个阶段:第一阶段使用 drawPieSegment 函数(左),第二阶段使用 drawLabel 函数(右图)。图表显示的是 1900 年世界人口分布情况。
绘制图表的代码,首先从文件加载数据,然后,进行处理,与[前面讨论的]控制台程序相同。只是现在数据不输出到控制台,面是使用前面介绍的函数,绘制图表。可以看到,在清单 4.10 中是绘图函数 drawChart 的内容。
清单 4.10 绘制图表(F#)
let drawChart(file) =
letlines = List.ofSeq(File.ReadAllLines(file)) | 加载,
letdata = processLines(lines) | 处理数据
letsum = float(calculateSum(data)) |
letpieChart = new Bitmap(600, 400) | 创建绘图用的
letgr = Graphics.FromImage(pieChart) | 位图和对象
gr.Clear(Color.White)
drawStep(drawPieSegment,gr, sum, data) [1]
drawStep(drawLabel,gr, sum, data) [2]
gr.Dispose() <-- 最后,绘制
pieChart
函数的参数为 CSV 文件名,返回在内存中(in-memory)饼图的位图。在代码中,我们首先加载文件,用已有的 processLines 和 calculateSum 函数进行处理;然后,绘制图表,在最后一行,返回创建的位图,作为函数的结果。
要绘制所有内容,首先要创建一个 Bitmap 对象,和一个相关联的 Graphics 对象。我们在前面所有的函数中,都是用 Graphics 来绘图的,因此,这个对象创建后,就可以用白色背景填充位图,再用 drawStep 函数绘制图表。第一次调用[1],使用 drawPieSegment绘制饼图,第二次调用[2],使用 drawLabel绘制文本标签。可以尝试注释掉其中的一行,只绘制出一个阶段的内容,得到与图 4.2 相同的结果。我们还没有实现 drawLabel 函数,因为我们想首先展示整个绘图的过程,现在已经完成了这部分的应用程序了。