从数字生成颜色

时间:2017-06-07 13:25:14

标签: colors chart.js

有一种从数字中获取颜色的方法吗?它在数学上是可能的吗?

我有一个像这样的正数:

?我需要一种颜色(人性可辨)。我可以使用PHP或JS来实现此目的。

我需要这个,因为我使用array(1, 2, 1000, 564, 30, 113)和动态值。

编辑: 这是chartjs文档中的一个例子:

http://www.chartjs.org/

在这个例子中定义了6个条(红色,蓝色,黄色,绿色,紫色和橙色) 在我的情况下,这些条形是动态生成的,我不知道我必须显示多少条。 我如何关联每个栏的颜色? (每次页面刷新时此颜色必须相同)

1 个答案:

答案 0 :(得分:1)

使用https://stackoverflow.com/a/2262117/2737978中的方法,您可以将整数转换为rgb值。

$("#slider1").on("input", function() {
  var value = $(this).val();
  var rgbColor = intToRGB(value);

  $(".number").html(value);
  $(".example").css('background-color', rgbColor);

});

var intToRGB = function(value) {
  //credit to https://stackoverflow.com/a/2262117/2737978 for the idea of how to implement
  var blue = Math.floor(value % 256);
  var green = Math.floor(value / 256 % 256);
  var red = Math.floor(value / 256 / 256 % 256);

  return "rgb(" + red + "," + green + "," + blue + ")";
}
#slider1 {
  width: 100%
}

.example {
  width: 50px;
  height: 50px;
  margin 0 auto;
  background-color: #000000;
  transition: background-color 100ms ease-in;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input id="slider1" type="range" min="0" max="16777215" step="1" value="0" />
<div class="number">0</div>
<div class="example"></div>

您只需在代码中使用intToRGB函数即可。也许虽然如果你的数字都在1-1000之间,你可能看不到这样的梯度,所以需要调整这些值(256或者调整值以某个因子进入)

--- UPDATE

这是一个实际的例子,使用你的图表和一个很大的因素来提供一个很好的颜色范围。您可能希望在此中添加一些验证以确保数据不会超过最大值,但这是一个快速进行。

此处更新了int to RGB函数以获取您想要表示顶部颜色的最大值。在这一点上,可以更容易地创建一个比例,以便在整数之间提供更多的多样性,这取决于你的最大颜色会因为它们落在可以表示的整体规模的不同部分而不同。

var intToRGB = function(value, alpha, max) {
  var valueAsPercentageOfMax = value / max;
  // actual max is 16777215 but represnts white so we will take a max that is
  // below this to avoid white
  var MAX_RGB_INT = 16600000;
  var valueFromMaxRgbInt = Math.floor(MAX_RGB_INT * valueAsPercentageOfMax);
  
  //credit to https://stackoverflow.com/a/2262117/2737978 for the idea of how to implement
  var blue = Math.floor(valueFromMaxRgbInt % 256);
  var green = Math.floor(valueFromMaxRgbInt / 256 % 256);
  var red = Math.floor(valueFromMaxRgbInt / 256 / 256 % 256);
 
  return "rgba(" + red + "," + green + "," + blue + "," + alpha + ")";
}

var data = [12, 19, 3, 5, 2, 3];

var MAX = 19;

var backgroundColors = data.map(function(item) {
  return intToRGB(item, 0.8, MAX);
});

var borderColors = data.map(function(item) {
  return intToRGB(item, 1, MAX);
});
var ctx = document.getElementById("myChart").getContext('2d');
var myChart = new Chart(ctx, {
  type: 'bar',
  data: {
    labels: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"],
    datasets: [{
      label: '# of Votes',
      data: data,
      backgroundColor: backgroundColors,
      borderColor: borderColors,
      borderWidth: 1
    }]
  },
  options: {
    scales: {
      yAxes: [{
        ticks: {
          beginAtZero: true
        }
      }]
    }
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.1.6/Chart.bundle.js"></script>
<canvas id="myChart" width="400" height="400">
</canvas>