我有以下代码,应该在canvas元素中显示淹没的行。
var initCanvas = function () {
var episodeLengthInPixels = moment.duration(episodeLogLength).asSeconds() * episodeWidthMultiplication;
console.log("Length of chart is "+episodeLengthInPixels +" px");
try {
canvas = d3.select("body").append("canvas")
.attr("width", 500)
.attr("height", canvasHeight)
.attr("class", canvasSelector);
//Draw the Line
canvas.append("line") // attach a line
.style("stroke", "black") // colour the line
.attr("x1", 0) // x position of the first end of the line
.attr("x2", 500)
.attr("y1", waveHeight)
.attr("y2", waveHeight) ;
} catch (e) {
console.error(e);
}
}
问题是画布和行在DOM模型中可用但是不可见(没有抛出异常)。当我尝试使用SVG而不是画布时,一切正常。
如何使用D3.js库在画布中显示内容?我试图找到任何例子,但没有运气。我应该使用D3.js作为画布使用还是其他东西(例如纯画到画布)?
非常感谢您的任何建议。
答案 0 :(得分:2)
Canvas
和SVG
有所不同。这不仅仅是在d3.select("body").append()
代码中更改“画布”的“svg”问题。您应该研究canvas documentation和SVG documentation。
例如,这是如何在canvas
中绘制一条线:
var chart = d3.select("body").append("canvas")
.attr("width", 400)
.attr("height", 300);
var context = chart.node().getContext("2d");
context.beginPath();
context.moveTo(0,100);//here you set the equiv. to X1 and Y1 in SVG
context.lineTo(400,100);//here you set the equiv. to X2 and Y2 in SVG
context.stroke();
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
另外,请记住,在检查DOM时看到给定元素这一事实并不意味着元素会显示出来。你可以使用d3进行这个非常简单的测试:
d3.select("body").append("div").append("charlesdarwin");
你会看到这个检查DOM:
<div>
<charlesdarwin></charlesdarwin>
</div>
但是,当然,你不希望这有任何结果。
答案 1 :(得分:0)
这里有一个例子。 https://bocoup.com/weblog/d3js-and-canvas
d3和画布不一样。
var base = d3.select("#foo");
var chart = base.append("canvas")
.attr("width", 400)
.attr("height", 300);
var context = chart.node().getContext("2d");
var data = [1,2,13,20,23];
var scale = d3.scale.linear()
.range([10, 390])
.domain([1,23]);
data.forEach(function(d, i) {
context.beginPath();
context.rect(scale(d), 150, 10, 10);
context.fillStyle="red";
context.fill();
context.closePath();
});
// Your line here...
context.beginPath();
context.moveTo(10,10);
context.lineTo(40,60); // x2,y2 ...
context.stroke();
context.closePath();
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
<a href="https://bocoup.com/weblog/d3js-and-canvas">Examples here</a>
<div id="foo"></div>
&#13;