D3js画布和线条不可见

时间:2016-10-24 15:05:30

标签: javascript html5 canvas d3.js svg

我有以下代码,应该在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作为画布使用还是其他东西(例如纯画到画布)?

非常感谢您的任何建议。

2 个答案:

答案 0 :(得分:2)

CanvasSVG有所不同。这不仅仅是在d3.select("body").append()代码中更改“画布”的“svg”问题。您应该研究canvas documentationSVG 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和画布不一样。

&#13;
&#13;
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;
&#13;
&#13;