如何在C3.js中隐藏堆积条形图上的条形图

时间:2019-07-09 19:04:40

标签: javascript c3.js

我有一个用C3.js制作的堆积条形图,它使用以下代码生成:

stacked_bar_chart = c3.generate({
        bindto: '#stacked_bar_chart_container',
        data: {
            columns: [
               ["Critical", 446, 863], 
               ["High", 1160, 2301],
               ["Medium", 3106, 8258], 
               ["Low", 277, 119], 
               ["Informational", 7374, 23240]
            ],
            type: 'bar',
            groups: [
                ['Low', 'Medium', 'Informational', 'High', 'Critical', 'Unknown']
            ],
        },
        grid: {
            y: {
                lines: [{ value: 0 }]
            }
        },
        axis: {
            x: {
                type: 'category',
                categories: ["Remediated", "Unconfirmed"] // Notice the x-axis has categories
            },
            y: {
                label: 'Number of Findings'
            }
        },       
    });

我试图做到这一点,以便单击按钮就可以从图形中隐藏名为Remediated的条。我尝试通过执行以下操作来卸载它:

stacked_bar_chart.unload("Remediated");

但是这没有任何效果,我很确定这是因为我在x轴上使用了type: 'category'。我宁愿不必卸载数据,以便以后可以根据需要重新显示栏,而无需再次检索数据。

1 个答案:

答案 0 :(得分:1)

C3.js参考页上进行了一些研究之后,我认为没有简单的API函数可以完成此任务,因此我想出了自己正在测试的当前正在使用的此功能的实现。

首先,通过执行此操作,我将跟踪三个单独的全局变量,这些变量将保存图表中当前的数据,还将保存我们从中删除的数据。我之所以选择这种方式,是因为图表的数据来自Web资源,因此每次添加或删除类别时,保持进行AJAX调用和刷新数据的效率都会很低。

// Our three new variables
var removed_from_stacked_bar = {};
var stacked_bar_categories = ["Remediated", "Unconfirmed"];
var stacked_bar_data = [
               ["Critical", 446, 863], 
               ["High", 1160, 2301],
               ["Medium", 3106, 8258], 
               ["Low", 277, 119], 
               ["Informational", 7374, 23240]
            ];

function initialize_stacked_bar_chart(data, categories) {
    stacked_bar_chart = c3.generate({
        bindto: '#stacked_bar_chart_container',
        data: {
            columns: data, // Coming from the parameter
            type: 'bar',
            groups: [
                ['Low', 'Medium', 'Informational', 'High', 'Critical', 'Unknown']
            ],
        },
        grid: {
            y: {
                lines: [{ value: 0 }]
            }
        },
        axis: {
            x: {
                type: 'category',
                categories: categories // Coming from the parameter
            },
            y: {
                label: 'Number of Findings'
            }
        },       
    });
}

initialize_stacked_bar_chart(stacked_bar_data, stacked_bar_categories);

现在,我编写了一个名为update_stacked_bar_chart()的函数,该函数具有一个category参数,以便删除/添加每次调用时从图表中传入的category

function update_stacked_bar_chart(category) {
    var categoryIndex = stacked_bar_categories.indexOf(category);
    var removed_values = [];
    if (categoryIndex != -1) { // Removing the item since it exists in the bar chart's categories
        stacked_bar_categories.splice(categoryIndex, 1); // Removing the category name from the bar chart's category list
        stacked_bar_data.forEach(function (item, index) {
            var temp = item.splice(categoryIndex + 1, 1); // Removing the value this category held (in-place) in the sublist for each severity
            removed_values.push(temp); // Pushing each removed value into the array of removed values (in order from Critical, High, Medium, Low, Informational).
        });
        removed_from_stacked_bar[category] = removed_values;
    } else { // Re-adding the item if it was not found in the current chart's categories
        stacked_bar_categories.push(category); // Adding the category name to the bar chart's category list
        removed_from_stacked_bar[category].forEach(function (item, index) {
            stacked_bar_data[index].push(item); // Adding the value for each severity into the respective severity list 
        });
        delete removed_from_stacked_bar[category];
    }
    initialize_stacked_bar_chart(stacked_bar_data, stacked_bar_categories); // Remaking the bar chart with the new data and categories.
}

此功能允许您在每次调用条形图时切换任何类别。您可以将其附加到事件侦听器,以便在需要时调用它。

这里是一个如何使用它来切换栏的示例:

update_stacked_bar_chart("Remediated"); // Removes the "Remediated" bar
update_stacked_bar_chart("Remediated"); // Re-adds the "Remediated" bar
update_stacked_bar_chart("Remediated"); // Removes the "Remediated" bar
update_stacked_bar_chart("Unconfirmed"); // Removes the "Unconfirmed" bar
update_stacked_bar_chart("Remediated"); // Re-adds the "Remediated" bar
update_stacked_bar_chart("Unconfirmed"); // Re-adds the "Unconfirmed" bar