2017-02-17 1 views
0

Я использую Polymer для отображения некоторых диаграмм d3. Когда сначала создается Полимер, я рисую только граф с осями и без данных, так как данные поступают позже, как только вызовы API будут успешными. Однако, когда я обойдусь, чтобы выбрать «прямые» элементы в svg, вызывая data(), это не сработает. Вот мой код:Добавление «прямых» элементов в пустой холст svg в d3 не работает .data()

dataChanged: function() { 
    var data = this.data; 
    var margin = {top: 20, right: 20, bottom: 30, left: 50}, 
     width = this.width - margin.left - margin.right, 
     height = this.height - margin.top - margin.bottom; 

     // format the data 
    data.forEach(function(d) { 
     d.date = d3.isoParse(d.date); 
    }); 

    // set the ranges 
    var x = d3.scaleTime() 
     .domain(d3.extent(data, function(d) { return d.date; })) 
     .rangeRound([0, width]); 
    var y = d3.scaleLinear() 
     .range([height, 0]); 

    var svg = d3.select(this.$.chart).transition(); 

    var histogram = d3.histogram() 
     .value(function(d) { return d.date; }) 
     .domain(x.domain()) 
     .thresholds(x.ticks(d3.timeMonth)); 

    var bins = histogram(data); 

    y.domain([0, d3.max(bins, function(d) { return d.length; })]); 

    svg.selectAll("rect") 
     .data(bins) 
     .enter().append("rect") 
     .attr("class", "bar") 
     .attr("x", 1) 
     .attr("transform", function(d) { 
      return "translate(" + x(d.x0) + "," + y(d.length) + ")"; 
     }) 
     .attr("width", function(d) { return x(d.x1) - x(d.x0) -1 ; }) 
     .attr("height", function(d) { return height - y(d.length); }); 

    svg.select(".xAxis") 
     .duration(300) 
     .call(d3.axisBottom(x)); 

    svg.select(".yAxis") 
     .duration(300) 
     .call(d3.axisLeft(y)); 
}, 
ready: function() { 
    var margin = {top: 20, right: 20, bottom: 30, left: 50}, 
     width = this.width - margin.left - margin.right, 
     height = this.height - margin.top - margin.bottom; 

    // set the ranges 
    var x = d3.scaleTime() 
     .domain([new Date(2010, 6, 3), new Date(2012, 0, 1)]) 
     .rangeRound([0, width]); 
    var y = d3.scaleLinear() 
     .range([height, 0]); 

    // Add the SVG to my 'chart' div.  
    var svg = d3.select(this.$.chart).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 + ")"); 

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

    // Add the Y Axis 
    svg.append("g") 
     .attr("class","yAxis") 
     .call(d3.axisLeft(y)); 
} 

ready() вызывается при визуализации, dataChanged(), когда родительский компонент передает кусок данных вниз. Все работает нормально, пока не вызывается svg.selectAll("rect").data(bins), когда он падает с Uncaught TypeError: svg.selectAll(...).data is not a function. bins имеет в нем правильные данные, так что это не пусто. Я знаю, что для него нет элементов rect, но в example I followed here нет элементов rect, прежде чем они будут добавлены этим вызовом в любом случае, поэтому я смущен, почему это не работает.

ответ

1

Какова цель этой линии:

var svg = d3.select(this.$.chart).transition(); 

Это сделало бы svg переход, ваш код подразумевая это должен быть выбор. Итак, просто опустите его .transition:

var svg = d3.select(this.$.chart); 

... 

svg.selectAll("rect") 
    .data(bins) 
    ... 
+0

Ах, да, это трюк. Я хотел, чтобы новые бары использовали переход, когда они появились. Теперь мой код работает, но прямоугольники не отображаются на графике. Инспектор показывает, что у них высота 0x17, хотя это svg: ' '... – IronWaffleMan

+0

' Я хотел, чтобы новые бары использовали переход, когда они возникли', переход будет применяться к выбору, содержащему бары, а затем (прямоугольники), а не контейнеру svg. Вам также необходимо определить, как должен работать переход. Для вас новая проблема, вам придется обновить свой вопрос с помощью воспроизводимого примера (или, по крайней мере, ваших данных, чтобы я мог воспроизвести вашу проблему). Недостаточно деталей, чтобы догадаться. – Mark

+0

Право. Сделал новый вопрос здесь: http://stackoverflow.com/questions/42304317/rects-wont-show-up-on-d3-histogram – IronWaffleMan

Смежные вопросы