您的当前位置:首页正文

Echarts 设置(title,axis,series含富文本,tooltip,visualMap...)

2024-11-06 来源:个人技术集锦


引言

        最近做 Dashboard大屏展示,用到了 echarts / echarts-for-react,官网文档的参考手册用过的都知道那叫一个不方便,本文整理了开发中常用的一些接口属性,有啥遗漏的地方后续会继续补充。

一、标题 title / 副标题

    title: {
        text: 'Echarts ',  // 主标题名称
        link: 'https://echarts.apache.org/examples/zh/index.html', // 点击主标题跳转

        textStyle: {                  //主标题文本设置
          color: '#C28D21',           //颜色
          fontSize: 20,               //大小
          fontStyle: 'oblique',       //斜体
          fontWeight: '700',          //粗体
          fontFamily: 'monospace',    //字体
          textBorderColor: "#000",    //描边
          textBorderWidth: '1',       //描边的宽度
          textShadowColor: '#8c8c8c', //阴影颜色
          textShadowBlur: '5',        //阴影的宽度
          textShadowOffsetX: '-10',   //阴影向X偏移
          textShadowOffsetY: '30',    //阴影向Y偏移
        },

      
        subtext: '百度',     //副标题名称 
        sublink: 'http://www.baidu.com', //副标题超链接
        subtextStyle: {//副标题的属性
          color: '#fff',
          // 其他属性类比主标题
        },
        
     
        itemGap: 3,     //主副标题间距
        x: 'center',    //主副标题的水平位置
        y: 'top',       //主副标题的垂直位置
        padding: [20, 20, 0, 20],,    //标题内边距:上右下左
        backgroundColor: '#ccc',//背景颜色;
        borderColor: '#000',    //边框的颜色
        borderWidth: 5,         //标签线框
        borderRadius: 10,       //边框切圆角
        shadowBlur: 10,         //阴影模糊大小.
        shadowColor: '#d9d9d9',    //阴影颜色
        shadowOffsetX: '40',    //阴影水平方向上的偏移距离
        shadowOffsetY: '30',    //阴影垂直方向上的偏移距离
        textAlign: 'auto',        //整体(包括 text 和 subtext)的水平对齐
        textVerticalAlign: 'auto',//整体(包括 text 和 subtext)的垂直对齐
        }

二、坐标轴(以 y 轴为例)

      yAxis: [{
        name: 'Online(vehicles)',      // y轴名称(含义/单位)
        nameLocation: 'end', // 坐标轴名称显示位置。('start''center''end') 
        nameTextStyle:{                // 名称样式
          color:"#65ABE7",   // 蓝绿色
          color: '#8c8c8c',  // 会覆盖上面的颜色
          fontSize:12,  
      },
    // nameGap: 15, // 坐标轴名称与轴线之间的距离。
    // nameRotate: 0, // 坐标轴名字旋转,角度值。
    // inverse: false, // 是否是反向坐标轴。
    // offset: 0, // 轴相对于默认位置的偏移,在相同的 position 上有多个 Y 轴的时候有用。
    // gridIndex: 0 , // 轴所在的 grid 的索引,默认位于第一个 grid。(一般用于多个Y轴时)
    // triggerEvent: false , // 坐标轴的标签是否响应和触发鼠标事件,默认不响应。
    // zlevel: 0 , 
    // z: 0 , //z值小的图形会被z大的图形覆盖,z相比zlevel优先级低,且不会创建新的Canvas。

        type: 'value',       // 数值轴(动态)   若为 'category'   即类别轴  
        splitLine: {         // 当type:category时,该属性无效
          show: false        //  隐藏grid网格线
        },
        axisLine: {          // 轴线样式 
          show: true,   
          lineStyle: { color: '#d9d9d9', width: 2 }
        },
        axisTick: {
          show: false  // 此处无效,  需 type: 'category'  
        },
        axisLabel: {         // 轴刻度标签(数值样式设置)
          // inside: true,      // 各数值显示在 柱状图内部
          color: '#8c8c8c'
        },
         data: [120, 132, 101, 134, 90, 230, 210]
      },
      {                        // 双y轴 配置类似上面
        show: false,
        name: 'Rate',
        type: 'value',
        splitLine: {
          show: false
        },
        axisLine: {
          show: true,   
          lineStyle: { color: '#d9d9d9', width: 2 }
        },
        axisLabel: {
          // inside: true,
          color: '#8c8c8c'
        },

        // data: 数据部分在series 中设置,
        // 当type:category时,此处须设置类似: data: ['Mon', 'Tue', 'Wed', 'Thu','Sun']
      }],

三、series 系列(数据配置)

      series: [  
        {
          name: 'Today',   // 该组数据的名称 默认会出现在提示框tooltip中 
          type: 'line',    // 设置折线图类型  也可 bar pie heatmap...
          smooth: true,    // 折线设置光滑属性
          data: [120, 132, 101, 134, 90], // 数值轴的数据
          itemStyle: {                    // 设置数据样式
            normal: {
              color: '#40a9ff',
              lineStyle: {
                width: 2,
                color: '#40a9ff'
              }
            }
          },
        },
        {           // 多组数据 比如多折现图
          smooth: true,
          name: 'Rate',
          type: 'line',
          stack: 'Total',
          data:  data: [2, 2, 2, 2, 2,]
          
          itemStyle: {
            normal: {
              color: '#40a9ff',  // 数据点颜色
              label: {           // 给各数值设置标签
                 show: true,
                 textStyle: {    // 标签文本样式
                    color: '#fff' //白色
                 }
               },
              lineStyle: {    // 线的样式
                width: 2,
                type: 'dotted',  //'dotted'虚线,默认'solid'实线
                color: '#40a9ff' 
              }
            }
          },
        },
      ]

         为了丰富图、轴的表现形式,通常可以在 series 中设置富文本标签(label)加上 rich 属性实现,比如要实现饼图的某个类别 cityE 富文本化,呈现以下效果:

  series: [
    {
      type: 'pie',
      radius: '65%',  // 饼图占图表整个区域的比例
      center: ['50%', '50%'],  // 水平,垂直方向位置
      selectedMode: 'single',  // 表示是否支持多个类别选中  此处为单个
      data: [
        {
          value: 148,      // 富文本突出的某个数据
          name: 'CityE',   // 富文本突出的某个数据

          label: {            
            formatter: [   // 自定义内容样式
              '{title|{b}}{abg|}',
              '  {weatherHead|Weather}{valueHead|Days}{rateHead|Percent}',
              '{hr|}',
              '  {Sunny|}{value|202}{rate|55.3%}',
              '  {Cloudy|}{value|142}{rate|38.9%}',
              '  {Showers|}{value|21}{rate|5.8%}'
            ].join('\n'),
            backgroundColor: '#eee',
            borderColor: '#777',
            borderWidth: 1,
            borderRadius: 4,
            rich: {        // 富文本各部分属性设置
              title: {
                color: '#eee',
                align: 'center'
              },
              abg: {
                backgroundColor: '#333',
                width: '100%',
                align: 'right',
                height: 25,
                borderRadius: [4, 4, 0, 0]
              },
              Sunny: {
                height: 30,
                align: 'left',
                backgroundColor: {
                  image: weatherIcons.Sunny
                }
              },
              Cloudy: {
                height: 30,
                align: 'left',
                backgroundColor: {
                  image: weatherIcons.Cloudy
                }
              },
              Showers: {
                height: 30,
                align: 'left',
                backgroundColor: {
                  image: weatherIcons.Showers
                }
              },
              weatherHead: {
                color: '#333',
                height: 24,
                align: 'left'
              },
              hr: {
                borderColor: '#777',
                width: '100%',
                borderWidth: 0.5,
                height: 0
              },
              value: {
                color: '#333',
                width: 20,
                padding: [0, 20, 0, 45],
                align: 'center'
              },
              valueHead: {
                color: '#333',
                width: 20,
                padding: [0, 20, 0, 30],
                align: 'center'
              },
              rate: {
                color: '#333',
                width: 40,
                align: 'right',
                padding: [0, 10, 0, 0]
              },
              rateHead: {
                color: '#333',
                width: 40,
                align: 'center',
                padding: [0, 10, 0, 0]
              }
            }
          }
        },
        { value: 75, name: 'CityC' },
        { value: 10, name: 'CityD' },
        { value: 34, name: 'CityB' },
        { value: 5, name: 'CityA' }
      ],
    // 以下不是富文本的内容 一般用于鼠标 滑过/点击 饼图时出现强调效果
      emphasis: {
        itemStyle: {
          shadowBlur: 10,
          shadowOffsetX: 0,
          shadowColor: 'rgba(0, 0, 0, 0.5)'
        }
      }
    }
  ]

四、锦上添花(legend,tooltip,grid,visualMap)

4.1 图例 legend

      legend: {
        data: ['Today', 'Yesterday'],  
        x: 'right',       // 调整水平位置
        y: 'center',      // 调整垂直位置   
        padding: [0, 50, 50, 0],  // 设置内边距
        orient: 'vertical',       // 竖直排列方向
        icon:'circle'             // 设置图例形状
      },

4.2 提示框tooltip

      tooltip: {
        trigger: 'axis',   // 触发条件:'axis'多用于 bar line,'item'数据项触发
        axisPointer: {     // 坐标轴指示
          type: 'shadow'   // 鼠标悬浮到图上,显示阴影。
        },

        formatter: '{a} : {c}',  // 提示信息:{a}(系列名){b}(类目值){c}(数值)

        // formatter 可传入自定义函数
        formatter: function (params) {
          let s = ''
          params.forEach(item => {
            s += item.name + "</br>" + item.marker + item.seriesName + ':' + item.value
          })
          return s
        }

        
      },

4.3 网格 grid

      grid: {
          top: 50,   // 设置图表位置
          bottom: 50,
          left: '45%',

          width: '35%' // 设置图表宽度
          containLabel: true  // 隐藏坐标轴
      },

4.4 视觉映射

      visualMap: {
        min: 0,     // 设置数值范围
        max: 10,
        
        inRange: {
          color: ['#e6f7ff', '#bae7ff', '#91d5ff', '#69c0ff']  // 设置颜色类别
        }

五、图表实战

5.1  横向柱状图

        


  const getBar = () => {
    let option = {
      title: {
        text: 'Today Top Packages',
        padding: [20, 20, 0, 20],
      },
      tooltip: {
        trigger: 'axis',
        axisPointer: {
          type: 'shadow'
        },
        formatter: '{a} : {c}',
      },
      grid: {
        left: '3%',
        right: '0',
        bottom: '2%',
        // containLabel: false  // 隐藏坐标轴
      },
      xAxis: {
        name: 'Running in Vehicles',
        type: 'value',
        boundaryGap: [0, 0.01],
        show: 'true',
        axisLine: {
          // "show": false  // 隐藏线
        },
        axisTick: {
          "show": false  // 隐藏刻度
        },
        splitLine: {
          "show": false // 隐藏刻度 grid 区域中的分隔线
        }
      },
      yAxis: {
        axisLabel: {
          margin: 1,
          padding: 3,
          inside: true,
          baseline: 'bottom',
          textStyle: { // 其余属性默认使用全局文本样式,详见TEXTSTYLE
            // align: 'top',
            fontSize: 14,
            color: '#bfbfbf'
          }
        },

        type: 'category',
        data: ['aaa', 'sss', 'sda', 'ddew', 'ewedw', 'sd23', 'packages name(long)',],
        // data: bar[0],
        axisLine: {
          "show": false
        },
        axisTick: {
          "show": false
        },

      },
      series: [
        {
          barWidth: 10,
          name: 'Running in Vehicles',
          type: 'bar',
          label: {
            show: true,
            position: 'right'
          },
          // data: bar[1],
          data: [10, 52, 20, 34, 30, 38, 22],

          itemStyle: {
            normal: {
              barBorderRadius: [0, 25, 25, 0],
              color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [{
                offset: 0,
                color: "#40a9ff" // 0% 处的颜色
              },
              {
                offset: 0.5,
                color: "#40a9ff" // 60% 处的颜色
              },
              {
                offset: 1,
                color: "#01ccfe", // 100% 处的颜色
                barBorderRadius: [0, 25, 25, 0],
              }], false)
            }
          },
        },
      ]
    };
    return option
  }

        <ReactEcharts
          style={{ width: '40%', boxShadow: '0 0 10px #ccc', margin: '0 0 1% 1%', }}
          option={getBar()}
          notMerge={true}
          lazyUpdate={true}
        >
        </ReactEcharts>

5.2  双向柱状图

  const getBars = (title, xr, yr, xl, yl, unit, t) => {
    let option = {
      title: {
        text: title,
        padding: [20, 0, 0, 20],
      },
      legend: {
        data: ['Download', 'Deploy'],
        y: 'bottom'
      },
      tooltip: {
        trigger: 'axis',
        axisPointer: { // 坐标轴指示器,坐标轴触发有效
          type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
        },
        formatter: function (params) {
          let s = ''
          params.forEach(item => {
            s += item.name + "</br>" + item.marker + item.seriesName + " " + t + ' : ' + item.value + unit
          })
          return s
        }
      },
      grid: [
        // 右图
        {
          top: 50,
          bottom: 50,
          left: '45%',
          width: '35%'
        },
        //左图
        {
          top: 50,
          bottom: 50,
          width: '35%'
        }],
      xAxis: [  //横向为x
        // 右图 部署
        {
          name: unit,
          position: 'bottom',
          type: 'value',
          min: 0,
          // max: 100,
          // splitNumber: 2,

          show: 'true',  // 若设置fale 下面三个无效
          axisLine: {
            show: true   //  不写默认false
          },
          splitLine: {
            show: false // 隐藏刻度 grid 区域中的分隔线 不写默认true
          }
        },
        // 左图
        {
          name: unit,
          gridIndex: 1,  // grid 的索引
          position: 'bottom',
          type: 'value',
          inverse: true,  // 反转显示
          min: 0,
          // max: 100,
          // splitNumber: 2
          show: 'true',  // 若设置fale 下面三个无效
          axisLine: {
            show: true   //  不写默认false
          },
          splitLine: {
            show: false // 隐藏刻度 grid 区域中的分隔线 不写默认true
          }
        }
      ],
      yAxis: [{
        // data:['a','b','c','d','e',],
        data: yr,
        type: 'category',
        position: 'right',
        show: true,
        axisLine: {
          show: true   //  不写默认false
        },
        axisTick: {
          show: false,  // 隐藏刻度  默认为true
        },
      },
      {
        // data:['aa','ba','ca','ad','ea',],
        data: yl,
        gridIndex: 1,
        type: 'category',
        show: true,  // 因为共用y轴,此处写默认为true
        axisLine: {
          show: true   //  不写默认false
        },
        axisTick: {
          show: false,
        },
      }
      ],
      series: [{
        name: 'Deploy',
        type: 'bar',
        label: {
          normal: {
            // show: true,
            // position: 'right'  //控制显示位置  不写默认inside
          }
        },
        itemStyle: { color: '#1890ff' },
        // data: [16, 66, 37, 53, 20, 84,],
        data: xr
      },
      {
        name: 'Download',
        type: 'bar',
        xAxisIndex: 1,
        yAxisIndex: 1,
        // stack: '总量',
        label: {
          normal: {
            // show: true
          }
        },
        itemStyle: { color: '#b5f5ec' },
        // data: [12, 45, 100, 65, 20, 69],
        data: xl
      }
      ]
    };
    return option
  }

            <ReactEcharts
              style={{ width: '100%' }}
              option={
                // getBars('Top AVG-Time')
                getBars('Top AVG-Time', bar2[0]?.[1], bar2[0]?.[0], bar2[1]?.[1], bar2[1]?.[0], 'min', 'Time')
              }
              notMerge={true}
              lazyUpdate={true}
            >
            </ReactEcharts>
//  筛选框用定位处理
            <span style={{ position: 'absolute', right: '1px', top: '1px' }}>
              <div>
                <Select defaultValue={times2} style={{ width: 80 }} bordered={false}
                  getPopupContainer={(triggerNode) => triggerNode.parentNode}
                  onChange={(value) => {
                    setTimes2(value);

                  }}
                >
                  <Option value="day"  >&nbsp;Day &nbsp;</Option>
                  <Option value="week">Week</Option>
                </Select>
              </div>
            </span>

Top