demodatalabelling.lpr 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. program demodatalabelling;
  2. {$MODE OBJFPC}
  3. {$MODESWITCH EXTERNALCLASS}
  4. {$WARN 4501 OFF}
  5. uses
  6. JS,
  7. Web,
  8. SysUtils,
  9. Math,
  10. ChartJS;
  11. type
  12. TMyPlugin = class(TChartPluginsHook)
  13. public
  14. procedure afterDatasetsDraw(chart: TChartController;
  15. easingValue: NativeInt; options: TChartOptions); override;
  16. end;
  17. procedure TMyPlugin.afterDatasetsDraw(chart: TChartController;
  18. easingValue: NativeInt; options: TChartOptions);
  19. begin
  20. chart.data.datasets_.forEach(
  21. function (el: JSValue; i: NativeInt; arr: TJSArray): Boolean
  22. type
  23. TTooltipPositionFunc = reference to function: TChartTooltipItem;
  24. var
  25. ctx: TJSCanvasRenderingContext2D;
  26. dataset, meta: TChartBarDataset;
  27. position: TChartTooltipItem;
  28. fontSize: NativeUInt;
  29. begin
  30. meta := TChartBarDataset(chart.getDatasetMeta(i));
  31. if not meta.hidden then
  32. begin
  33. meta.data_.forEach(
  34. function (element: JSValue; index: NativeInt; arr: TJSArray): Boolean
  35. begin
  36. ctx := chart.ctx;
  37. ctx.fillStyle := 'rgb(0, 0, 0)';
  38. fontSize := 16;
  39. asm
  40. ctx.font = Chart.helpers.fontString(fontSize, 'normal',
  41. 'Helvetica Neue');
  42. end;
  43. ctx.textAlign := 'center';
  44. ctx.textBaseline := 'middle';
  45. position := TTooltipPositionFunc(TJSObject(element)['tooltipPosition'])();
  46. dataset := TChartBarDataset(el);
  47. ctx.fillText(IntToStr(dataset.data[index]),
  48. position.x, position.y - (fontSize / 2) - 5);
  49. Result := True;
  50. end);
  51. end;
  52. Result := True;
  53. end);
  54. end;
  55. function randomScalingFactor: NativeUInt;
  56. begin
  57. Result := RandomRange(-100, 100);
  58. end;
  59. var
  60. myBar: TChart;
  61. config: TChartConfiguration;
  62. barChartData: TChartData;
  63. dataset: TChartBarDataset;
  64. begin
  65. barChartData := TChartData.new;
  66. barChartData.datasets_ := TJSArray.new;
  67. barChartData.labels := ['January', 'February', 'March', 'April', 'May',
  68. 'June', 'July'];
  69. dataset := TChartBarDataset.new;
  70. dataset.type_ := 'bar';
  71. dataset.label_ := 'Dataset 1';
  72. dataset.backgroundColor := 'rgba(255, 99, 132, 0.2)';
  73. dataset.borderColor := 'rgb(255, 99, 132)';
  74. dataset.data := [randomScalingFactor, randomScalingFactor,
  75. randomScalingFactor, randomScalingFactor, randomScalingFactor,
  76. randomScalingFactor, randomScalingFactor];
  77. barChartData.datasets_.push(dataset);
  78. dataset := TChartBarDataset.new;
  79. dataset.type_ := 'line';
  80. dataset.label_ := 'Dataset 2';
  81. dataset.backgroundColor := 'rgba(54, 162, 235, 0.2)';
  82. dataset.borderColor := 'rgb(54, 162, 235)';
  83. dataset.data := [randomScalingFactor, randomScalingFactor,
  84. randomScalingFactor, randomScalingFactor, randomScalingFactor,
  85. randomScalingFactor, randomScalingFactor];
  86. barChartData.datasets_.push(dataset);
  87. dataset := TChartBarDataset.new;
  88. dataset.type_ := 'bar';
  89. dataset.label_ := 'Dataset 3';
  90. dataset.backgroundColor := 'rgba(75, 192, 192, 0.2)';
  91. dataset.borderColor := 'rgb(75, 192, 192)';
  92. dataset.data := [randomScalingFactor, randomScalingFactor,
  93. randomScalingFactor, randomScalingFactor, randomScalingFactor,
  94. randomScalingFactor, randomScalingFactor];
  95. barChartData.datasets_.push(dataset);
  96. config := TChartConfiguration.new;
  97. config.type_ := 'bar';
  98. config.data := barChartData;
  99. config.options := TChartOptions.new;
  100. config.options.responsive := True;
  101. config.options.title := TChartTitleConfiguration.new;
  102. config.options.title.display := True;
  103. config.options.title.text := 'Chart.js Combo Bar Line Chart';
  104. TChart.plugins.register(TMyPlugin.new);
  105. myBar := TChart.new('canvas', config);
  106. document.getElementById('randomizeData').addEventListener('click',
  107. procedure
  108. begin
  109. barChartData.datasets_.forEach(
  110. function (element: JSValue; index: NativeInt; arr: TJSArray): Boolean
  111. var
  112. dataset: TChartBarDataset;
  113. begin
  114. dataset := TChartBarDataset(element);
  115. dataset.data_ := dataset.data_.map(
  116. function (el: JSValue; i: NativeInt; a: TJSArray): JSValue
  117. begin
  118. Result := randomScalingFactor;
  119. end);
  120. end);
  121. myBar.update;
  122. end);
  123. end.