【问题标题】:Placing canvas (chart.js line chart) inside an SVG using d3.js使用 d3.js 在 SVG 中放置画布(chart.js 折线图)
【发布时间】:2015-06-22 08:25:46
【问题描述】:

我第一次尝试用 a 这样做,效果很好。

<button type="button" class="btn btn-default glyphicon glyphicon-arrow-left"></button>

但是,当我尝试对画布对象执行相同操作时,在这种情况下,由 chart.js 库生成的折线图不起作用。我正在使用 d3.js 将图表插入到 svg 中。我还在我的 angularjs chart.js 指令中放了一个断点(我通过指令使用 chart.js),我注意到该指令根本没有被调用。

带有chart.js画布的foreignObject被插入到html中,只是没有渲染。

<foreignObject x="5" y="5">
  <canvas id="line" class="chart chart-line" data="data" labels="labels" legend="true" series="series" click="onClick"></canvas>
</foreignObject>

有没有人遇到过类似的问题?

【问题讨论】:

  • 不确定我是否关注,您能否将您的代码放在小提琴中并提供链接

标签: javascript angularjs svg d3.js chart.js


【解决方案1】:

查看生成的 HTML

你需要在foreignObject上设置一个高度和宽度

  d3.select("svg")
     .append("foreignObject")
         .attr("width", 480)
         .attr("height", 500)

并将画布附加到 foreignObject 下的 body 元素

  ...
  .append("xhtml:body")
      .html('<canvas id="line" class="chart chart-line" data="data" labels="labels" legend="true"></canvas>');

这是一个有效的 sn-p(检查 Chrome)

var app = angular.module("app", ["chart.js"]);
app.controller("chartController", ['$scope',
  function($scope) {
    $scope.labels = ["January", "February", "March", "April", "May", "June", "July"];
    $scope.data = [
      [65, 59, 80, 81, 56, 55, 40],
      [28, 48, 40, 19, 86, 27, 90]
    ];
  }
])

d3.select("svg")
  .append("foreignObject")
  .attr("width", 480)
  .attr("height", 500)
  .append("xhtml:body")
  .html('<canvas id="line" class="chart chart-line" data="data" labels="labels"></canvas>');
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
<script src="https://rawgit.com/nnnick/Chart.js/master/Chart.min.js"></script>
<link href="https://rawgit.com/jtblin/angular-chart.js/master/dist/angular-chart.css" rel="stylesheet" />
<script src="https://rawgit.com/jtblin/angular-chart.js/master/dist/angular-chart.min.js"></script>

<div ng-app="app">
  <div ng-controller="chartController">
    <svg width="960" height="500"></svg>
  </div>
</div>

【讨论】:

  • 感谢您抽出时间来玩这个。当我今天有机会时,我会尝试一下。我实际上设法让它工作而不用 d3 方式。所以我只是把它放在普通的html等中。 我确实遇到了需要预先定义高度和宽度的问题。我遇到的另一个问题是鼠标 x 和鼠标 y 关闭了。因此,当我将鼠标悬停在未与正在渲染的内容对齐的点上时,为了避免不得不混淆缩放/定位,我决定单独执行它们,而不是隐藏/显示。
  • 奇怪。我似乎对悬停(在 Chrome 中)没​​有任何问题,并且命中检测似乎是平衡的(无论我是从右侧还是左侧进入,当我处于相同距离时都会出现)。跨度>
  • 错误警报,似乎 Stackoverflows 运行代码片段是问题所在,它通过加载到 Chrome 中的手动 html 文件正常工作,并且命中检测是正确的。谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-19
  • 2015-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多