0

d3 parcoordsライブラリを使用しています。平行座標チャートにプロットされたデータを変更してチャートをリロードすると、軸の目盛りが更新されません。

を呼び出してみましたが、 の.autoscale()前に呼び出すと.render()効果がなく、 の後に呼び出すと.render()ポリラインが描画されなくなります。

    $("#example").html(""); //to make sure "ghost" axes are removed

            parcoords = d3.parcoords()("#example")
                .data(parsedData)
                .createAxes()
                .brushMode("1D-axes")
                .reorderable()//;
                .detectDimensions()
                .dimensions(dimensionObj)
                .autoscale() //no visible effect if placed here
                .render()
                .updateAxes();

これが関連しているかどうかはわかりませんが (問題は同時に発生しましたが)、ディメンションの順序を指定し始めました。これを行うには、軸 ( ) を含む配列を使用する代わりに、番号付きの「インデックス」キーを含むdimensionArrayJS オブジェクトを次のように使用します。dimensionObj

//dimensionArray = ["axis1", "axis2", "axis3", "axis4"]; //orderless array

//Default axes to display with predefined ordering
dimensionObj = {
  "axis1": {index:0},
  "axis2": {index:1},
  "axis3": {index:2},
  "axis4": {index:3}
  }

説明のために、次のスクリーンショットは、上の画像ではスケールが適切に設定されていることを示していますが、2 番目の (更新された) グラフでは、いくつかの新しいポリラインが 1 番目と 3 番目の軸で 0 になっていますが、スケールは更新されていません。そのため、ラインは範囲外になります。

チャートをリロードするときに軸の目盛りを更新する簡単な方法はありますか? で JS オブジェクトを使用する.dimensions()と、基になるスケール関数との競合が発生する可能性はありますか?

デフォルト データを含む 1 番目のグラフ

更新されたデータを含む 2 番目の更新されたグラフ

4

1 に答える 1

0

この動作の原因が見つかりました: ifd3.parcoords.js 関数内のステートメントが、以前に定義されpc.autoscaleていない場合にのみスケールをリセットしていました。基本的に、元のステートメントyscaleを編集しました。if

  d3.keys(__.dimensions).forEach(function(k) {
    if (!__.dimensions[k].yscale){
      __.dimensions[k].yscale = defaultScales[__.dimensions[k].type](k);
    }
  });

これに(もちろん、ifステートメントは完全に削除できます。後で何らかの理由で元のバージョンに戻す必要がある場合に備えて、この形式のままにしておきます):

  d3.keys(__.dimensions).forEach(function(k) {
    if (!__.dimensions[k].yscale || __.dimensions[k].yscale){
      __.dimensions[k].yscale = defaultScales[__.dimensions[k].type](k);
    }
  });
于 2017-11-22T21:50:18.887 に答える