2016-05-20 1 views
0

d3を使用して特定の範囲のランダムに生成されたデータから棒グラフをレンダリングするFlaskアプリケーションの中にJavaScriptがあります。ラベルや値で昇順または降順に並べ替えることができます。並べ替えは、値の昇順で並べ替える場合を除いて、すべての状況でうまく機能します。ほとんどの時間は、少なくとも2つのバーが正しい順序ではありません。昇順で並べ替えた後、バーグラフの間違った場所にいくつかのバーが表示される

コードを調べると、これらのバーの 'x'のd3属性が正しく設定されていないため、x軸の間違った場所に表示されているようです。私はそれがJavaScriptの問題ではなく、フラスコの問題ではなく、残りの部分が動作する必要があると思うが、私はそれを把握しているように見えることはできません。

データ生成(元のコードではPythonで行われますが、私はここにjiphyとJSでそれを生成した):

function data_bar_graph(num=32) { 
    data_min = 0.0; 
    data_max = 100.0; 
    output = []; 
    for (i in range(int(num))) { 
     output.push(dict(label=str(uuid.uuid4())[:2], value=random.uniform(data_min, data_max))); 
    return output; 

    } 
} 

問題のJSファイル:https://jsfiddle.net/turtles_/bk3svowo/私は以来(それが正常に動作しません。フラスコ外のjsfiddleでデータを渡したりグラフを生成する方法がわからないのですが、コードを見ることができます。このように抽象的すぎる場合、データの受け渡しを試みます。

EDIT:エラーは次のセグメントのどこかにあることを約95%確信しています(xは時々間違っています、残りの値は正しくソートされるので、.attr( "x"は何か奇妙な。次は正しいように見えるのか?

data = data.sort(sortComparator); 


    // Map x-axis labels 
    xScale.domain(
     data.map(function(d) 
     { 
      return d.label; 
     } 
    )); 
    // Map y-axis values 
    yScale.domain([0, d3.max(data, 
     function(d) 
     { 
      return d.value; 
     } 
    )]); 

    // Draw the axes 
    drawAxisLines(chart.g, xAxis, yAxis, computedHeight, 0, 0, 0); 

    var bars = chart.g.append("g") 
     .attr("class", "bars") 
     .selectAll(".bar") 
     .data(data) 
     .enter() 
     .append("rect") 
     .attr("x", 
      function(d) 
      { 
       return xScale(d.label); 
      } 
     ) 
     .attr("y", 
      function(d) 
      { 
       return yScale(d.value); 
      } 
     ) 
     .attr("fill", 
      function(d) 
      { 
       return colours(d.label); 
      } 
     ) 
     .attr("height", 
      function(d) 
      { 
       return computedHeight - yScale(d.value); 
      } 
     ) 
     .attr("width", xScale.rangeBand()) 
     .style(cssStyling.bar); 
} 

sortComparatorが言及されたd3.ascending/d3.descendingです。

答えて

1

あなたが作業例を持っていないので、正確に知ることは困難です問題はありますが、ここでは一般に落とし穴があります。数字を文字列として比較する可能性が最も高いです(例:"12" < "2"12 > 2)。あなたは数字を比較している、あなたは次の操作を実行できることを確認し

data = data.sort(function(a,b) { return d3.ascending(+a.value, +b.value); }) 

+でフィールドを先行することによって、あなたは数字にそれらのフィールドを説得している(あなたのPythonコードがないことがあります自動的に)。

関連する問題