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();

不确定这是否相关(尽管问题是同时开始的),我开始指定尺寸的顺序。为此,我不使用包含轴 ( dimensionArray) 的数组,而是使用包含编号的“索引”键的 JS 对象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}
  }

出于说明目的,以下屏幕截图显示了如何在顶部图像上正确设置比例,但在第二个(更新的)图表上,一些新的折线将在第 1 和第 3 轴上变为 0,但比例未更新所以线路超出范围。

重新加载图表时是否有一种简单的方法来刷新轴刻度?是否有可能使用 JS 对象.dimensions()与底层缩放功能产生一些冲突?

第一个带有默认数据的图表

更新数据的第二个更新图表

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 回答