javascript - 如何在 D3.js 中添加自定义 svg 形状
问题描述
我为航空事故做了一个图表,我想用平面形状代替圆形。我制作了一个非常简单的平面 SVG,但不知道如何在我的图表中使用它。感谢您提供的任何帮助。这是我想使用的 SVG:
<svg xmlns="http://www.w3.org/2000/svg" width="313" height="305">
<path d="m2,106h28l24,30h72l-44,-133h35l80,132h98c21,0 21,34 0,34l-98,0 -80,134h-35l43,-133h-71l-24,30h-28l15,-47"/>
</svg>
这是图表的代码:我尝试在 append 方法中为 SVG 提供路径参数,但没有成功。
<!-- 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 + ")");
// 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")
// Circles
svg.selectAll("mycircle")
.data(data)
.enter()
.append("circle")
.attr("cx", function(d) { return x(d.Country); })
.attr("cy", function(d) { return y(d.Value); })
.attr("r", "4")
.style("fill", "#69b3a2")
.attr("stroke", "black")
})
</script>
解决方案
你可能需要做更多的事情来改造你的飞机。但是,这将让你开始。
var plane_d = "m2,106h28l24,30h72l-44,-133h35l80,132h98c21,0 21,34 0,34l-98,0 -80,134h-35l43,-133h-71l-24,30h-28l15,-47"
// Append group for each data point
var planes = svg.selectAll(null)
.data(data)
.enter()
.append("g")
.attr("transform", function(d) { return 'translate(' + x(d.Country) + ',' + y(d.Value) + ')' })
// draw plane on each group
planes.append('path')
.attr('d', plane_d)
.style("fill", "#69b3a2")
推荐阅读
- java - Java CompletionService 如何管理多个任务提交?
- android - 如何不时从 Firebase 实时数据库接收数据
- python - 如何在 cifar-10 中选择特定的类
- powershell - 有没有办法用按钮在 Powershell 中发送电子邮件?
- javascript - 错误,同时将元素从 mongodb 推送到数组
- android - 如何使用 Android studio 编译一个 apex(Android Pony EXpress)?
- python-3.x - 为什么 argparse.py 总是先运行?
- reactjs - 在基于承诺的模式中访问上下文 (React)
- javascript - A帧动画缩小半径
- java - 如何通过 Flink 流转换非 json