2014-01-23 4 views
1

Я создал строку Chart и хочу изменить интерполяцию каждой строки. Здесь я нашел источник с различными интерполяциями: https://www.dashingd3js.com/svg-paths-and-d3jsd3.js linechart различные интерполяции для разных строк

Выполнение этого для строки, содержащей только одну строку: Работает отлично! Для диаграммы с разные линии с различными интерполяциями: не получите.

var chart; 
nv.addGraph(function() { 
    chart = nv.models.lineChart() 
    .options({ 
    margin: {left: 100, bottom: 100}, 
    x: function(d,i) { return i}, 
    showXAxis: true, 
    showYAxis: true, 
    transitionDuration: 250 
    }) 
    ; 

    chart.yAxis 
     .axisLabel('y axis') 
     .tickFormat(d3.format('')) 
     .axisLabelDistance(50); 

    d3.select('#chart1 svg') 
    .datum(dataForChart) 
    .call(chart); 


    nv.utils.windowResize(chart.update); 


    chart.dispatch.on('stateChange', function(e) { nv.log('New State:', JSON.stringify(e)); }); 

    return chart; 
}); 

var dataForChart=function(){ 

     var section1 = new Array(); 
     section1.key="Section 1"; 
     section1.values = new Array(); 
     section1.color="#1F77B4"; 
     section1.interpolate='basis'; 

     var section2 = new Array(); 
     section2.key="Section2"; 
     section2.values = new Array(); 
     section2.color="#2CA02C"; 
     section2.interpolate='step-before'; 

     for (i=0;i<12;i++){ 
      date=new Date(2013,i,1); 

      section1.values[i] = {"y" : Math.round(2*i*getRandom(1,2)), "x": i*3}; 
      section2.values[i] = {"y" : Math.round(6*i+2*getRandom(1,2)), "x": i/1.5}; 
     } 

     function getRandom(min, max) 
     { 
      return Math.random() * (max - min + 1) + min; 
     } 

     var dataArray=new Array(); 
     dataArray.push(section1); //Commenting out section1 or section2 makes it work 
     dataArray.push(section2); 

     return dataArray; 
};  

, комментируя раздел1 или раздел2 в конце источника, заставляет его работать. Затем появляется одна строка с указанной интерполяцией.

+1

Это не возможно, с NVD3; функции NVD3 просто передают любое значение, которое вы указали для «интерполяции» в ['d3.svg.line.interpolate()'] (https://github.com/mbostock/d3/wiki/SVG-Shapes#wiki-line_interpolate), который принимает только строку, а не функцию на основе данных. Могу я спросить * почему * вы хотите, чтобы на одном графике были разные стили линии? Это кажется мне плохим выбором дизайна. – AmeliaBR

+0

Я просто хотел сделать это для демонстрации. Но это нормально, если он не работает. Но мне нужно решить, какая интерполяция используется в массиве ввода данных. Но это также не работает, например, @AmeliaBR говорит, что он не принимает функции? –

+0

Вы всегда можете написать свою собственную функцию, которая обращается к массиву данных, чтобы определить, какой тип интерполяции использовать. Но вы можете использовать только один тип интерполяции в каждом графике, если вы не измените код NVD3. Для демонстрации, возможно, создайте вкладку выбора радио-кнопок/списка, которая позволяет пользователям выбирать этот параметр, а затем устанавливает параметр chart.interpolate (опция); chart.update(); 'для переключения режима. – AmeliaBR

ответ

1

Не знаю, если это то, что вы хотите, но я пробовал ваш код и получал две линии с интерполяцией ... но с той же интерполяцией.

Просто позвоните интерполировать метод объекта графа, например:

nv.addGraph(function() { 
    chart = nv.models.lineChart() 
    .options({ 
    margin: {left: 100, bottom: 100}, 
    x: function(d,i) { return i}, 
    showXAxis: true, 
    showYAxis: true, 
    transitionDuration: 250 
    }) 
    .interpolate("cardinal"); 
    ; 

Это относится к обоим разделам, хотя ...

+0

благодарим за ответ, но я хочу иметь разные строки с разными интерполяциями. –

1

Вы должны добавить .interpolate atrribute в nv.models .lineChart следующим образом:

lines 
    .width(availableWidth) 
    .height(availableHeight) 
    .interpolate(data.map(function(d,i) { 
     return d.interpolate;}).filter(function(d,i) { return !data[i].disabled})) 
    .color(data.map(function(d,i) { 
     return d.color || color(d, i); 
    }).filter(function(d,i) { return !data[i].disabled })); 

После этого вы можете использовать .interpolate атрибут, как в первом посте!

Я также сделал изменения для строчных типов в nv.models.multiChart следующим образом:

lines1 
    .width(availableWidth) 
    .height(availableHeight) 
    .interpolate(data.map(function(d,i) { 
     return d.interpolate;}).filter(function(d,i) { return !data[i].disabled && data[i].yAxis == 1 && data[i].type == 'line'})) 
    .color(data.map(function(d,i) { 
     return d.color || color[i % color.length]; 
    }).filter(function(d,i) { return !data[i].disabled && data[i].yAxis == 1 && data[i].type == 'line'})); 

    lines2 
    .width(availableWidth) 
    .height(availableHeight) 
    .interpolate(data.map(function(d,i) { 
     return d.interpolate;}).filter(function(d,i) { return !data[i].disabled && data[i].yAxis == 2 && data[i].type == 'line'})) 
    .color(data.map(function(d,i) { 
     return d.color || color[i % color.length]; 
    }).filter(function(d,i) { return !data[i].disabled && data[i].yAxis == 2 && data[i].type == 'line'})); 

Нашел здесь: https://github.com/novus/nvd3/issues/193

+0

Вы пробовали это сами Анил? Я применяю патч для nv.models.lineChart, но интерполяции не работают ... – dbermudez

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