2017-03-01 8 views
1

d3とAngularJSを使用するデータ視覚化インターフェイスの一部としてボックスプロットを実装しようとしています。私はこのボックスプロットパッケージで働いています:https://bl.ocks.org/mbostock/4061502d3.js Box Plot Positioning with box.js

しかし、サンプルコードのどの部分がボックスプロットの位置を制御しているのかわかりません。この例では、5つのボックスプロットが順番に並べられています。私のプロットを生成しようとすると、それらはすべて互いに上に表示されます。ここで

enter image description here

私は箱ひげ図を生成するために使用しているコードです:

  boxplots = svg.selectAll("svg") 
       .data(boxPlotData) 
       .enter().append("svg") 
       .attr("class", "box") 
       .attr("width", boxWidth + margin.left + margin.right) 
       .attr("height", boxHeight + margin.bottom + margin.top) 
       .append("g") 
       .attr("transform", "translate(" + margin.left + "," + margin.top + ")") 
       .call(chart); 

は、ここに私のSVGキャンバスを作成する方法のためのコードです。これは、角度指令で行われます。

template:"<svg width='825' height='600'></svg>", 
    link: function($scope, elem){ 

     var d3 = $window.d3; 
     var rawSvg=elem.find('svg'); // this is the svg created in the template 

     var width = rawSvg[0].attributes[0].value; 
     var height = rawSvg[0].attributes[1].value; 

     var svg = d3.select(rawSvg[0]); 

編集:まだ完璧ではないが、行き方:

enter image description here

+1

あなたが作成する ''要素の親要素は何ですか?この例では、親はHTML要素であり、SVG要素ではありません。だから基本的に、彼らは自動的にお互いに置かれる各ボックスのための別のイメージを作成します。 – Sirko

+0

オリジナルの投稿をSVGキャンバスを作成するコードで更新しました。私はSVG要素をボックスプロットの親として持っているので、それらは両方とも開始位置の(0、0)にデフォルト設定されているようです。私はそれらを正しい場所に翻訳する必要があると仮定していますか?そのコードはどこに行きますか?彼らは一度に作成されているので、私はそれらに異なる座標をどのように与えるのか分かりません。 –

答えて

2

は何が必要なの内箱のためのSVG要素を配置する順序尺度であります親のsvg。 widthと仮定すると、あなたの親SVG要素の幅を表し、dataあなたは、スケールの作成にこれを使用することができ、あなたのデータ要素の配列である:あなたが今使用できるSVGの作成内

const x = d3.scaleBand() 
       .range([0, width]) 
       .domain(data.map((el,i) => i)); 

boxplots = svg.selectAll("svg") 
       .data(boxPlotData) 
       .enter().append("svg") 
       .attr("x", (d,i) => x(i)) // this is added 
       .attr("class", "box") 
       .attr("width", boxWidth + margin.left + margin.right) 
       .attr("height", boxHeight + margin.bottom + margin.top) 
       .append("g") 
       .attr("transform", "translate(" + margin.left + "," + margin.top + ")") 
       .call(chart); 

PS:これはd3jsのv4を使用することを前提としています。スケールのv3の構文は異なります。

PPS:現在のところ、コードをテストすることはできませんが、説明どおりに動作するはずです。

+0

あなたのコードに追加しました。いくつかの調整が必要です - それぞれのboxplotの幅は変数で定義されています(boxWidthは80ピクセルでなければなりません)ので、少なくともそれ以上ずらす必要があります。私はそれを少しでも遊んでもらえると確信しています。 –

+0

フォローアップの質問:scaleBandを使用してボックスプロットの2つの異なるグループを作成できますか?最終的には、画面の両側に2つずつ4つのプロットが必要です。 –

+0

明日別に走ります。私は現在時間がありません。 – Sirko