Bubble Chart

Bubble Chart - 图1

options data setup

  1. function channelValue(x, y, values) {
  2. return x < 0 && y < 0 ? values[0] : x < 0 ? values[1] : y < 0 ? values[2] : values[3];
  3. }
  4. function colorize(opaque, context) {
  5. var value = context.raw;
  6. var x = value.x / 100;
  7. var y = value.y / 100;
  8. var r = channelValue(x, y, [250, 150, 50, 0]);
  9. var g = channelValue(x, y, [0, 50, 150, 250]);
  10. var b = channelValue(x, y, [0, 150, 150, 250]);
  11. var a = opaque ? 1 : 0.5 * value.v / 1000;
  12. return 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')';
  13. }
  14. const config = {
  15. type: 'bubble',
  16. data: data,
  17. options: {
  18. aspectRatio: 1,
  19. plugins: {
  20. legend: false,
  21. tooltip: false,
  22. },
  23. elements: {
  24. point: {
  25. backgroundColor: colorize.bind(null, false),
  26. borderColor: colorize.bind(null, true),
  27. borderWidth: function(context) {
  28. return Math.min(Math.max(1, context.datasetIndex + 1), 8);
  29. },
  30. hoverBackgroundColor: 'transparent',
  31. hoverBorderColor: function(context) {
  32. return Utils.color(context.datasetIndex);
  33. },
  34. hoverBorderWidth: function(context) {
  35. return Math.round(8 * context.raw.v / 1000);
  36. },
  37. radius: function(context) {
  38. var size = context.chart.width;
  39. var base = Math.abs(context.raw.v) / 1000;
  40. return (size / 24) * base;
  41. }
  42. }
  43. }
  44. }
  45. };
  1. function generateData() {
  2. var data = [];
  3. var i;
  4. for (i = 0; i < DATA_COUNT; ++i) {
  5. data.push({
  6. x: Utils.rand(MIN_XY, MAX_XY),
  7. y: Utils.rand(MIN_XY, MAX_XY),
  8. v: Utils.rand(0, 1000)
  9. });
  10. }
  11. return data;
  12. }
  13. const data = {
  14. datasets: [{
  15. data: generateData()
  16. }, {
  17. data: generateData()
  18. }]
  19. };
  1. const DATA_COUNT = 16;
  2. const MIN_XY = -150;
  3. const MAX_XY = 100;
  4. Utils.srand(110);
  5. const actions = [
  6. {
  7. name: 'Randomize',
  8. handler(chart) {
  9. chart.data.datasets.forEach(dataset => {
  10. dataset.data = generateData();
  11. });
  12. chart.update();
  13. }
  14. },
  15. ];