【问题标题】:D3 line and chart graphs on the same page breakingD3折线图和图表在同一分页上
【发布时间】:2016-03-16 21:14:04
【问题描述】:

我正在尝试在同一页面上呈现 2 个图形:图表图形和线性图形

在 html 中,我有两个 div,它们分别绑定到 2 个不同的图形,如下所示: <div id="svg-container"> <div id="svg-container-avg"> 我在 html 中导入的第一个图是这个线性“平均”图,它不显示路径或 x 轴。 如果我删除直接导入的图表,它工作正常。我会自动假设这两个图之间存在某种依赖关系,但我找不到任何东西......

我的第一个导入,线性图:scns-avg.js 文件包含这个

// Set the dimensions of the canvas / graph
var margin = {
    top: 30,
    right: 20,
    bottom: 70,
    left: 50
  },
  width = 800 - margin.left - margin.right,
  height = 350 - margin.top - margin.bottom;

var x = d3.scale.linear().range([0, width]);
var y = d3.scale.linear().range([height, 0]);

var xAxis = d3.svg.axis().scale(x)
  .orient("bottom").ticks(5);

var yAxis = d3.svg.axis().scale(y)
  .orient("left").ticks(5);

var valueline = d3.svg.line()
  .x(function(d) {
    return x(d.scnsID);
  })
  .y(function(d) {
    return y(d.average);
  });

var svg2 = d3.select("#svg-container-avg")
  .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 + ")");

// Get the data
d3.json("scns-avg-data-retrieval.php", function(error, data) {
  data.forEach(function(d) {
    d.scnsID = d.scnsID;
    d.average = +d.average;
  });

  // Scale the range of the data
  x.domain(d3.extent(data, function(d) {
    return d.scnsID;
  }));
  y.domain([0, d3.max(data, function(d) {
    return d.average;
  })]);

  svg2.append("path") // Add the valueline path.
    .style("stroke", "rgba(13, 183, 196, 0.9)")
    .attr("d", valueline(data));

  svg2.selectAll("dot")
    .data(data)
    .enter().append("circle")
    .attr("class", "dot")
    .attr("r", 3.5)
    .attr("cx", function(d) {
      return x(d.scnsID);
    })
    .attr("cy", function(d) {
      return y(d.average);
    })


  svg2.append("g") // Add the X Axis
    .attr("class", "x axis")
    .attr("transform", "translate(0," + height + ")")
    .call(xAxis);

  svg2.append("g") // Add the Y Axis
    .attr("class", "y axis")
    .call(yAxis);

});
My Data structor in JSON: 
[{"date":"11-Mar-16","average":"3.18","scnsID":"2"},{"date":"12-Mar-16","average":"3.09","scnsID":"3"},{"date":"15-Mar-16","average":"3.16","scnsID":"4"},{"date":"17-Mar-16","average":"3.20","scnsID":"5"}]

当尝试运行导入两个图表的 html 页面时,scns-avg.js 在控制台中抛出错误:属性 d="M43,2.8124999999999902LNaN,15.46875000000002LNaN,5.6249999999999805L471,0" 的值无效 在这部分代码中指向 valueline(data) svg2.append("path") .style("stroke", "rgba(13, 183, 196, 0.9)") .attr("d", valueline(data)); 这取决于这段代码,所以问题一定出在此处,但是现在 6 个小时我找不到解决方案。 var valueline = d3.svg.line() .x(function(d) { return x(d.scnsID); }) .y(function(d) { return y(d.average); });

接下来导入的我的图表图,如果禁用,线性图将正确呈现如下:

var margin = {top: 20, right: 20, bottom: 30, left: 40},
        width = 960 - margin.left - margin.right,
        height = 500 - margin.top - margin.bottom;

        var x = d3.scale.ordinal()
        .rangeRoundBands([0, width], .1);

        var y = d3.scale.linear()
        .range([height, 0]);

        var xAxis = d3.svg.axis()
        .scale(x)
        .orient("bottom");

        var yAxis = d3.svg.axis()
        .scale(y)
        .orient("left")
        .ticks(5);

        var tip = d3.tip()
        .attr('class', 'd3-tip')
        .offset([-10, 0])
        .html(function(d) {
            return "<strong>Frequency:</strong> <span style='color:rgba(13, 183, 196, 0.9)'>" + d.average + "</span>";
        });

        var svg = d3.select("#svg-container").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.call(tip);

// Get the data
d3.json("scns-data-retrieval.php", function(error, data) {
  if (error) throw error;

  data.forEach(function(d) {
    d.question = d.question;
    d.average = +d.average;
});

  x.domain(data.map(function(d) { return d.question; }));
  y.domain([0, 5]);
  legendSpace = width/5;

  svg.append("g")
  .attr("class", "x axis")
  .attr("transform", "translate(0," + height + ")")
  .call(xAxis);


  svg.append("g")
  .attr("class", "y axis")
  .call(yAxis)
  .append("text")
  .attr("transform", "rotate(-90)")
  .attr("y", 0 - margin.left)
  .attr("x", 0 - (height / 3))
  .attr("dy", ".71em")
  .style("text-anchor", "end")
  .text("Level of need for help:");

    svg.selectAll(".bar")
    .data(data)
    .enter().append("rect")
    .attr("class", "bar")
    .attr("x", function(d) { return x(d.question); })
    .attr("width", x.rangeBand())
    .attr("y", function(d) { return y(d.average); })
    .attr("height", function(d) { return height - y(d.average); })
    .on('mouseover', tip.show)
    .on('mouseout', tip.hide);
});

function type(d) {
  d.average = +d.average;
  return d;
};
data structure in JSON:
[{"question":1,"average":3.3333333333333},{"question":2,"average":2.5},{"question":3,"average":4},{"question":4,"average":2.75},{"question":5,"average":2.75},{"question":6,"average":2.75},{"question":7,"average":3},{"question":8,"average":3},{"question":9,"average":2.75},{"question":10,"average":3.25},{"question":11,"average":3.25},{"question":12,"average":3.5},{"question":13,"average":3},{"question":14,"average":3.25},{"question":15,"average":3.5},{"question":16,"average":3.5},{"question":17,"average":3.25},{"question":18,"average":3.75},{"question":19,"average":3.5},{"question":20,"average":3},{"question":21,"average":3},{"question":22,"average":3.5},{"question":23,"average":3.25},{"question":24,"average":3.75},{"question":25,"average":3.75},{"question":26,"average":3.75},{"question":27,"average":3.5},{"question":28,"average":2.75},{"question":29,"average":2.25},{"question":30,"average":3.5},{"question":31,"average":3},{"question":32,"average":3}]

我不能再这样做了,这让我发疯了,所以我现在求助于 stackoverflow 的力量!

【问题讨论】:

    标签: javascript d3.js graph


    【解决方案1】:

    经过一些疯狂的研究和反复试验,我已经解决了这个问题。

    当您尝试渲染超过 1 个图形时,如果它们是不同类型的,并且不能说 - 多个线性图,但类似于带有条形图的线性图,变量范围会混淆并且不受限制将 javascript 文件导入到 html 后。

    要解决这个问题,每个图形 js 文件都必须包含在 (function(){ 所有图形代码都放在这里 })();

    这将变量范围限制为函数。

    【讨论】:

      猜你喜欢
      • 2016-07-09
      • 1970-01-01
      • 1970-01-01
      • 2017-06-24
      • 1970-01-01
      • 2020-06-19
      • 1970-01-01
      • 2020-11-17
      • 2015-10-14
      相关资源
      最近更新 更多