如何在D3.js中添加自定义SVG图形替换图表圆形为飞机形状
实现方案
你可以通过SVG的defs标签定义可复用的自定义图形模板,再通过D3调用模板替换原有圆形标记,具体修改后的完整代码如下:
<!-- Code from d3-graph-gallery.com --> <!DOCTYPE html> <meta charset="utf-8"> <!-- Load d3.js --> <script src="https://d3js.org/d3.v4.js"></script> <!-- Create a div where the graph will take place --> <div id="my_dataviz"></div> <script> // set the dimensions and margins of the graph var margin = {top: 10, right: 30, bottom: 90, left: 40}, width = 460 - margin.left - margin.right, height = 500 - margin.top - margin.bottom; // append the svg object to the body of the page var svg = d3.select("#my_dataviz") .append("svg") .attr("width", width + margin.left + margin.right) .attr("height", height + margin.top + margin.bottom) .append("g") .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); // 定义飞机图形模板 svg.append("defs") .append("symbol") .attr("id", "airplane") .attr("viewBox", "0 0 313 305") .append("path") .attr("d", "m2,106h28l24,30h72l-44,-133h35l80,132h98c21,0 21,34 0,34l-98,0 -80,134h-35l43,-133h-71l-24,30h-28l15,-47"); // Parse the Data d3.csv("https://raw.githubusercontent.com/holtzy/data_to_viz/master/Example_dataset/7_OneCatOneNum_header.csv", function(data) { // X axis var x = d3.scaleBand() .range([ 0, width ]) .domain(data.map(function(d) { return d.Country; })) .padding(1); svg.append("g") .attr("transform", "translate(0," + height + ")") .call(d3.axisBottom(x)) .selectAll("text") .attr("transform", "translate(-10,0)rotate(-45)") .style("text-anchor", "end"); // Add Y axis var y = d3.scaleLinear() .domain([0, 13000]) .range([ height, 0]); svg.append("g") .call(d3.axisLeft(y)); // Lines svg.selectAll("myline") .data(data) .enter() .append("line") .attr("x1", function(d) { return x(d.Country); }) .attr("x2", function(d) { return x(d.Country); }) .attr("y1", function(d) { return y(d.Value); }) .attr("y2", y(0)) .attr("stroke", "grey") // 替换原有圆形为飞机标记 svg.selectAll(".airplane-icon") .data(data) .enter() .append("use") .attr("xlink:href", "#airplane") .attr("width", 20) .attr("height", 20) .attr("transform", function(d) { // 调整偏移让飞机中心对准数据点 return "translate(" + (x(d.Country) - 10) + "," + (y(d.Value) - 10) + ")" }) .style("fill", "#69b3a2") .attr("stroke", "black") }) </script>
如果需要调整飞机的大小,直接修改width和height属性即可,同步调整transform中的偏移值为宽高的一半,就能保证飞机中心始终和数据点位置对齐。
内容的提问来源于stack exchange,提问作者melanzane
相关产品推荐
相关产品推荐

