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>

预览地址

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容