【问题标题】:Chart won't redraw in `onchange` function图表不会在 `onchange` 函数中重绘
【发布时间】:2024-04-12 23:40:01
【问题描述】:

我已经设置了一个带有 C3 驱动图表的 HTML 页面。当页面加载时,图表会从 CSV 文件加载数据。我的页面上还有一个select 元素。当用户更改select 中的option 时,我希望图表重新加载新数据。

基本上,这是我的代码。

var chart = c3.generate({
    bindto: "#chart",
    data: {
        url: dataFile,
        x: "year"
    }
});

document.getElementById("select-element").onchange = function(){
    var newData = [ /* an array of JavaScript objects */ ];
    chart.data.json = newData;
};

但是当我在select 下拉列表中选择一个选项时,没有任何变化。如何修复它以便我的图表从 JS 对象数组 newData 加载数据?

【问题讨论】:

    标签: javascript d3.js c3.js


    【解决方案1】:

    首先尝试通过 load() 和 unload() 方法加载数据,这是正确的做法(可以是 json、url、行或列),如下例所示:

    chart.load({
      columns: [
        ['data1, 100, 200, 150, ...],
        ...
      ],
      unload: ['data2', 'data3']
    });
    

    请注意,此方法有大量文档,应阅读:

    Link to load method documentation

    要强制重绘,可以调用flush()方法:

    chart.flush();
    

    【讨论】:

    • .load() 中,我必须放什么来从 JS 对象数组中加载数据?还是我需要对数组进行 JSON 化?
    • 您需要组织对象以使用所需的 Columns/Rows/types 对象加载 JSON 对象。如果您想要另一种方法,您甚至可以加载一个 url(例如带有 csv 文件),如您在 c3js.org/samples/data_load.html 中所见。您可以查看如何加载类别数据(只是另一种有点不同的数据组织方式):c3js.org/samples/data_stringx.html 有很多示例。我想您需要查看所有这些示例并选择更适合您的数据模型/组织的示例