【问题标题】:D3.js Bar Chart won't append, creates a new chartD3.js 条形图不会附加,创建一个新图表
【发布时间】:2018-05-07 09:43:28
【问题描述】:

我一直在使用 d3.js 从结果表中创建条形图。所有代码都在下面。一张表从 csv 文件中获取数据。然后将其克隆到另一个表,当发生这种情况时,我希望条形图条发生变化。但是会创建一个新的条形图。任何建议或帮助将不胜感激,谢谢。

updateCode()
function test()
{
var source = document.getElementById('table');
var destination = document.getElementById('myclonediv');
var copy = source.cloneNode(true);
copy.setAttribute('id', 'myclonediv');
destination.parentNode.replaceChild(copy, destination);
var canvas;
createGraph()
}
function createGraph()
{
    d3.csv(googlesheet, function(data) {


        //create container - canvas
        canvas = d3.select("body").append("svg")
            //width and height
            .attr("width", 300)
            .attr("height", 1000)

        //add bars  - rectangle 
        canvas.selectAll("rect")
            //loading data variable
            .data(data)
            //enter method
            .enter()
                //append rectangle for each element
                .append("rect")
                //width - d will reference data, d.age - from csv file * 10 so bars are bigger
                .attr("width", function(d) { return d.Random * 10})
                //was 50 now 48 to allow space between bars
                .attr("height", 48)
                // y function of the index, for each element
                .attr("y", function(d, i) { return i *50})
                //colour blue
                .attr("fill", "blue");

            //var newData = parsedCSV.replace(',', '');
            //var test = parsedCSV.substring(parsedCSV.indexOf(",") + 1);


            //add text to each bar - repeat before
        canvas.selectAll("text")
            .data(data)
            .enter()
                .append("text")
                    //white text
                .attr("fill", "red")
                    //same position on each bar -- + 24 is half of 48 in height -- now middle of bar
                .attr("y", function(d,i) { return i *50+24})
                    //what text - d.name
                .text(function(d) { return d.Random; }) 

            }) 


}
function remove()
{
    var tableCode = d3.select("#table");
tableCode.selectAll("*").remove();
    updateCode()
}


function updateCode()
{
  var tabulate = function (data,columns) {                      
   var table = d3.select('#table').append('table')
    var thead = table.append('thead')
    var tbody = table.append('tbody')

    thead.append('tr')
      .selectAll('th')
        .data(columns)
        .enter()
      .append('th')
        .text(function (d) { return d })

    var rows = tbody.selectAll('tr')
        .data(data)
        .enter()
      .append('tr')

    var cells = rows.selectAll('td')
        .data(function(row) {
            return columns.map(function (column) {
                return { column: column, value: row[column] }
          })
      })
      .enter()
    .append('td')
      .text(function (d) { return d.value })

  return table;
}

d3.csv(googlesheet,function (data) {
    var columns = ['Test','Random']
  tabulate(data,columns)



})
}

【问题讨论】:

    标签: javascript d3.js charts bar-chart


    【解决方案1】:

    每次运行createGraph() 函数时,都执行以下操作:

    canvas = d3.select("body").append("svg")
    

    这意味着每次运行该函数时,您的“画布”选择都是一个新的 svg 元素。使用这个新的 svg,您可以选择所有矩形并进行输入选择:

    canvas.selectAll("rect")
        //loading data variable
        .data(data)
        //enter method
        .enter()
    

    但是,由于新 svg 中没有矩形,因此输入选择会为每个元素创建一个矩形。文本也一样。因为它是一个新的 svg,所以你复制了你的图表。

    (enter selection 将为数据数组中没有对应 DOM 元素的每个项目创建一个 DOM 元素,您的选择是空的,因此它为数组中的每个项目创建一个元素。 )

    最简单的解决方法是不在 createGraph 函数中附加 svg - 在 html 中或在调用函数之前附加它。然后在 createGraph 函数中选择它:

    svg = d3.select("svg") // assuming you have only one svg, otherwise give it an id or class
    

    现在您必须执行正确的进入/更新/退出循环,但不清楚您使用的 d3 版本哪个很重要,因为 v3 和 v4 之间存在差异。

    【讨论】:

    • 感谢您的回复。当我现在这样做时,它会添加到一个栏上。所以第一次出现条形图时它是 5,当我更新并且条形图应该是 1 时,现在是 6。我不想删除旧条形图,因为我希望发生过渡。我正在使用d3js.org/d3.v3.min.js
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    • 2018-05-09
    • 1970-01-01
    • 1970-01-01
    • 2012-05-06
    • 1970-01-01
    相关资源
    最近更新 更多