Chart.js -添加渐变色而不是纯色-实现解决方案

sqxo8psd  于 2022-11-07  发布在  Chart.js
关注(0)|答案(6)|浏览(303)

我正在使用Chart.js,一切都很好,但我想用一个渐变替换当前的颜色背景(fillColor : "rgba(250,174,50,0.5)")。我有替换渐变的解决方案,但它对我来说太困难了,以我可怜的JS知识来实现这一点。我想对了解JS的人来说很容易。

所以我的Chart.js代码:

<script>

        var data = {
            labels : ["02:00","04:00","06:00","08:00","10:00","12:00","14:00","16:00","18:00","20:00","22:00","00:00"],
            datasets: [
                {
                    fillColor : "rgba(250,174,50,0.5)",
                    strokeColor : "#ff6c23",
                    pointColor : "#fff",
                    pointStrokeColor : "#ff6c23",
                    pointHighlightFill: "#fff",
                    pointHighlightStroke: "#ff6c23",
                    data : [25.0,32.4,22.2,39.4,34.2,22.0,23.2,24.1,20.0,18.4,19.1,17.4]
                }
            ]
        };

        var options = {
            responsive: true,
            datasetStrokeWidth : 3,
            pointDotStrokeWidth : 4,
            tooltipFillColor: "rgba(0,0,0,0.8)",
            tooltipFontStyle: "bold",
            tooltipTemplate: "<%if (label){%><%=label + ' hod' %>: <%}%><%= value + '°C' %>",
            scaleLabel : "<%= Number(value).toFixed(0).replace('.', ',') + '°C'%>"
        };

        var ctx = document.getElementById("temp-chart").getContext("2d");
        var myLineChart = new Chart(ctx).Line(data, options);

    </script>

**和here is solution with gradient。**有人可以尝试实现这个渐变背景,而不是我目前的固体背景?谢谢帮助。

我试着实现它,但是其他函数不起作用(比如scaleLabels等)。

hujrc8aj

hujrc8aj1#

你提供的链接非常清楚,你必须在数据集中的fillColor字段中放入一个linearGradient对象,而不是一个普通的颜色。你可以做复杂的渐变,但下面是一个简单渐变的代码(改变同一个橙子的不透明度):

var gradient = ctx.createLinearGradient(0, 0, 0, 400);
gradient.addColorStop(0, 'rgba(250,174,50,1)');   
gradient.addColorStop(1, 'rgba(250,174,50,0)');

以及您的完整数据集:

datasets: [
            {
                fillColor : gradient, // Put the gradient here as a fill color
                strokeColor : "#ff6c23",
                pointColor : "#fff",
                pointStrokeColor : "#ff6c23",
                pointHighlightFill: "#fff",
                pointHighlightStroke: "#ff6c23",
                data : [25.0,32.4,22.2,39.4,34.2,22.0,23.2,24.1,20.0,18.4,19.1,17.4]
            }
        ]

在此JSFiddle中查看实际应用

m4pnthwp

m4pnthwp2#

注意:对于那些使用Chart.js的较新版本(v2.7.0)的人,当您将@bviale的答案复制粘贴回代码库时,请找出它不起作用;某些属性名称已更改:

fillColor -> backgroundColor
strokeColor -> borderColor
pointColor -> pointBackgroundColor
pointStrokeColor -> pointBorderColor

您将需要更新这些属性名称才能使其正常工作。
参考:https://github.com/chartjs/Chart.js/blob/master/docs/charts/line.md#dataset-properties

uwopmtnx

uwopmtnx3#

为了在react中使用,我采用了以下方法,您需要将一个id传递给组件,然后使用该id获取元素

import React, { Component } from 'react'
import { Line } from 'react-chartjs-2'

export default class GraphComponent extends Component{
  constructor(props){
    super(props)
    this.state = {
      chartData: {}
    }
  }

  componentDidMount(){
    //your code
    var ctx = document.getElementById('canvas').getContext("2d")
    var gradient = ctx.createLinearGradient(0, 0, 0, 400)
    gradient.addColorStop(0, 'rgba(229, 239, 255, 1)')
    gradient.addColorStop(1, '#FFFFFF')
    const newData = {
      labels: [1, 1],
      datasets: [
        {
          label: 'usd',
          data: [1,1],
          backgroundColor: gradient,
          borderColor: this.props.border_color,
          pointRadius: 0
        }
      ]

    }
    this.setState({chartData: newData})
  }

  //more of your code

  render(){
    return(
          <Line
            id='canvas'//you need to give any id you want
            data={this.state.chartData}
            width={100}
            height={30}
            options={{
              legend: {
                display: false
              }
            }}
          />

    )
  }
}

这只是我的第二个答案,所以如果我写错了,请原谅我

csbfibhn

csbfibhn4#

2022年更新版本

var ctx = document.getElementById("temp-chart").getContext("2d");

获取上下文元素后声明梯度,即ctx

var gradient = ctx.createLinearGradient(0, 0, 0, 400);
            gradient.addColorStop(0.2, 'rgb(255, 10, 86,0.5)');
            gradient.addColorStop(1, 'rgb(255, 10, 86,0.1)');

您的数据集将

datasets: [{
                 label: 'Transactions',
                 data: [1,3,4,5]
                 backgroundColor: gradient,
                 borderColor: 'rgb(255, 10, 86,1)',
                 borderWidth: 2,
           }],
lmvvr0a8

lmvvr0a85#

对于任何使用Angular 和ng 2-charts的人,这里是我的解决方案。为了简洁起见,省略了图表设置。

import { Component, OnInit, ViewChild, ChangeDetectorRef, AfterViewInit } from '@angular/core';
import { BaseChartDirective } from 'ng2-charts';
import { GenericLineChart } from './generic-line-chart';

@Component({
    selector: 'app-stats-chart',
    templateUrl: './stats-chart.component.html',
    styleUrls: ['./stats-chart.component.scss']
})
export class StatsChartComponent implements OnInit, AfterViewInit {
    @ViewChild(BaseChartDirective, { static: true }) chartDirective: BaseChartDirective;

    constructor(private changeDetectorRef: ChangeDetectorRef) { }

    ngOnInit() {
        // ...setup chart
    }

    ngAfterViewInit() {
        // set gradient
        const gradient = this.chartDirective.chart.ctx.createLinearGradient(0, 0, 0, 400);
        gradient.addColorStop(0, 'rgba(30, 214, 254, .3)');
        gradient.addColorStop(1, 'rgba(0,0,0,0)');
        this.chart.lineChartData[0].backgroundColor = gradient;

        this.changeDetectorRef.detectChanges();
    }

}
ct3nt3jp

ct3nt3jp6#

您可以使用这个npm包。
https://www.npmjs.com/package/chartjs-plugin-gradient
这使得创建渐变backgroundColor或borderColor变得非常容易。
示例:

const chart = new Chart(ctx, {
  data: {
    datasets: [{
      // data
      gradient: {
        backgroundColor: {
          axis: 'y',
          colors: {
            0: 'red',
            50: 'yellow',
            100: 'green'
          }
        },
        borderColor: {
          axis: 'x',
          colors: {
            0: 'black',
            1: 'white',
            2: 'black',
            3: 'white'
          }
        }
      }
    }]
  }
});

相关问题