首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为JSCharts生成随机颜色

如何为JSCharts生成随机颜色
EN

Stack Overflow用户
提问于 2015-07-29 19:22:35
回答 2查看 2.1K关注 0票数 2
代码语言:javascript
复制
function getRandomColor() {
            var letters = '0123456789ABCDEF'.split('');
            var color = '#';
            for (var i = 0; i < 6; i++) {
                color += letters[Math.floor(Math.random() * 16)];
            } 
            return color;
        }

我在一个我正在做的项目中使用JSCharts,我需要为一个图形/条形图中的每个条形图提供不同的颜色。

下面的示例运行良好,但是如果我有6条以上的记录,那么它会提醒我一条消息:

在饼图和条形图情况下,JSChart“颜色数组长度必须等于数据长度

如何根据记录的数量生成颜色?

下面是条形图数据集的一个示例:

代码语言:javascript
复制
$.getJSON("http://...", function (data) {

        var array = $.map(data, function (data) {
            return [[data.Name, parseInt(data.Id)]];
        }); 

        var colors = ['#FA5E1F', '#FDCB3F', '#71D743', '#D23333', '#BAE73F', '#B381C9'];
        var myChart = new JSChart('graph', 'bar');
        myChart.setDataArray(array);
        myChart.colorizeBars(colors);
        myChart.setTitle('Title');
        myChart.setTitleColor('#8E8E8E');
        myChart.setAxisNameX('Orgs');
        myChart.setAxisNameY('%');
        myChart.setAxisColor('#c6c6c6');
        myChart.setAxisWidth(1);
        myChart.setAxisNameColor('#9a9a9a');
        myChart.setAxisValuesColor('#939393');
        myChart.setAxisPaddingTop(60);
        myChart.setAxisPaddingLeft(50);
        myChart.setAxisPaddingBottom(60);
        myChart.setTextPaddingBottom(20);
        myChart.setTextPaddingLeft(15);
        myChart.setTitleFontSize(11);
        myChart.setBarBorderWidth(0);
        myChart.setBarSpacingRatio(50);
        myChart.setBarValuesColor('#737373');
        myChart.setGrid(false);
        myChart.setSize(616, 321);
        //myChart.setBackgroundImage('chart_bg.jpg');
        myChart.draw();
    });
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-29 19:47:02

你的功能看起来不错!要使用它在数组中生成颜色,只需使用一个循环:

代码语言:javascript
复制
function getColorArray(num) {
    var result = [];
    for (var i = 0; i < num; i += 1) {
        var letters = '0123456789ABCDEF'.split('');
        var color = '#';
        for (var j = 0; j < 6; j += 1) {
            color += letters[Math.floor(Math.random() * 16)];
        }
        result.push(color);
    }
    return result;
}

然后,可以使用Array.length属性获取数据长度。替换这些行:

代码语言:javascript
复制
var colors = ['#FA5E1F', '#FDCB3F', '#71D743', '#D23333', '#BAE73F', '#B381C9'];
var myChart = new JSChart('graph', 'bar');
myChart.setDataArray(array);
myChart.colorizeBars(colors);

通过以下方式:

代码语言:javascript
复制
var myChart = new JSChart('graph', 'bar');
myChart.setDataArray(array);
myChart.colorizeBars(getColorArray(array.length));
票数 2
EN

Stack Overflow用户

发布于 2015-07-29 21:24:15

可以使用按位运算符生成随机十六进制颜色:

代码语言:javascript
复制
var getRandomColor = function () {
    var random = Math.random();
    var exponent = --random.toExponential().split('-')[1];

    random *= Math.pow(10, exponent);

    return '#' + ( ~~(random * (1 << 24) )).toString(16);
};

然后可以使用data数组来确定颜色的数量:

代码语言:javascript
复制
// Example data Array.
var data = [ 1, 2, 4, 5, 6];

// The amount of random colors you want to generate.
var amount = data.length;

现在您可以创建一个循环并生成您的颜色并将它们推入colors数组中:

代码语言:javascript
复制
// Will contain the random hex colors.
var colors = [];

// Generate colors.
while(amount--) {
    colors.push(getRandomColor());
}

getRandomColor()里发生了什么

当将这些值转换为十进制数时,“最高”十六进制值为ffffff,“最低”值为000000

代码语言:javascript
复制
parseInt('ffffff', 16); // 16777215
parseInt('000000', 16); // 0

结果是,2^24等于16777216,这可以使用位左移位算子来计算,也就是说,1 << n将操作数n位移到等于2^n的左边。因此,1 << 24等于16777216

这意味着,只要您能够在10.1之间提供一个随机数来将它与1 << 24相乘,您将始终得到一个有效的十六进制值。

为了确保这一点,您需要从Math.random()中提取指数,因为它也可以返回像0.0088248689007014这样的值。如果你不这么做,你就不会一直得到正确的十六进制值。

最后,在将随机数转换为十六进制值之前,可以使用~~位非运算符删除小数点之后的所有内容。

您可以找到有关双位运算符在这个问题上的更多信息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31709350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档