【问题标题】:Highcharts - Assign a color to a specific value when data is dynamicHighcharts - 当数据是动态的时,将颜色分配给特定值
【发布时间】:2014-01-22 00:22:53
【问题描述】:

**注意:基于 Intranet 的项目

我正在进行的项目利用 HighCharts 生成饼图。此饼图的数据是通过使用 REST API 查询 SharePoint 列表动态创建的。我们以这种方式总共创建了 9 个图表,其中 8 个图表应用了过滤器以将结果缩小到特定组而不是整体。问题是切片的颜色不一致,因为每次查询数据并将其组装到我们的 dataArray 中时,这些值的顺序不同。我们想要尝试做的是为每个数据点值分配一种颜色,以使颜色保持一致。

例如:

Resource = #123ABC
Lost Resource = #456DEF
User Error = #789GHI

然后,我们需要遍历我们的 DataArray,并将这些值应用于该饼图(如果该饼图存在于该数据集中)。我们的数据集例如:

[Resource, 81.6],[Lost Resource, 1.0],[User Error, 0.01]

同样,我们的数据是动态的,所以我们的实际系列代码是:

series: [{
            type: 'pie',
            name: chartTitle,
            data: countArray,
        }]

以下是我们正在使用的完整代码:

Utility.js 文件(将数据处理成 countArray)

"use strict";

var EngagementChartBuilder = window.EngagementChartBuilder || {};

EngagementChartBuilder.Utilities = function () {
var buildCategoryCounts = function (countArray, dataArray) {
    if (countArray == undefined) {
        countArray = [];
    }

    for (var i = 0; i < dataArray.length; i++) {
        var currValue = parseInt(dataArray[i].hours);
        var currName = dataArray[i].reason;
        var found = false;
        for (var j = 0; j < countArray.length; j++) {
            if (countArray[j][0] == currName) {
                found = true;
                var newCount = countArray[j][1];
                countArray[j][1] = newCount + currValue;
            }
        }
        if (!found) {
            countArray.push([currName, currValue]);
        }
    }

    return countArray;
},

loadPieChart = function (countArray, colorArray, divId, chartTitle) {
    //Build Pie Chart
    Highcharts.setOptions({
    })
    $(divId).highcharts({
        chart: {
            plotBackgroundColor: null,
            plotBorderWidth: null,
            plotShadow: false,
            backgroundColor:'rgba(255, 255, 255, 0.1)'
        },
        credits: {
            enabled: false
        },
        colors: colorArray,

        legend: {
            layout: 'horizontal',
        },
        title: {
            text: chartTitle
        },
        tooltip: {
            pointFormat: '<b>{point.y} hours</b>',
            percentageDecimals: 0
        },
        plotOptions: {
            pie: {
                allowPointSelect: true,
                cursor: 'pointer',
                dataLabels: {
                    enabled: true,
                    color: '#000000',
                    connectorColor: '#000000',
                    format: '<b>{point.name}</b> {point.percentage:.1f} %'
                },
                showInLegend: true
            }
        },
        series: [{
            type: 'pie',
            name: chartTitle,
            data: countArray,
        }]
    });
}   

ViewModel.js REST 查询

if (!Array.prototype.filter) {
Array.prototype.filter = function (fun /*, thisp */) {
    "use strict";

    if (this == null)
        throw new TypeError();

    var t = Object(this);
    var len = t.length >>> 0;
    if (typeof fun != "function")
        throw new TypeError();

    var res = [];
    var thisp = arguments[1];
    for (var i = 0; i < len; i++) {
        if (i in t) {
            var val = t[i]; // in case fun mutates this
            if (fun.call(thisp, val, i, t))
                res.push(val);
        }
    }

    return res;
};
}

"use strict";

var EngagementChartBuilder = window.EngagementChartBuilder || {};

EngagementChartBuilder.EngagementsPieChart_COR = function () {
var load = function () {
    $.when(
        //Empire Engagements List
        EngagementChartBuilder.RESTQuery.execute("QA_TimeMgtPerRelease", "$select=*,ProjectRelease/CALCReportGroup,Reason_x0020_Type,CalculatedSubtotal&$filter=(((Reason_x0020_Type%20ne%20'Weekend%20Hours')%20and%20(Reason_x0020_Type%20ne%20'After%20Hours'))%20and%20(ProjectRelease/CALCReportGroup%20eq%20'COR'))&$top=2000")
    ).done(
        function (engagements1) {
            var dataArray = [];
            var countArray = [];

            //Get data from Empire Engagements List
            var results = engagements1.d.results;
            var filtered = [];
            for (var i = 0; i < results.length; i++) {
                if (results[i].ProjectRelease/CALCReportGroup == 'COR') {
                    filtered.push(results[i]);
                }
            }
            for (var i = 0; i < filtered.length; i++) {
                var reason = filtered[i].Reason_x0020_Type;
                var hours = filtered[i].CalculatedSubtotal;
                dataArray[i] = { 'hours': hours, 'reason': reason };
            }

            countArray = EngagementChartBuilder.Utilities.buildCategoryCounts(countArray, dataArray);

            //Build Chart
            EngagementChartBuilder.Utilities.loadPieChart CountArray, "#engagementPieChart_COR", "Testing Time vs. Time Lost (COR)");
        }
    ).fail(
        function (engagements1) {
            $("#engagementPieChart_COR").html("<strong>An error has occurred.</strong>");
        }
    );
};

return {
    load: load
}
}();    

【问题讨论】:

    标签: javascript jquery rest highcharts sharepoint-2013


    【解决方案1】:

    不以数组为点,以对象为点,简单改动:

    countArray.push([currName, currValue]);
    

    到:

    countArray.push({ name: currName, y: currValue, color: 'red' });
    

    第二个变化:

    var newCount = countArray[j][1];
    countArray[j][1] = newCount + currValue;
    

    到:

    var newCount = countArray[j].y;
    countArray[j].y = newCount + currValue;
    

    【讨论】:

    • 好的,我理解你的推理。那么我的问题是如何为特定名称定义颜色?所以基本上如果 currName = Resource,那么它应该始终是 x 颜色。如果 currName = 用户错误,那么它应该始终是 z 颜色。
    • 只需创建一个全局地图:var colorMap = {'User Error': 'red', 'Resource': 'green'},然后使用countArray.push({ name: currName, y: currValue, color: colorMap[currName] });
    • 我试图实现这一点,但它并没有强制每个 currName 使用一致的颜色。实际上什么都没有改变。
    • 奇怪,它应该像@Mark 描述的那样工作。无论如何,您在哪里存储每个系列的颜色? dataArray 中可以有这样的信息吗?喜欢:dataArray[i] = { color: 'red', 'hours': hours, 'reason': reason }; 然后你可以使用var color = dataArray[i].color;countArray.push({ name: currName, y: currValue, color: color }); 设置颜色。
    猜你喜欢
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-03
    相关资源
    最近更新 更多