d3.js的第一天,进展顺利,但我需要将占位符圆形更改为更复杂的东西。
我在Illustrator中创建的SVG形状是否可以“导入”到d3.js图表中?
我知道我可以在d3中重新绘制它...但我的脑袋现在很痛......呃......
这是一个带点的简单泡泡:
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="77px" height="41px" viewBox="0 0 77 41" enable-background="new 0 0 77 41" xml:space="preserve">
<path fill-rule="evenodd" clip-rule="evenodd" fill="#999999" d="M0,13C0,5.82,5.82,0,13,0h51c7.18,0,13,5.82,13,13s-5.82,13-13,13
H47l-7,15l-7-15H13C5.82,26,0,20.18,0,13z"/>
</svg>
可以将其导入为形状吗?
或者有没有办法直接在d3js中翻译该路径?
谢谢!
答案 0 :(得分:11)
如果通过“导入”表示您已成为页面标记的一部分,然后由d3代码使用,那么您可以使用svg defs element来保存自定义形状的定义。然后在代码中稍后创建一个use
元素来引用它:
var node = svg.selectAll("g.node")
.data(nodes)
.enter()
.append("g")
.attr("transform", function(d) { return "translate(" + d.y + "," + d.x + ")"; } )
node.append("use")
.attr("xlink:href","#myshape")
以上是上述方法的完整示例。我使用的是Inkscape,但概念是一样的:
http://bl.ocks.org/explunit/5988971
请注意,svg定义中的xlink命名空间对于use
元素正常工作很重要,我看到你已经拥有了代码:
xmlns:xlink="http://www.w3.org/1999/xlink"
如果通过“导入”表示即时加载,则需要采用不同的方法,如@LarsKotthoff所建议的那样。但听起来你只想重用现有的形状定义,而上述方法可以让你做到。 <g>
元素设置形状的位置,然后添加子节点<use>
以拉入先前定义的实际形状。
形状的定义在body中的svg元素中,而不是在javascript本身中。这与许多D3.js示例不同,后者具有由javascript代码动态创建的svg元素。
两者之间的唯一联系是你在href(本例中为“myshape”)中放置的字符串ID,以匹配defs
部分中的id:
node.append("use").attr("xlink:href","#myshape")