- 浏览: 140341 次
- 性别:
- 来自: 未来
-
文章分类
- 全部博客 (174)
- Eclispe (3)
- javaScript (33)
- SVG学习 (22)
- Java (21)
- 网站 (12)
- learn English (1)
- 文档 (25)
- 常用网站收录 (11)
- struts (6)
- 常用API (1)
- html (2)
- jsp (2)
- spring (2)
- IDE (1)
- 数据结构 (1)
- JDBC (2)
- html + css (1)
- xml (3)
- 心声 (1)
- Axis2 (1)
- svg (4)
- webService (2)
- unix (2)
- c/c++ (3)
- html5 (1)
- Android (2)
- Jet标签 (1)
- oracle (2)
- 工具 (1)
- ideas (0)
- lean plan (1)
- java技术网站,信息收集综合及分类 (0)
最新评论
-
calosteward:
感谢博主对svg convert to PDF资源的分享。我也 ...
How to Convert a SVG File to PDF Format -
long316:
fhhhh
WinArchiver 2.7 -
long316:
ddddd
WinArchiver 2.7
创建随内容动态缩放的SVG图形
BRIAN VENN 2008-04-17 来源:
文章首页
创建随内容动态缩放的SVG图形
第二页
页1 共2页
本文通过例子说明了如何根据数据缩放 SVG 图形。通过这些技术和提供的示例代码,您可以呈现自己的图形,并根据需要定制图形。
Scalable Vector Graphics(可缩放向量图形,SVG)是一种基于 XML 的语言,可用于绘制二维图形。它能够快速地呈现图形,因此很自然可用于表示图形这样的数据。但是如果要表示的数据相差很大,比如今天的图形数据是从 0 到 10,明天的数据就变成 0 到 1000000,以同样的比例绘制这样的数据是没有意义的。理想情况下,需要根据内容来缩放 SVG 图形。作者 Brian Venn 将介绍如何实现这一点。
我在 IBM Hursley UK 做测试和开发时遇到这样一个问题。于是我便写了一些代码,以便能够精细地使用 SVG 绘制柱状图、线图和散点图。但是每次测试所要处理的数据都要跨越多个数量级。使用同一比例来绘制每个图是没有用处的,很多图要么非常大,要么非常小,数据要么拥挤在一个角上,要么分散在整个页面上。
我需要一种能够自动确定每组数据使用的最佳比例的方法。
1 一点高中数学知识
从问题中我发现,自动缩放图形的最佳方式是观察需要绘制的数据集,确定数据集中的最大值,并使用该值作为其他将绘制的数据的比例。
最好通过 实际的例子来说明我采用的技术。假设测试生成三个值:A、B 和 C。每次测试后都需要将这些值绘制到柱状图中,但是每次测试中数据的范围都是动态变化的。
第一次测试生成的数据,如下所示:
A=100
B=50
C=25
在这次测试中,A 的值最大,为 100。第一项任务(也是最重要的任务)是计算图形的 比例因子,就是说在绘图时每单位的值在高度上要占用多少像素。比例因子可以用图轴的高度除以数据的最大值来获得。通过下面的计算就可以清楚如何获得比例因子。
为了简单起见,Y 轴的高度设为 1000 像素,这样计算起来很方便。
数据集中的最大值是 100(A)。
对于该图,比例因子应该是: 1000/100 = 10。
因此对于这个柱状图,每单位的值在高度上用 10 个像素表示。
要得到每个条的高度,只需要用比例因子乘上数据集中的值即可,就是说每个条的高度为:
图1 使用比例因子,最大值为100(A)
假设下一次测试得到如下所示的值:
A=2000
B=5000
C=800
要记住,Y 轴仍然是 1000 个像素高。这次测试中的最大值在 B 栏,为 5000。 因此比例因子就是 1000/5000=0.2。
因此每个条的高度为:
图2 使用比例因子,最大值为5000(B)
图2 使用比例因子,最大值为 5000(B)
可以看出,因为条的高度是相对于最大值计算得到的,条的高度不会超过 1000 像素,因此图不会画得太高。SVG 动态缩放的关键就是比例因子。要记住,比例因子是根据最大值计算得到的,而其他数据都根据比例因子值来计算。
现在已经介绍了比例因子这个重要概念,下面来说明如何使用它。下面的例子是一个小型的 Java 语言程序,从命令行中得到一组数据,然后按照 上例所述的方式绘制 SVG 柱状图。虽然使用 Java 代码进行编写,但其中的关键是数学计算。需要的话,可以参照这里的 Java 代码用其他任何语言改写这个程序。
本文不再列出完整的代码,仅仅介绍其中的要点。建议您下载这个例子(请参阅 参考资料),然后使用带有对行进行编号功能的编辑器打开 SVG_barchart.java 文件。
首先,第 38-48 行确定传入的数据的最大值。
最重要的是第 51 行,它计算 Y 轴的比例因子:
代码1 计算 Y 轴比例因子
51. YAxisScalingFactor = 1000/(double)largestNumber;
第 58 和第 59 行创建了 SVG 输出文件。SVG 使用 SVGout.write(-SVG-) 写入该文件。主要必须使用各种转义字符,如双引号用 \" 表示。有时候这样使 SVG 难以阅读,但必需如此,否则 Java 编译器就不能正确地解释它,代码也无法编译。此外,还要注意每个 SVG 文本行都以 \n 开始,这样可以保证使用 SVG 查看器的“查看源代码”功能时,SVG 更容易阅读。
第 70-79 行绘制 X 和 Y 轴。X 轴是从 [x=0, y=1000] 到 [x=1000, y=1000] 的一条直线,Y 轴是从 [x=0, y=0] 到 [x=0, y=1000],这样就建立了一个简单的笛卡儿坐标系。
第 82 和 83 行在 Y 轴的顶端和中间各划一条水平虚线,这样做只是为了让查看图时更方便。
第 86 和 87 行在顶端和中间标记 Y 轴。注意,要使用前面计算的最大值来标记 Y 轴。
代码2 标记 Y 轴
86. SVGout.write("\n <text style=\"fill:black; stroke:none\"
x=\"-10\" y=\"0\" >" + largestNumber + "</text>");
87. SVGout.write("\n <text style=\"fill:black; stroke:none\"
x=\"-10\" y=\"500\" >" + (largestNumber/2) + "</text>");
值是动态变化的,因此这里使用 largestNumber 来标记轴。如果需要,添加其他的基准线和标记也很方便。
绘制柱状图从第 90 行开始:
代码3 绘制条
90.// The graph is ready to be rendered with the values.
91.for(i=0;i<barChartValues.length;i++){
92.
93. // Calculate the Y position. First work out how high the bar
94. // will be by multiplying the value by the scaling factor.
94. // calculated earlier
95. double barHeight =
96. Integer.parseInt(barChartValues[i]) * YAxisScalingFactor;
97.
98. System.out.println("Bar Height is =" + barHeight);
99.
100. // You now have the height that the bar will be. Need to work
101. // out now where to place the bar. With Y values running
102. // positively down, and the Y-axis being 1000 pixels tall,
103. // simply subtract the bar height from 1000 to get the position
104. // of where to place the bar.
105.
106. double YStart = 1000 - barHeight;
107.
108. // Each of the bars is 100 pixels wide. So to space them out
109. //(with a 10-pixel gap between them), multiply the readings position
110. // in the array by 110.
111.
112. double XPosition = (i*110);
113.
114. // Generate some random numbers for your bar colours
115. int randomRed = random.nextInt(255);
116. int randomGreen = random.nextInt(255);
117. int randomBlue = random.nextInt(255);
118.
119. // You now have all your values ready. Draw the rectangle.
120. SVGout.write("\n<rect x=\""+XPosition+"\" y=\""+
121. YStart+"\" width =\""+ 100 +"\" height=\""+barHeight+
122. "\" style=\"fill:rgb("+randomRed+"
123. ,"+randomGreen+","+randomBlue+");\" /> ");
124.
125.}
可以下载并自己来运行该程序,传递不同量级的数据,查看图形的变化和自动缩放功能,图 3 给出了一些例子。
图3 动态生成的SVG条形图
2 线图
目前为止,我们已经介绍了如何动态缩放柱状图。但这并不是惟一的图形,某些形式的数据,特别是基于时间的数据(如股票价格或者地震数据),最好用线图来表示。也可以使用与柱状图类似的方法缩放线图。
假设您监控数据库中的行数。 每 30 秒读一次行数,并记录在一个数组中,最后得到包含以下 10 个值的数组:
10,20,30,50,90,25,45,60,70,10
这次测试同样需要计算每次测试的比例因子。但是您可能不希望局限在只能绘制包含特定个数据的图,因此需要同时在 X 轴和 Y 轴两个方向上进行缩放。
绘制线图最好的办法是使用称为 polyline 的 SVG 元素。polyline 接受成对的 X 和 Y 坐标值并在相邻的两点之间划一条线,比如:
<polyline points="0 0, 10 10, 20 20">
将绘制一条线,其中三个点在 [X=0,Y=0]、[X=10,Y=10] 和 [X=20,Y=20]。这就是需要缩放和计算的点。
与上面的描述相同,也提供了一个 Java 示例程序,根据输入的数据缩放和呈现折线图(请参阅 参考资料)。
然后分析代码中的要点。
首先计算 X 轴的比例因子。它由要呈现的读入次数决定,因此要用 X 轴的像素数除以读入的次数。比方说,如果读取了 50 次,X 轴的比例因子就是 1000/50 = 20。因此每次读取操作的结果在 X 轴上间隔 20 像素进行绘制。读取的结果以数组传入时,只需要用数组的元素个数去除以 1000 即可。
代码4 计算 X 轴的比例因子
40. XAxisScalingFactor = 1000/(double)valuesToPlot.length;
第 41-49 行确定数组中的最大值。
第 54-100 行准备输出文件并绘制 X 和 Y 坐标轴。
Y 轴比例因子是在第 104 行计算的,方法和上面的柱状图使用的方法一样(请参阅 清单 2)。
第 108 到 125 行呈现了要绘制的线图:
代码5 绘制折线
108. // Render the line
109. SVGout.write("\n<polyline points=\"0 1000,");
110.
111. for(i=0;i<valuesToPlot.length;i++){
112.
113. // Calculate the X position by determining which
114. //value in the array you are dealing with.
115. XValue = ((i+1)*XAxisScalingFactor);
116.
117. YValue = Integer.parseInt(valuesToPlot[i]);
118. YValue = YValue*YAxisScalingFactor;
119. YValue = 1000-YValue;
120.
121. // You now have your polyline point.
122. SVGout.write(" " + XValue + " " + YValue +",\n");
123.
124. }
125. // Close off the polyline.
126. SVGout.write("\" style=\"stroke:red; stroke-width: 3; fill :
127. none;\"/>");
第 109 行是 polyline 元素的起点,它与坐标轴的原点重合。
然后依次处理数组中的值。首先计算 X,用元素在数组中的位置乘上 X 轴比例因子。比如,如果数组中有 50 个元素,X 轴比例因子就是:
XAxisScalingFactor = 1000/(double)valuesToPlot.length;
XAxisScalingFactor = 1000/(double)50;
XAxisScalingFactor = 20
因此,两个值以 20 像素的间距绘制,全部数组的计算结果为:
第 1 个点: x=20,<1st value>
第 2 个点: x=40,<2nd value>
第 3 个点: x=60,<3rd value>
...
...
第 49 个点: x=980,<49th value>
第 50 个点: x=1000,<50th value>
注意:这里使用了 (i+1),因为数组中第一个元素的索引号是 0,要从第一个元素开始,必须加上 1。
然后计算 Y 值:
第 117 行从数组中提取数据并转化成整数。
第 118 行将该值乘以 Y 轴的比例因子,以确定其位置。
最后从 1000 中减去这个值,这是因为 Y 轴是从页面的上方向下增长,X 轴从 Y 轴的第 1000 个像素的位置开始绘制,因此,要确定计算得到的 Y 值在 X 轴的上方多远的位置上,就必须从 1000 中减去它。
现在计算得到了 X 和 Y 位置,然后要将该坐标点添加到 polyline 参数表中。
处理完数组中的值后封闭折线并应用适当的样式。
试一试以下这个例子:传入不同量级的数据。您会看到图形也能根据传入的最大值自动缩放。还要试一试传入不同数量的数据,比如 10 个或者 1000 个。X 轴将会按照传入的数据个数自动缩放。图 4 给出了一些例子。
创建随内容动态缩放的SVG图形 - 第二页
BRIAN VENN 2008-04-17 来源:
文章首页
创建随内容动态缩放的SVG图形
第二页
页2 共2页
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。
下载并运行这个例子。
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)
BRIAN VENN 2008-04-17 来源:
文章首页
创建随内容动态缩放的SVG图形
第二页
页1 共2页
本文通过例子说明了如何根据数据缩放 SVG 图形。通过这些技术和提供的示例代码,您可以呈现自己的图形,并根据需要定制图形。
Scalable Vector Graphics(可缩放向量图形,SVG)是一种基于 XML 的语言,可用于绘制二维图形。它能够快速地呈现图形,因此很自然可用于表示图形这样的数据。但是如果要表示的数据相差很大,比如今天的图形数据是从 0 到 10,明天的数据就变成 0 到 1000000,以同样的比例绘制这样的数据是没有意义的。理想情况下,需要根据内容来缩放 SVG 图形。作者 Brian Venn 将介绍如何实现这一点。
我在 IBM Hursley UK 做测试和开发时遇到这样一个问题。于是我便写了一些代码,以便能够精细地使用 SVG 绘制柱状图、线图和散点图。但是每次测试所要处理的数据都要跨越多个数量级。使用同一比例来绘制每个图是没有用处的,很多图要么非常大,要么非常小,数据要么拥挤在一个角上,要么分散在整个页面上。
我需要一种能够自动确定每组数据使用的最佳比例的方法。
1 一点高中数学知识
从问题中我发现,自动缩放图形的最佳方式是观察需要绘制的数据集,确定数据集中的最大值,并使用该值作为其他将绘制的数据的比例。
最好通过 实际的例子来说明我采用的技术。假设测试生成三个值:A、B 和 C。每次测试后都需要将这些值绘制到柱状图中,但是每次测试中数据的范围都是动态变化的。
第一次测试生成的数据,如下所示:
A=100
B=50
C=25
在这次测试中,A 的值最大,为 100。第一项任务(也是最重要的任务)是计算图形的 比例因子,就是说在绘图时每单位的值在高度上要占用多少像素。比例因子可以用图轴的高度除以数据的最大值来获得。通过下面的计算就可以清楚如何获得比例因子。
为了简单起见,Y 轴的高度设为 1000 像素,这样计算起来很方便。
数据集中的最大值是 100(A)。
对于该图,比例因子应该是: 1000/100 = 10。
因此对于这个柱状图,每单位的值在高度上用 10 个像素表示。
要得到每个条的高度,只需要用比例因子乘上数据集中的值即可,就是说每个条的高度为:
图1 使用比例因子,最大值为100(A)
假设下一次测试得到如下所示的值:
A=2000
B=5000
C=800
要记住,Y 轴仍然是 1000 个像素高。这次测试中的最大值在 B 栏,为 5000。 因此比例因子就是 1000/5000=0.2。
因此每个条的高度为:
图2 使用比例因子,最大值为5000(B)
图2 使用比例因子,最大值为 5000(B)
可以看出,因为条的高度是相对于最大值计算得到的,条的高度不会超过 1000 像素,因此图不会画得太高。SVG 动态缩放的关键就是比例因子。要记住,比例因子是根据最大值计算得到的,而其他数据都根据比例因子值来计算。
现在已经介绍了比例因子这个重要概念,下面来说明如何使用它。下面的例子是一个小型的 Java 语言程序,从命令行中得到一组数据,然后按照 上例所述的方式绘制 SVG 柱状图。虽然使用 Java 代码进行编写,但其中的关键是数学计算。需要的话,可以参照这里的 Java 代码用其他任何语言改写这个程序。
本文不再列出完整的代码,仅仅介绍其中的要点。建议您下载这个例子(请参阅 参考资料),然后使用带有对行进行编号功能的编辑器打开 SVG_barchart.java 文件。
首先,第 38-48 行确定传入的数据的最大值。
最重要的是第 51 行,它计算 Y 轴的比例因子:
代码1 计算 Y 轴比例因子
51. YAxisScalingFactor = 1000/(double)largestNumber;
第 58 和第 59 行创建了 SVG 输出文件。SVG 使用 SVGout.write(-SVG-) 写入该文件。主要必须使用各种转义字符,如双引号用 \" 表示。有时候这样使 SVG 难以阅读,但必需如此,否则 Java 编译器就不能正确地解释它,代码也无法编译。此外,还要注意每个 SVG 文本行都以 \n 开始,这样可以保证使用 SVG 查看器的“查看源代码”功能时,SVG 更容易阅读。
第 70-79 行绘制 X 和 Y 轴。X 轴是从 [x=0, y=1000] 到 [x=1000, y=1000] 的一条直线,Y 轴是从 [x=0, y=0] 到 [x=0, y=1000],这样就建立了一个简单的笛卡儿坐标系。
第 82 和 83 行在 Y 轴的顶端和中间各划一条水平虚线,这样做只是为了让查看图时更方便。
第 86 和 87 行在顶端和中间标记 Y 轴。注意,要使用前面计算的最大值来标记 Y 轴。
代码2 标记 Y 轴
86. SVGout.write("\n <text style=\"fill:black; stroke:none\"
x=\"-10\" y=\"0\" >" + largestNumber + "</text>");
87. SVGout.write("\n <text style=\"fill:black; stroke:none\"
x=\"-10\" y=\"500\" >" + (largestNumber/2) + "</text>");
值是动态变化的,因此这里使用 largestNumber 来标记轴。如果需要,添加其他的基准线和标记也很方便。
绘制柱状图从第 90 行开始:
代码3 绘制条
90.// The graph is ready to be rendered with the values.
91.for(i=0;i<barChartValues.length;i++){
92.
93. // Calculate the Y position. First work out how high the bar
94. // will be by multiplying the value by the scaling factor.
94. // calculated earlier
95. double barHeight =
96. Integer.parseInt(barChartValues[i]) * YAxisScalingFactor;
97.
98. System.out.println("Bar Height is =" + barHeight);
99.
100. // You now have the height that the bar will be. Need to work
101. // out now where to place the bar. With Y values running
102. // positively down, and the Y-axis being 1000 pixels tall,
103. // simply subtract the bar height from 1000 to get the position
104. // of where to place the bar.
105.
106. double YStart = 1000 - barHeight;
107.
108. // Each of the bars is 100 pixels wide. So to space them out
109. //(with a 10-pixel gap between them), multiply the readings position
110. // in the array by 110.
111.
112. double XPosition = (i*110);
113.
114. // Generate some random numbers for your bar colours
115. int randomRed = random.nextInt(255);
116. int randomGreen = random.nextInt(255);
117. int randomBlue = random.nextInt(255);
118.
119. // You now have all your values ready. Draw the rectangle.
120. SVGout.write("\n<rect x=\""+XPosition+"\" y=\""+
121. YStart+"\" width =\""+ 100 +"\" height=\""+barHeight+
122. "\" style=\"fill:rgb("+randomRed+"
123. ,"+randomGreen+","+randomBlue+");\" /> ");
124.
125.}
可以下载并自己来运行该程序,传递不同量级的数据,查看图形的变化和自动缩放功能,图 3 给出了一些例子。
图3 动态生成的SVG条形图
2 线图
目前为止,我们已经介绍了如何动态缩放柱状图。但这并不是惟一的图形,某些形式的数据,特别是基于时间的数据(如股票价格或者地震数据),最好用线图来表示。也可以使用与柱状图类似的方法缩放线图。
假设您监控数据库中的行数。 每 30 秒读一次行数,并记录在一个数组中,最后得到包含以下 10 个值的数组:
10,20,30,50,90,25,45,60,70,10
这次测试同样需要计算每次测试的比例因子。但是您可能不希望局限在只能绘制包含特定个数据的图,因此需要同时在 X 轴和 Y 轴两个方向上进行缩放。
绘制线图最好的办法是使用称为 polyline 的 SVG 元素。polyline 接受成对的 X 和 Y 坐标值并在相邻的两点之间划一条线,比如:
<polyline points="0 0, 10 10, 20 20">
将绘制一条线,其中三个点在 [X=0,Y=0]、[X=10,Y=10] 和 [X=20,Y=20]。这就是需要缩放和计算的点。
与上面的描述相同,也提供了一个 Java 示例程序,根据输入的数据缩放和呈现折线图(请参阅 参考资料)。
然后分析代码中的要点。
首先计算 X 轴的比例因子。它由要呈现的读入次数决定,因此要用 X 轴的像素数除以读入的次数。比方说,如果读取了 50 次,X 轴的比例因子就是 1000/50 = 20。因此每次读取操作的结果在 X 轴上间隔 20 像素进行绘制。读取的结果以数组传入时,只需要用数组的元素个数去除以 1000 即可。
代码4 计算 X 轴的比例因子
40. XAxisScalingFactor = 1000/(double)valuesToPlot.length;
第 41-49 行确定数组中的最大值。
第 54-100 行准备输出文件并绘制 X 和 Y 坐标轴。
Y 轴比例因子是在第 104 行计算的,方法和上面的柱状图使用的方法一样(请参阅 清单 2)。
第 108 到 125 行呈现了要绘制的线图:
代码5 绘制折线
108. // Render the line
109. SVGout.write("\n<polyline points=\"0 1000,");
110.
111. for(i=0;i<valuesToPlot.length;i++){
112.
113. // Calculate the X position by determining which
114. //value in the array you are dealing with.
115. XValue = ((i+1)*XAxisScalingFactor);
116.
117. YValue = Integer.parseInt(valuesToPlot[i]);
118. YValue = YValue*YAxisScalingFactor;
119. YValue = 1000-YValue;
120.
121. // You now have your polyline point.
122. SVGout.write(" " + XValue + " " + YValue +",\n");
123.
124. }
125. // Close off the polyline.
126. SVGout.write("\" style=\"stroke:red; stroke-width: 3; fill :
127. none;\"/>");
第 109 行是 polyline 元素的起点,它与坐标轴的原点重合。
然后依次处理数组中的值。首先计算 X,用元素在数组中的位置乘上 X 轴比例因子。比如,如果数组中有 50 个元素,X 轴比例因子就是:
XAxisScalingFactor = 1000/(double)valuesToPlot.length;
XAxisScalingFactor = 1000/(double)50;
XAxisScalingFactor = 20
因此,两个值以 20 像素的间距绘制,全部数组的计算结果为:
第 1 个点: x=20,<1st value>
第 2 个点: x=40,<2nd value>
第 3 个点: x=60,<3rd value>
...
...
第 49 个点: x=980,<49th value>
第 50 个点: x=1000,<50th value>
注意:这里使用了 (i+1),因为数组中第一个元素的索引号是 0,要从第一个元素开始,必须加上 1。
然后计算 Y 值:
第 117 行从数组中提取数据并转化成整数。
第 118 行将该值乘以 Y 轴的比例因子,以确定其位置。
最后从 1000 中减去这个值,这是因为 Y 轴是从页面的上方向下增长,X 轴从 Y 轴的第 1000 个像素的位置开始绘制,因此,要确定计算得到的 Y 值在 X 轴的上方多远的位置上,就必须从 1000 中减去它。
现在计算得到了 X 和 Y 位置,然后要将该坐标点添加到 polyline 参数表中。
处理完数组中的值后封闭折线并应用适当的样式。
试一试以下这个例子:传入不同量级的数据。您会看到图形也能根据传入的最大值自动缩放。还要试一试传入不同数量的数据,比如 10 个或者 1000 个。X 轴将会按照传入的数据个数自动缩放。图 4 给出了一些例子。
创建随内容动态缩放的SVG图形 - 第二页
BRIAN VENN 2008-04-17 来源:
文章首页
创建随内容动态缩放的SVG图形
第二页
页2 共2页
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。
下载并运行这个例子。
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)
- x-svggrph_examples.zip (50.4 KB)
- 下载次数: 19
发表评论
-
使用脚本动态操作 SVG 文档
2012-08-20 23:25 748http://www.ibm.com/developerwor ... -
SVG脚本编程的一些技巧 .
2012-08-20 23:24 861http://blog.csdn.net/mtfsoft/ar ... -
有鼠标位置获取元素
2012-12-23 23:36 648document.elementFromPoint(x,y) ... -
getCTM
2012-08-19 17:22 761<svg xmlns="http://www. ... -
Svg事件响应:获取鼠标即时屏幕坐标
2012-08-19 17:04 4410http://ribbonchen.blog.163.com/ ... -
svg_example
2012-04-26 00:54 817http://srufaculty.sru.edu/david ... -
textPath element | SVGTextPathElement object
2012-02-13 22:51 908http://msdn.microsoft.com/ZH-CN ... -
path element | SVGPathElement object
2012-02-13 22:49 1296http://msdn.microsoft.com/ZH-CN ... -
svg text参考
2012-02-13 14:20 742http://www.w3.org/TR/SVG11/text ... -
How to Convert a SVG File to PDF Format
2012-02-05 22:40 1177http://xmlgraphics.apache.org/b ... -
在svg文间画图过程中放大缩小图片后,坐标偏移问题
2012-01-01 16:48 1763http://blog.csdn.net/qingcai200 ... -
svg矩阵变换
2012-01-01 16:16 953svg矩阵变换 -
svg变换参考
2012-01-01 16:14 942<?xml version="1.0" ... -
svg网站 参考信息
2011-12-31 10:53 947http://blog.csdn.net/xuezhimeng ... -
用CorelDRAW制作SVG手机主题界面图片
2011-10-25 23:57 2312用CorelDRAW制作SVG手机主题界面图片 Ljmsto ... -
动态创建 svg
2011-10-20 17:34 649http://riso.iteye.com/blog/3934 ... -
参考网站收录
2011-10-12 15:22 802PDM中文网运维(http://www.pdmcn.com/b ... -
svg网站
2011-10-08 15:03 1129http://smartblack.iteye.com/blo ... -
svg学习
2011-09-26 00:11 515<?xml version="1.0" ... -
svg的
2011-09-24 00:47 871http://xinsheng.huawei.com/cn/b ...
相关推荐
HTML5 SVG图形变形效果是现代网页设计中一种引人注目的技术,它允许开发者创建动态、交互式的矢量图形。SVG(Scalable Vector Graphics)是一种基于XML的图像格式,可无限缩放而不失真,适合用于网页和移动设备。在...
vue结合D3.js做的动态的可交互的SVG图形组件。 下面是其中的几行代码: data: { svg: undefined, point1Instance: undefined, // 两个主要端点之一 point2Instance: undefined, // 两个主要端点之一 ...
SVG(Scalable Vector Graphics)是一种基于XML的矢量图形语言,用于在网络上创建和展示图形。SVG图像可以无限缩放而不会失真,这使得它在网页设计、数据可视化和图标制作等领域非常流行。滚轮缩放是SVG交互功能的一...
电力SVG图形浏览程序源代码是一个项目,用于展示和解析SVG(Scalable Vector Graphics)图形,尤其适用于处理来自南瑞的open3000系统导出的SVG图像。SVG是一种基于XML的矢量图像格式,它能够以清晰的分辨率显示复杂...
当我们在Vue项目中需要动态渲染SVG以及为SVG图形添加交互功能时,如点击事件,我们需要了解如何结合这两个技术。接下来,我们将详细介绍Vue动态渲染SVG以及为SVG添加点击事件的实现过程。 ### Vue动态渲染SVG 在...
SVG图形编码工具则为开发者提供了一个方便的平台,用于创建、编辑和管理SVG代码。 在JavaScript开发中,SVG可以与JavaScript库和框架如jQuery、D3.js、Snap.svg等紧密集成,实现动态交互和动画效果。同时,CSS也...
由于XML的结构化特性,SVG图形可以被程序化地操控,提供了丰富的交互性和动态性。 SVG的基本概念包括路径、形状、文本、图像、渐变、滤镜等元素。路径是SVG中最基础的元素,通过一系列线段和曲线的指令,可以构建出...
存在许多工具和库可以帮助开发者创建和编辑SVG图形,例如使用图形编辑软件(如Adobe Illustrator)输出SVG,或者使用在线编辑器和JavaScript库(如D3.js)。 9. 学习SVG的必要性:Web开发人员应该学习SVG,因为这是...
缩放SVG元素通常涉及变换矩阵(transform matrix)。`transform`属性可以接受一个矩阵来改变元素的位置、尺寸和旋转。对于缩放,我们需要根据鼠标的点击和拖动来计算缩放比例,然后应用到变换矩阵中。`svgpanzoom....
在这个项目中,Snap.svg可能被用来创建SVG图形、绑定交互事件、以及执行变换(如缩放、旋转)。 5. **HTML5 + CSS3**: HTML5引入了新的标签和API,如`<canvas>`和`<svg>`,使得在网页上创建交互式图形变得更加...
SVG(Scalable Vector Graphics)是一种基于XML的矢量图像格式,它被广泛用于网页设计、应用程序开发以及...总的来说,SVG图形编辑器是创作高质量、可缩放图形的重要工具,值得每一个图形设计者和开发者学习和使用。
这些页面可能包含了基本的SVG图形,用于验证和调试拖拽和平移功能。测试页面通常包含简单的SVG形状,如矩形、圆形或线条,以便快速检查和确认代码的效果。开发者通过这些测试页面可以逐步调整和优化拖拽和平移的逻辑...
总的来说,SVG的缩放和拖动功能是通过结合CSS3的transform属性和JavaScript的事件处理来实现的,这为创建交互式的SVG图形提供了强大的工具。通过深入理解这些技术,开发者能够构建出更加生动和用户友好的Web应用程序...
2. 无损缩放:SVG图形可以无限缩放而不失真,这意味着无论在何种分辨率下,图形都可以保持清晰,这对于创建需要缩放和高清晰打印的应用场景非常有用。 3. 支持复杂图形效果:SVG支持动态交互、滤镜效果、音效等丰富...
### SVG事件及缩放控制详解 #### 一、SVG鼠标事件概述 ...了解这些基础知识可以帮助开发者更好地利用SVG创建动态和交互式的图形界面。此外,通过实践这些技巧,可以进一步提高SVG应用的用户体验。
SVG(Scalable Vector Graphics)是一种基于XML...通过以上知识点的学习,你可以掌握SVG图形的创建和应用,以及利用Highcharts进行高效的数据可视化。这将有助于你在网页设计、数据分析和前端开发等领域提升专业技能。
SVG(Scalable Vector Graphics)是一种基于XML的...这在创建交互式SVG图形或图表时非常有用,可以为用户提供更丰富的体验。在实际项目中,这些功能通常需要结合CSS和JavaScript库(如d3.js)进行更复杂的应用和优化。
这样使得SVG图形可以直接与HTML元素进行交互,提高了网页的动态性。 3. 可拖拽功能实现:HTML5提供了`dragstart`、`drag`、`dragend`等一系列拖放事件,结合JavaScript可以实现元素的拖拽功能。在这个世界地图示例...
通过分析源代码,开发者不仅可以了解SVG图形的创建和操作,还能学习到如何用JavaScript实现图形化配置,这对于提升Web应用的用户体验和交互设计能力大有裨益。此外,对于希望构建自定义流程建模工具的开发者来说,这...
这种格式的最大优势在于其可缩放性,这意味着无论放大多少倍,SVG图形都能保持清晰、无像素化的质量,这对于网页设计、移动应用以及需要高质量图像的场合特别有用。 SVG图形由一系列的几何形状组成,如直线、曲线、...