这是我的第一个 SVG 项目,我不是程序员,但我涉足交互式信息图表。我之前在这方面的经验来自于使用 ActionScript。
我正在使用纯 SVG(没有 Raphael、D3 等)并尝试创建交互式条形图。在 SVG 坐标系和缩放遇到一些初始困难之后,我在网上找到了一些处理后缩放转换的代码:
<text x="x_coord0" y="y_coord0" transform="scale(x_scale, y_scale) translate(-x_coord0*(x_scale-1)/x_scale, -y_coord0*(y_scale-1)/y_scale)" …>text</text>
我把它转换成这个 JavaScript:
var translationfactor = ((0 - y_position)*(y_scalefactor - 1) / y_scalefactor);
var matrix = "scale(1," + y_scalefactor + ") translate(0," + Number(translationfactor) + ")";
targetbar.setAttribute("transform", matrix);
问题是我需要将条形“转换”回图表的基线,而不是它们最高点的原始位置。目前,正确缩放的条形图紧贴图表顶部:
http://billgregg.net/miscellany/upsidedown-barchart.png
我已经尝试了几种修复方法,包括将条形的“缺失高度”插入转换因子(条形从图表的整个高度开始并动态缩小)。没有任何效果。我的部分问题是,除了对 SVG 不熟悉之外,我可以整天盯着那个代码,但我的大脑仍然无法解析它。乘以负数太抽象了,从根本上说,我只是没有“得到”数学,这当然使修改代码变得困难。
我的问题:
(1) 上面的代码如何将条形图重新定位在图表的基线上?
(2) 有没有更透明、更通俗的方式来完成翻译?我的第一个想法是,如果条形图的高度减少到其原始值的 40%,那么将原始 Y 坐标值乘以 250% 应该将条形图重置为其原始位置(至少是其最高点),但是似乎不起作用。
(3) 有没有办法将条形的原点设置为其底部?在 Flash 中它是可能的,但据我所知,它是手册,而不是编程任务。
(4) 是否有类似于 ActionScript 中的 .localToGlobal() 的方法可以让我完全避免与局部坐标系发生冲突?