Javascript - ChartJS尝试更改负数的borderColor和填充颜色

agxfikkp  于 2023-02-12  发布在  Chart.js
关注(0)|答案(1)|浏览(222)

我目前正在创建一个带有ChartJ的折线图,它表示某人的利润。这些利润可以是正数也可以是负数。
我希望零上面的线是绿色的,下面的线是红色的。另外,当值为负值时,背景必须是红色的。我已经在Stackoverflow上看到了以前版本的ChartJS的解决方案,但是我认为这个新版本可能会有一个更优雅的版本来解决这个问题。
我使用的是chartJs4.2.0版本。
以下是我迄今为止根据文档所做的工作:

  1. const lineChartData = {
  2. labels: [
  3. '01/22',
  4. '02/22',
  5. '03/22',
  6. '04/22',
  7. '05/22',
  8. '06/22',
  9. '07/22',
  10. '08/22',
  11. ],
  12. datasets: [
  13. {
  14. label: 'Profit',
  15. data: [2.4, 2.6, 2.23, 1.2, -2.2, -3.6, -1, 0.2],
  16. borderColor: '#0B9564',
  17. pointBackgroundColor: 'transparent',
  18. pointBorderColor: 'transparent',
  19. borderJoinStyle: 'bevel',
  20. fill: {
  21. target: 'origin',
  22. above: 'rgba(11, 149, 100, 0.08)',
  23. below: 'rgba(218, 96, 96, 0.08)',
  24. },
  25. },
  26. ],
  27. };

下面是实际结果:

最后,这里是我希望它看起来像什么的预览。这是一个实体模型,所以它不是很准确。

你知道我怎样才能重现这个问题吗?在我看来,文档中似乎没有提到这个问题。

quhf5bfb

quhf5bfb1#

开箱即用你将无法做到这一点,最好的是像下面的例子(使用the segementation styling,和一个 * linear color gradient *)。
如果你真的需要这样的外观,你可以检查是否有人创建了插件,或者创建你自己的插件 (或内联插件),这将覆盖正常的渲染。(link to plugin documentation)。

    • 这里有一个演示,我将如何做到这一点:**
  • (基于您发布的配置)*
  1. const lineChartData = {
  2. labels: [
  3. '01/22',
  4. '02/22',
  5. '03/22',
  6. '04/22',
  7. '05/22',
  8. '06/22',
  9. '07/22',
  10. '08/22',
  11. ],
  12. datasets: [
  13. {
  14. label: 'Profit',
  15. data: [2.4, 2.6, 2.23, 1.2, -2.2, -3.6, -1, 0.2],
  16. borderColor: '#0B9564',
  17. pointBackgroundColor: 'transparent',
  18. pointBorderColor: 'transparent',
  19. borderJoinStyle: 'bevel',
  20. fill: {
  21. value: -25,
  22. above: 'rgba(11, 149, 100, 0.08)'
  23. },
  24. segment: {
  25. borderColor: ctx => segmentColor(ctx, '#0B9564', 'red')
  26. }
  27. },
  28. ],
  29. };
  30. function segmentColor(ctx, color1, color2){
  31. if(ctx.p0.parsed.y < 0 && ctx.p1.parsed.y < 0 ) {
  32. return color2;
  33. } else if (ctx.p0.parsed.y < 0){
  34. var gradient = myChart.ctx.createLinearGradient(ctx.p0.x, ctx.p0.y, ctx.p1.x, ctx.p1.y);
  35. gradient.addColorStop(.5, color2);
  36. gradient.addColorStop(1, color1);
  37. return gradient
  38. } else if (ctx.p1.parsed.y < 0){
  39. var gradient = myChart.ctx.createLinearGradient(ctx.p1.x, ctx.p1.y, ctx.p0.x, ctx.p0.y);
  40. gradient.addColorStop(.5, color2);
  41. gradient.addColorStop(1, color1);
  42. return gradient
  43. }
  44. return color1
  45. }
  46. const config = {
  47. type: 'line',
  48. data: lineChartData,
  49. options: {
  50. maintainAspectRatio: false,
  51. plugins: {
  52. legend: {
  53. position: 'right',
  54. labels: {
  55. usePointStyle: true,
  56. },
  57. }
  58. },
  59. }
  60. };
  61. var myChart = new Chart(
  62. document.getElementById('chart'),
  63. config
  64. );
  1. <script src="//cdn.jsdelivr.net/npm/chart.js"></script>
  2. <div class="chart" style="height:184px; width:350px;">
  3. <canvas id="chart" ></canvas>
  4. </div>
展开查看全部

相关问题