Echarts.js 根据数值自定义radar雷达图拐点颜色

自己把自己坑了

公司需求的时候,做了一种线形图,根据数值的大小,变换颜色。示例图如下:


线形图的写法:
color:function(params) {
    let colorList = ['#2CBAFF','#FE7979'];
    if (params.data < 70) {
        return colorList[0];
    } else if (params.data >= 70) {
        return colorList[1];
    }
}

产品经理问我,可以不可以做出这样的。设计图如下:



因为才使用这个插件一天,也不是很熟悉,感觉原理应该差不多。就答应了下来。
(自己挖坑 = =! )
等真正做的时候,发现事情并没有这么简单。。

  • 首先,线图和雷达图的数据写法不一样
线图的数据如下:
series : [
  {
    type:'line',   --类型 线
    label: {  
        normal: {   --文字样式
            margin:2,         --距离
            show: true,       --是否展示文字
            position: 'top',  --文字在点的哪个位置
            fontSize:'14'     --文字大小
        }
    },


    -----------------------------数据在这---------------------------------
    data:[86, 78, 65, 52, 51, 49], 
    -----------------------------数据在这---------------------------------


    smooth: true,  --让曲线变平滑的
    symbolSize: 13,  --圆点大小
    color:function(params) {   -- 颜色  颜色写在外面,就是圆点和文字同种颜色
      let colorList = ['#2CBAFF','#FE7979'];
      alert(params.data)    画重点!!! 循环输出 数据   86   78  65  52  51  49
      if (params.data < 70) {    /
          return colorList[0];
      } else if (params.data >= 70) {
          return colorList[1];
      }
    },
    lineStyle: {   -- 线的样式
      normal: {
        color: '#2CBAFF',
        width: 6,
        shadowColor: 'rgba(0,70,139,0.9)',
        shadowBlur: 50,
        shadowOffsetY: 15
      }
    },
    itemStyle:{  -- 圆点样式
      borderWidth:3
    },
  }
]
线图的数据: data:[xxx,xxx,xxx,xxx,xxx,xxx,xxx]
雷达图数据如下:
series: [
  {
    type: 'radar',
    radarIndex: 1,
    data: [
        {

  
            -----------------------------数据在这---------------------------------
            value: [100, 60, 50, 80, 50, 90, 80, 50, 80, 40],  -- 数据
            -----------------------------数据在这---------------------------------

 
            symbolSize: 8,  --拐点大小
            lineStyle: {   --线的样式
                width: 4,
                color: '#29B8FF'
        },
        areaStyle: {    --数据圈内样式
            normal: {
                opacity: 0.9,
                color: new echarts.graphic.RadialGradient(0.5, 0.5, 1, [
                    {
                        color: '#27B7FF',
                        offset: 0
                    },
                    {
                        color: '#5AD1FF',
                        offset: .4
                    }
                ])
            }
        }
    }
  ],
  itemStyle: {  --圆点样式
      normal: {
        borderWidth: 0,
        //color: '#2CBAFF',
        color:function(params) {   -- 颜色  颜色写在外面,就是圆点和文字同种颜色
           let colorList = ['#2CBAFF','#FE7979'];
               alert(params.data)    不同点 获取不到数据
           if (params.data < 70) {    /
              return colorList[0];
           }else if (params.data >= 70) {
              return colorList[1];
        }
      }
    }
  },
 }
雷达图的数据: data:[ value{xxx,xxx,xxx,xxx,xxx,xxx,xxx} ]  内

后来的做法:把itemStyle提了出去,与data同级

series: [
  {
    type: 'radar',
    radarIndex: 1,
    data: [
       { value: [75, 95, 90, 90, 85, 83, 80, 60, 90, 100],
         symbolSize: 7,
         // itemStyle: {
         //     normal: {
         //         borderWidth: 2,
         //         // color:'#2CBAFF'
         //         color:'red',
         //         // color: function (params) {
         //         //     console.log(params);
         //         //     let colorList = ['#2CBAFF', '#FE7979'];
         //         //     alert(params.data[0].value)
         //         //     if (params.data[0] < 70) {
         //         //         return colorList[0];
         //         //     } else if (params.data[0] >= 70) {
         //         //         return colorList[1];
         //         //     }
         //         // },
         //     }
         // }, 删除
         lineStyle: {
             width: 4,
             color: '#29B8FF'
          },
          areaStyle: {
             normal: {
                 opacity: 0.9,
                 color: new echarts.graphic.RadialGradient(0.5, 0.5, 1, [
                 {
                     color: '#27B7FF',
                     offset: 0
                 },
                 {
                     color: '#5AD1FF',
                     offset: .4
                  }
               ])
            }
         }
       }
     ],
     itemStyle: {  -- 放到这里
        normal: {
           borderWidth: 2,
           color: function (params) {
           let colorList = ['#2CBAFF', '#FE7979'];
           for(let i = 0;i<params.value.length;i++){
               alert(params.value[i]);
               if (params.value[i] < 70) {
                     console.log(colorList[0])
               } else if (params.value[i] >= 70) {
                     console.log(colorList[1])
               }
             }
          }
      }
    }
  }
]
这种写法会依次根据在控制台输出符合的颜色
返回结果
  • 第二,线图可以接受多个颜色,而雷达图radar只能接受一个颜色

我以为到这里已经结束了。
BUT。。。
当我把console.log换成return的时候。遍历数组,总是根据数组第一个值返回对应颜色,下面的不执行了,并把所有的拐点设置为第一个值符合的颜色。
简单来说,就是雷达图的颜色只接受一个参数

换种思维

既然一组数据只能用一种颜色,我在绘制这个数组的时候,先做个遍历:

  • 大于等于某值,生成一个数组,设置颜色1
  • 小于某值,生成一个数组,设置颜色2

绘制

一个图表 设置三层覆盖

  • 把所有数据绘制下来。不要圆点。只要线
  • 把大于某数值的圆点绘制下来,设置蓝色
  • 把小于某数值的圆点绘制下来,设置红色
#### 绘制了三个图表,有时间再详细解析。可以根据需要删除多余的。

<script>
var myChart1 = echarts.init(document.getElementById('chartsContCanvas1'));
var myChart2 = echarts.init(document.getElementById('chartsContCanvas2'));
var myChart3 = echarts.init(document.getElementById('chartsContCanvas3'));

//数据在这里,分别表示三个图表
var itemArrIntelligence = [86, 84, 91, 77, 82, 70];   //智力
var itemArrBone = [59, 89, 100, 82];  //骨骼发育
var itemArrImmunity = [91, 95, 100, 82, 70];  //免疫力

var intelligenceNormal = itemArrIntelligence.map((item) => { if (item >= 70) { return } else { return item } })
var intelligenceLow = itemArrIntelligence.map((item) => { if (item < 70) { return } else { return item } })

var boneNormal = itemArrBone.map((item) => { if (item >= 70) { return } else { return item } })
var boneLow = itemArrBone.map((item) => { if (item < 70) { return } else { return item } })

var immunityNormal = itemArrImmunity.map((item) => { if (item >= 70) { return } else { return item } })
var immunityLow = itemArrImmunity.map((item) => { if (item < 70) { return } else { return item } })


//渲染图标样式
option1 = {
    radar: [
        {
            splitLine: {
                lineStyle: {
                    color: 'rgba(255, 255, 255, 0.9)'
                }
            }
        },
        {
            indicator: [  //这里设置ID是每一项名称,及百分制
                { text: 'DHA', max: 100 }, { text: 'γ-氨基丁酸', max: 100 }, { text: '铁', max: 100 }, { text: '维生素B12', max: 100 }, { text: '锌', max: 100 }, { text: '叶酸', max: 100 }
            ],
            nameGap: 6,
            center: ['50%', '50%'],
            radius: 105,
            name: {
                textStyle: {
                    color: '#AAB8C6',
                    fontSize: 11,
                    fontWeight: 300,
                }
            },
            splitArea: {
                areaStyle: {
                    color: ['none',
                        'none', 'none',
                        'none', 'none'],
                }
            },
            axisLine: {
                lineStyle: {
                    color: '#cde6f5'
                },
            },
            splitLine: {
                lineStyle: {
                    color: '#cde6f5'
                },
            }
        }
    ],
    series: [
        {
            type: 'radar',
            radarIndex: 1,
            legend: {
                orient: 'vertical',
                selectedMode: false,
            },
            data: [
                {
                    value: itemArrIntelligence,
                    symbolSize: 7,
                    lineStyle: {
                        width: 2,
                        color: '#29B8FF'
                    },
                    areaStyle: {
                        normal: {
                            opacity: 0.75,
                            color: new echarts.graphic.RadialGradient(0.5, 0.5, 1, [
                                {
                                    color: '#27B7FF',
                                    offset: 0
                                },
                                {
                                    color: '#5AD1FF',
                                    offset: .4
                                }
                            ])
                        }
                    }
                }
            ],
            itemStyle: {
                normal: {
                    borderWidth: 0,
                    color: '#2CBAFF',
                    // show:false
                }
            },
            silent: true,
            z: 1
        },
        {
            type: 'radar',
            radarIndex: 1,
            data: [
                {
                    value: intelligenceNormal,
                    symbolSize: 7,
                }
            ],
            itemStyle: {
                normal: {
                    borderWidth: 2,
                    color: '#FE7979'
                }
            },
            lineStyle: {
                width: 0,
                labelLine: {
                    show: false   //隐藏标示线
                }
            },
            silent: true,
            z: intelligenceLow[0] ? 2 : 3,
        },
        {
            type: 'radar',
            radarIndex: 1,
            z: intelligenceLow[0] ? 3 : 2,
            data: [
                {
                    value: intelligenceLow,
                    symbolSize: 7,
                }
            ],
            itemStyle: {
                normal: {
                    borderWidth: 2,
                    color: '#2CBAFF'
                }
            },
            lineStyle: {
                width: 0,
                labelLine: {
                    show: false   //隐藏标示线
                }
            },
            silent: true
        },
    ]
}

option2 = {
    radar: [
        {
            splitLine: {
                lineStyle: {
                    color: 'rgba(255, 255, 255, 0.9)'
                }
            }
        },
        {
            indicator: [  //这里设置ID是每一项名称,及百分制
                { text: '钙', max: 100 }, { text: '磷', max: 100 }, { text: '维生素D', max: 100 }, { text: '锌', max: 100 }
            ],
            nameGap: 6,
            center: ['50%', '50%'],
            radius: 105,
            name: {
                textStyle: {
                    color: '#AAB8C6',
                    fontSize: 11,
                    fontWeight: 300,
                }
            },
            splitArea: {
                areaStyle: {
                    color: ['none',
                        'none', 'none',
                        'none', 'none'],
                }
            },
            axisLine: {
                lineStyle: {
                    color: '#cde6f5'
                }
            },
            splitLine: {
                lineStyle: {
                    color: '#cde6f5'
                }
            }
        }
    ],
    series: [
        {
            type: 'radar',
            radarIndex: 1,
            nodeClick: false,
            legend: {
                orient: 'vertical',
                selectedMode: false,
            },
            data: [
                {
                    value: itemArrBone,
                    symbolSize: 7,
                    lineStyle: {
                        width: 2,
                        color: '#29B8FF'
                    },
                    areaStyle: {
                        normal: {
                            opacity: 0.75,
                            color: new echarts.graphic.RadialGradient(0.5, 0.5, 1, [
                                {
                                    color: '#27B7FF',
                                    offset: 0
                                },
                                {
                                    color: '#5AD1FF',
                                    offset: .4
                                }
                            ])
                        }
                    }
                }
            ],
            itemStyle: {
                normal: {
                    borderWidth: 0,
                    // color: '#2CBAFF',
                    show: false
                }
            },
            silent: true,
            z: 1

        },
        {
            type: 'radar',
            radarIndex: 1,
            data: [
                {
                    value: boneNormal,
                    symbolSize: 7,
                }
            ],
            itemStyle: {
                normal: {
                    borderWidth: 2,
                    color: '#FE7979'
                }
            },
            lineStyle: {
                width: 0,
                labelLine: {
                    show: false   //隐藏标示线
                }
            },
            silent: true,
            z: boneLow[0] ? 2 : 3,
        },
        {
            type: 'radar',
            radarIndex: 1,
            z: boneLow[0] ? 3 : 2,
            data: [
                {
                    value: boneLow,
                    symbolSize: 7,
                }
            ],
            itemStyle: {
                normal: {
                    borderWidth: 2,
                    color: '#2CBAFF'
                }
            },
            lineStyle: {
                width: 0,
                labelLine: {
                    show: false   //隐藏标示线
                }
            },
            silent: true
        },
    ]
}

option3 = {
    radar: [
        {
            splitLine: {
                lineStyle: {
                    color: 'rgba(255, 255, 255, 0.9)'
                }
            }
        },
        {
            indicator: [  //这里设置ID是每一项名称,及百分制
                { text: '铁', max: 100 }, { text: '维生素A', max: 100 }, { text: '维生素D', max: 100 }, { text: '锌', max: 100 }, { text: '叶酸', max: 100 }
            ],
            nameGap: 6,
            center: ['50%', '50%'],
            radius: 105,
            name: {
                textStyle: {
                    color: '#AAB8C6',
                    fontSize: 11,
                    fontWeight: 300
                }
            },
            splitArea: {
                areaStyle: {
                    color: ['none',
                        'none', 'none',
                        'none', 'none'],
                }
            },
            axisLine: {
                lineStyle: {
                    color: '#cde6f5'
                }
            },
            splitLine: {
                lineStyle: {
                    color: '#cde6f5'
                }
            }
        }
    ],
    series: [
        {
            type: 'radar',
            radarIndex: 1,
            nodeClick: false,
            legend: {
                orient: 'vertical',
                selectedMode: false,
            },
            data: [
                {
                    value: itemArrImmunity,
                    symbolSize: 7,
                    lineStyle: {
                        width: 2,
                        color: '#29B8FF'
                    },
                    areaStyle: {
                        normal: {
                            opacity: 0.75,
                            color: new echarts.graphic.RadialGradient(0.5, 0.5, 1, [
                                {
                                    color: '#27B7FF',
                                    offset: 0
                                },
                                {
                                    color: '#5AD1FF',
                                    offset: .4
                                }
                            ])
                        }
                    }
                }
            ],
            itemStyle: {
                normal: {
                    borderWidth: 0,
                    show: false
                }
            },
            silent: true,
            z: 1

        },
        {
            type: 'radar',
            radarIndex: 1,
            data: [
                {
                    value: immunityNormal,
                    symbolSize: 7,
                }
            ],
            itemStyle: {
                normal: {
                    borderWidth: 2,
                    color: '#FE7979'
                }
            },
            lineStyle: {
                width: 0,
                labelLine: {
                    show: false   //隐藏标示线
                }
            },
            silent: true,
            z: immunityLow[0] ? 2 : 3,
        },
        {
            type: 'radar',
            radarIndex: 1,
            z: immunityLow[0] ? 3 : 2,
            data: [
                {
                    value: immunityLow,
                    symbolSize: 7,
                }
            ],
            itemStyle: {
                normal: {
                    borderWidth: 2,
                    color: '#2CBAFF'
                }
            },
            lineStyle: {
                width: 0,
                labelLine: {
                    show: false   //隐藏标示线
                }
            },
            silent: true
        },
    ]
}
//渲染图表
myChart1.setOption(option1);
myChart2.setOption(option2);
myChart3.setOption(option3);

</script>

预览地址

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容