代码之家  ›  专栏  ›  技术社区  ›  Degun

图表Js:如何根据第三个数据更改点的颜色

  •  0
  • Degun  · 技术社区  · 2 年前

    我想根据第三个数据更改点的颜色。

    目前,我从一个json文件中获取x轴和y轴:

    {"data": [{"date": "2022-04-04", "position": 5.0, "indexed": 1}, {"date": "2022-04-05", "position": 5.0, "indexed": 0}, {"date": "2022-04-06", "position": 5.0, "indexed": 0}, {"date": "2022-04-07", "position": 5.0, "indexed": 0}, {"date": "2022-04-07", "position": 5.1, "indexed": 0}, {"date": "2022-04-08", "position": 5.9, "indexed": 0}, {"date": "2022-04-09", "position": 5.0, "indexed": 0}, {"date": "2022-04-10", "position": 5.0, "indexed": 0}, {"date": "2022-04-11", "position": 5.0, "indexed": 0}, {"date": "2022-04-12", "position": 5.0, "indexed": 0}, {"date": "2022-04-13", "position": 5.0, "indexed": 0}, {"date": "2022-04-14", "position": 5.0, "indexed": 0}, {"date": "2022-04-15", "position": 5.0, "indexed": 0}, {"date": "2022-04-16", "position": 5.0, "indexed": 0}, {"date": "2022-04-17", "position": 5.0, "indexed": 0}, {"date": "2022-04-18", "position": 5.0, "indexed": 0}, {"date": "2022-04-19", "position": 5.0, "indexed": 0}, {"date": "2022-04-20", "position": 5.0, "indexed": 0}, {"date": "2022-04-21", "position": 5.0, "indexed": 0}]}
    

    日期:x

    职位:y

    索引:如果0:蓝色-如果1:红色

    为了根据第三个数据更改颜色,我使用了脚本选项: https://www.chartjs.org/docs/latest/general/options.html#scriptable-options

    以下是我写的:

    const main_data = {
    label: '{{ keyword }}',
    data: [],
    backgroundColor: "#6AC44D",
    borderColor: "#1300FF",
    pointBorderColor: [],
    borderWidth: 1,
    pointBackgroundColor : function(context) {
            const response = fetch('/get_json/{{keyword}}');
            const datapoints = response.json();
            datapoints.then(datapoints => {
            const indexed = datapoints.data.map(function(index){
                return index.indexed;
            })                      
            var index = context.dataIndex;
            var value = context.dataset.data[index];
            console.log(value)
            var label = context.labels;
            if (indexed == 0){return value == 'blue'}else{return value =='red'}
        });
    }
    
    }

    我做错了什么?

    在这里,函数允许我创建图形,而不改变点的颜色。

    这部分工作:

    function createChart(){
        async function fetchdata(){
        const url = '/get_json/{{keyword}}';
        const response = await fetch(url);
        const datapoints = await response.json();
        return datapoints;
        };
         
        fetchdata().then(datapoints => {
            const dates = datapoints.data.map(function(index){
                return index.date;
            })
            const positions = datapoints.data.map(function(index){
                return index.position;
            })
            const indexed = datapoints.data.map(function(index){
                return index.indexed;
            })
    
        myChart.config.data.labels = dates
        myChart.config.data.datasets[0].data = positions
        myChart.update();
        });
    }
    1 回复  |  直到 2 年前
        1
  •  0
  •   Jwit    2 年前

    返回颜色时出现两个错误:

    1. 当返回颜色时,实际上是返回布尔值,正如评论中提到的,它应该只是字符串

    2. indexed是一个数组,所以indexed==0是不正确的,您实际上要做的是检查indexed中的目标索引

    您的最终if应该如下所示:

    if (indexed[context.dataIndex] == 0){return 'blue'}else{return 'red'}
    

    I've also made a JSFiddle so you can see this in action