dimple.js 按图例过滤数据给出错误

Posted

技术标签:

【中文标题】dimple.js 按图例过滤数据给出错误【英文标题】:dimple.js filter data by legend gives error 【发布时间】:2017-01-07 16:30:30 【问题描述】:

我正在使用酒窝条形图图例来过滤图表的数据,如本小提琴 https://jsfiddle.net/fbpnzy9u/ 中给出的那样。

var svg = dimple.newSvg("#chartContainer", 590, 400);
var data = [
     Animal: "Cats", Value: (Math.random() * 1000000) ,
     Animal: "Dogs", Value: (Math.random() * 1000000) ,
     Animal: "Mice", Value: (Math.random() * 1000000) 
];

var myChart = new dimple.chart(svg, data);
myChart.setBounds(60, 30, 510, 305)
var x = myChart.addCategoryAxis("x", "Animal");
x.addOrderRule(["Cats", "Dogs", "Mice"]);
myChart.addMeasureAxis("y", "Value");
myChart.addSeries("Animal", dimple.plot.bar);
var legend = myChart.addLegend(500,10,100, 100, "right");
myChart.draw();

d3.select("#btn").on("click", function() 
   myChart.data = [
      Animal: "Cats", Value: (Math.random() * 1000000) ,
      Animal: "Dogs", Value: (Math.random() * 1000000) ,
      Animal: "Mice", Value: (Math.random() * 1000000) 
   ];
   myChart.draw(1000);
);

// filter
    myChart.legends = [];

    // Get a unique list of y values to use when filtering
    var filterValues = dimple.getUniqueValues(data, "Animal");

    // Get all the rectangles from our now orphaned legend

    legend.shapes.selectAll('rect').on("click", function (e) 

    // This indicates whether the item is already visible or not
    var hide = false;
    var newFilters = [];
    //If the filters contain the clicked shape hide it

    filterValues.forEach(function (f) 
      if (f === e.aggField.slice(-1)[0]) 
        hide = true;
       else 
        newFilters.push(f);
      
    );

    if (hide) 
        d3.select(this).style("opacity", 0.2);
     else 
      newFilters.push(e.aggField.slice(-1)[0]);
      d3.select(this).style("opacity", 0.8);
    
    // // Update the filters
    filterValues = newFilters;
    //Filter the data
    myChart.data = dimple.filterData(data, "Animal", filterValues);
    myChart.draw(800);
);

尽管过滤按预期进行,但它会在控制台上引发 d3 错误: 错误:属性 x:预期长度,“NaN”

知道什么可能导致此错误吗?

【问题讨论】:

艾玛,看起来那可能只出现在谷歌浏览器上。当我尝试使用 IE 时,我没有在控制台中显示该错误。 我会查查的。感谢您的提示。 您是否弄清楚导致该问题的真正原因是什么?如果你这样做了,请与我们分享。谢谢 不幸的是,dimplejs 似乎不再维护了。我对 d3 提出的相同问题得到了审查,他们说这是酒窝的问题 @Emma 你介意链接那个问题吗?如果有人能解决这个问题,那就太好了。 【参考方案1】:

不确定是什么导致了错误。

我的直觉告诉我的是,由于在使用新数据重绘图表时正在访问前一组数据中的形状,因为它们是内存中的单独对象。也就是说,数据生成的系列存在于图表的 svg 对象中,但在重新绘制图表之前与数据的变化无关。如果这是真的,那可能就是为什么它没有找到轴的值来绘制住在那里的形状。 (不知道以后有没有静默失败的选项)。

无论如何,如果您要重新绘制图表,您可以使用以下解决方法:

if (oldChartData.length > newChartData.length) 
    chart.svg.selectAll('*').remove();
    createChart(newChartData);

它很脏,但它可以工作。

编辑:Here's 相关的 github 问题。

【讨论】:

以上是关于dimple.js 按图例过滤数据给出错误的主要内容,如果未能解决你的问题,请参考以下文章

chart.CumReturns legend.loc="right" 给出“图例错误”

vue for循环中的saldo计数器给出无限循环错误

rbind tbl 和 df 给出过滤器错误

ggplot 输出中的错误图例

Dimple js 绘图在 Firefox 中无法正确缩放

过滤的 CollectionView 给出错误的计数