SVG——新一代Web设计及互动媒体的革新

创建随内容动态缩放的SVG图形 - 第二页

文章索引
创建随内容动态缩放的SVG图形
第二页
所有页面

3 散点图


  最后介绍的是散点图。这种图形适用于在 X 维和 Y 维上都相差很大的数据。我们采用与前面相同的方法,但是这一次要绘制的数据同时提供 X 和 Y 坐标值。

  该例中,数据以 (X-value),(Y-value) 的形式传入,比如: [1,1]、[3,5]、[50,2] 和 [10,34]。

  我同样提供了一个 Java 实例程序以供下载(请参阅 参考资料),请分析下面这些代码。

  第 31-57 行确定 X 和 Y 的最大值。

  第 60-61 行计算 X 轴和 Y 轴的比例因子。

  第 67-119 行绘制坐标轴,这里画了 4 条辅助虚线,并相应地做了标记。

  第 124-157 行绘制数据:

代码6 计算和绘制散点图

122. // The axis and the guide lines are ready; now draw the data.
123. SVGout.write("\n <g style=\"fill:none;
124. stroke:red; stroke-width:3\">");
125.
126. for(i=0;i<dataToPlot.length;i++){
127.
128. // Get the value out of the array.
129. String value = dataToPlot[i];
130.
131. // The data is in the form (X-Value),(Y-Value), so find
132. // the comma and get the values on either side of it.
133. index = value.indexOf (',');
134. String X_Pos = value.substring(0,index);
135. String Y_Pos = value.substring(index+1);
136.
137. // Change them to numbers
138. XValue = Integer.parseInt(X_Pos);
139. YValue = Integer.parseInt(Y_Pos);
140.
141. // Calculate the point's position by using the scaling
142. // factor calculated earlier
143. XValue = XValue*XAxisScalingFactor;
144. YValue = YValue*YAxisScalingFactor;
145. YValue = 1000-YValue;
146.
147. // You now have your point. As it's a scatter plot, it
148. // would look nice with an X, so use the point to draw
149 // a line from the top left to the bottom right, and from
150. // the top right to the bottom left.
151.
152. SVGout.write("\n <line x1=\""+ (int)(XValue-5) +
153 "\" y1=\""+(int)(YValue+5)+ "\" x2=\""+(int)(XValue+5)+
154. "\" y2=\""+(int)(YValue-5)+"\" />");
155. SVGout.write("\n <line x1=\""+ (int)(XValue+5) +
156. "\" y1=\""+(int)(YValue+5)+ "\" x2=\""+(int)(XValue-5)+
157. "\" y2=\""+(int)(YValue-5)+"\" />");
158.}

  首先要定义这一组的样式(第 123 行)。

  然后开始处理数据,第 129 行获得了数据。

  根据逗号分隔 X 和 Y 值(第 133-135 行),并将这些值转化成数值(第 138-139 行)。

  计算点的位置(第 143 - 145 行)。

  现在可以画点了,但是这一次不是简单地画一个点,而是要用 X 来标记。也就是说要画两条线,一条从左上角到右下角,一条从右上角到左下角,偏移量都是 5 个像素,从而得到以计算点为中心的 X。

下载并运行这个例子。

图5 动态生成的散点图

4 进一步改进

  为了简化和保持代码的可读性,我在上述例子中使用了最少的 Java 代码生成 SVG。当然,您还可以改进这些例子,增加新的颜色、效果和信息。例子中包含两个柱状图生成器,一个像前面所述的那样绘制简单的矩形(参见 图 3)。另一个稍微复杂一点,使用斜线和点填充图形,但计算条形的方法不变,如图 6 所示。

图6 改进的柱状图

  图 7 是一个线图,显示了测试的数据库中的一些信息,添加了一个徽标、阴影效果和测试的统计表。

图7 改进的SVG线图
 
  图 8 是一个散点图,测试过程中我希望比较从数据库中删除一条记录所用的时间,一组数据使用 JDBC 执行这项操作,另一组则使用准备好的语句执行该操作。两组数据都提供了徽标、阴影效果和状态表。

图8 改进的SVG散点图
 
  这些图的完整SVG版本包含在示例文件中,http://download.boulder.ibm.com/ibmdl/pub/software/dw/library/x-svggrph_examples.zip

5 结束语

  本文通过例子说明了如何根据数据缩放 SVG 图形。通过这些技术和提供的示例代码,您可以呈现自己的图形,并根据需要定制图形。

(THE END)



 

将要更新