Echarts - 多个页面内有N个 echarts 图表,封装组件 CommonEcharts 快捷实现

目录

  • 子组件
  • 父组件使用
    • 注意
  • option 文件
  • 效果展示
  • 相关数据处理(代码备份 - 可不看)
    • 数据处理后页面展示

子组件

CommonEcharts.vue

<template>
  <div>
    <div v-for="id in domId" :id="id" :key="id" class="echarts" />
  </div>
</template>

<script>
export default {
  name: 'CommonEcharts',
  components: {},

  props: {
    info: {
      type: Object,
      required: true
    },
    domId: {
      type: Array,
      required: true
    },
    optionsObj: {
      type: Object,
      required: true
    }
  },

  data() {
    return {
      EchartsObj: {}
    }
  },

  computed: {},

  watch: {
    info() {
      this.init()
    }
  },

  mounted() {
    window.addEventListener('resize', () => {
      this.domId.forEach((id) => {
        if (document.getElementById(id)) {
          this.EchartsObj[id] = this.$echarts.init(document.getElementById(id))
          this.EchartsObj[id].resize()
        }
      })
    })

    this.init()
  },

  created() {},

  methods: {
    init() {
      this.domId.forEach((id) => {
        if (this.EchartsObj[id]) {
          this.EchartsObj[id].dispose()
        }
        const dom = document.getElementById(id)
        if (!dom) return
        this.EchartsObj[id] = this.$echarts.init(dom)
        this.EchartsObj[id].setOption(this.optionsObj[id])
      })
    }
  }
}
</script>

<style lang='scss' scoped>
.echarts {
  height: 400px;
}
</style>

父组件使用

<template>
  <CommonEcharts :info="info" :dom-id="domId" :options-obj="optionsObj" />
</template>

<script>
import { lineEcharts, scatterEcharts, barEcharts } from './echarts-options'
import CommonEcharts from './CommonEcharts.vue'

export default {
  name: 'JdcTimeEcharts',
  components: {
    CommonEcharts
  },

  props: {
    info: {
      type: Object,
      required: true
    }
  },

  data() {
    return {
      domId: ['JdcTimeEcharts1', 'JdcTimeEcharts2', 'JdcTimeEcharts3']
    }
  },

  computed: {
    optionsObj() {
      return {
        JdcTimeEcharts1: lineEcharts(),
        JdcTimeEcharts2: scatterEcharts(),
        JdcTimeEcharts3: barEcharts()
      }
    }
  }
}
</script>

<style lang='scss' scoped>
</style>

注意

  • domId 中数据 要与 optionsObj 中数据一一对应

option 文件

echarts-options.js

import * as Echarts from 'echarts'

// 折线图 - 参考示例 https://www.makeapie.cn/echarts_content/xS9Oh_JY06.html
export function lineEcharts() {
  return {
    backgroundColor: '#080b30',
    title: {
      text: '多线图',
      textStyle: {
        align: 'center',
        color: '#fff',
        fontSize: 20
      },
      top: '5%',
      left: 'center'
    },
    tooltip: {
      trigger: 'axis',
      axisPointer: {
        lineStyle: {
          color: {
            type: 'linear',
            x: 0,
            y: 0,
            x2: 0,
            y2: 1,
            colorStops: [
              {
                offset: 0,
                color: 'rgba(0, 255, 233,0)'
              },
              {
                offset: 0.5,
                color: 'rgba(255, 255, 255,1)'
              },
              {
                offset: 1,
                color: 'rgba(0, 255, 233,0)'
              }
            ],
            global: false
          }
        }
      }
    },
    grid: {
      top: '15%',
      left: '5%',
      right: '5%',
      bottom: '15%'
      // containLabel: true
    },
    xAxis: [
      {
        type: 'category',
        axisLine: {
          show: true
        },
        splitArea: {
          // show: true,
          color: '#f00',
          lineStyle: {
            color: '#f00'
          }
        },
        axisLabel: {
          color: '#fff'
        },
        splitLine: {
          show: false
        },
        boundaryGap: false,
        data: ['A', 'B', 'C', 'D', 'E', 'F']
      }
    ],

    yAxis: [
      {
        type: 'value',
        min: 0,
        // max: 140,
        splitNumber: 4,
        splitLine: {
          show: true,
          lineStyle: {
            color: 'rgba(255,255,255,0.1)'
          }
        },
        axisLine: {
          show: false
        },
        axisLabel: {
          show: false,
          margin: 20,
          textStyle: {
            color: '#d1e6eb'
          }
        },
        axisTick: {
          show: false
        }
      }
    ],
    series: [
      {
        name: '注册总量',
        type: 'line',
        smooth: true, // 是否平滑
        showAllSymbol: true,
        // symbol: 'image://./static/images/guang-circle.png',
        symbol: 'circle',
        symbolSize: 15,
        lineStyle: {
          normal: {
            color: '#00b3f4',
            shadowColor: 'rgba(0, 0, 0, .3)',
            shadowBlur: 0,
            shadowOffsetY: 5,
            shadowOffsetX: 5
          }
        },
        label: {
          show: true,
          position: 'top',
          textStyle: {
            color: '#00b3f4'
          }
        },
        itemStyle: {
          color: '#00b3f4',
          borderColor: '#fff',
          borderWidth: 3,
          shadowColor: 'rgba(0, 0, 0, .3)',
          shadowBlur: 0,
          shadowOffsetY: 2,
          shadowOffsetX: 2
        },
        tooltip: {
          show: false
        },
        areaStyle: {
          normal: {
            color: new Echarts.graphic.LinearGradient(
              0,
              0,
              0,
              1,
              [
                {
                  offset: 0,
                  color: 'rgba(0,179,244,0.3)'
                },
                {
                  offset: 1,
                  color: 'rgba(0,179,244,0)'
                }
              ],
              false
            ),
            shadowColor: 'rgba(0,179,244, 0.9)',
            shadowBlur: 20
          }
        },
        data: [502.84, 205.97, 332.79, 281.55, 398.35, 214.02]
      },
      {
        name: '注册总量',
        type: 'line',
        smooth: true, //是否平滑
        showAllSymbol: true,
        // symbol: 'image://./static/images/guang-circle.png',
        symbol: 'circle',
        symbolSize: 15,
        lineStyle: {
          normal: {
            color: '#00ca95',
            shadowColor: 'rgba(0, 0, 0, .3)',
            shadowBlur: 0,
            shadowOffsetY: 5,
            shadowOffsetX: 5
          }
        },
        label: {
          show: true,
          position: 'top',
          textStyle: {
            color: '#00ca95'
          }
        },

        itemStyle: {
          color: '#00ca95',
          borderColor: '#fff',
          borderWidth: 3,
          shadowColor: 'rgba(0, 0, 0, .3)',
          shadowBlur: 0,
          shadowOffsetY: 2,
          shadowOffsetX: 2
        },
        tooltip: {
          show: false
        },
        areaStyle: {
          normal: {
            color: new Echarts.graphic.LinearGradient(
              0,
              0,
              0,
              1,
              [
                {
                  offset: 0,
                  color: 'rgba(0,202,149,0.3)'
                },
                {
                  offset: 1,
                  color: 'rgba(0,202,149,0)'
                }
              ],
              false
            ),
            shadowColor: 'rgba(0,202,149, 0.9)',
            shadowBlur: 20
          }
        },
        data: [281.55, 398.35, 214.02, 179.55, 289.57, 356.14]
      }
    ]
  }
}
// 散点图 - 参考示例 https://www.makeapie.cn/echarts_content/xZvv5T7_R6.html
export function scatterEcharts() {
  return {
    tooltip: {
      position: 'top'
    },
    legend: {
      left: 'center'
    },
    title: [],
    xAxis: {
      name: '公开年份',
      nameLocation: 'center',
      nameGap: 30,
      type: 'category',
      data: ['2012', '2013', '2014', '2015', '2016', '2017', '2018', '2019', '2020', '2021'],
      boundaryGap: false,
      splitLine: {
        show: false
      },
      axisLine: {
        show: false
      }
    },
    yAxis: {
      name: 'IPC分类号',
      nameLocation: 'center',
      nameGap: 50,
      type: 'category',
      data: ['G06F', 'G06Q', 'G10L', 'G06K', 'H04L', 'G16H', 'G05B', 'G08C', 'H04N', 'H04M'],
      axisLabel: {
        margin: 20
      },
      splitLine: {
        show: true,
        lineStyle: {
          type: 'dashed'
        }
      },
      axisLine: {
        show: false
      }
    },
    series: [
      {
        name: 'G06F',
        type: 'scatter',
        symbolSize: (val) => {
          return val[2] % 40
        },
        data: [
          [0, 0, 444],
          [1, 0, 699],
          [2, 0, 951],
          [3, 0, 1126],
          [4, 0, 1347],
          [5, 0, 1993],
          [6, 0, 3096],
          [7, 0, 5196],
          [8, 0, 1750],
          [9, 0, 222]
        ],
        animationDelay: (idx) => {
          return idx * 5
        }
      },
      {
        name: 'G06Q',
        type: 'scatter',
        symbolSize: (val) => {
          return val[2] % 40
        },
        data: [
          [0, 1, 484],
          [1, 1, 239],
          [2, 1, 351],
          [3, 1, 126],
          [4, 1, 347],
          [5, 1, 993],
          [6, 1, 2096],
          [7, 1, 5196],
          [8, 1, 1750],
          [9, 1, 222]
        ],
        animationDelay: (idx) => {
          return idx * 5
        }
      },
      {
        name: 'G10L',
        type: 'scatter',
        symbolSize: (val) => {
          return val[2] % 40
        },
        data: [
          [0, 2, 44],
          [1, 2, 69],
          [2, 2, 1951],
          [3, 2, 116],
          [4, 2, 147],
          [5, 2, 993],
          [6, 2, 3096],
          [7, 2, 596],
          [8, 0, 1750],
          [9, 2, 222]
        ],
        animationDelay: (idx) => {
          return idx * 5
        }
      },
      {
        name: 'G06K',
        type: 'scatter',
        symbolSize: (val) => {
          return val[2] % 40
        },
        data: [
          [0, 3, 1444],
          [1, 3, 1699],
          [2, 3, 1951],
          [3, 3, 1126],
          [4, 3, 147],
          [5, 3, 1993],
          [6, 3, 396],
          [7, 3, 5196],
          [8, 3, 150],
          [9, 3, 2212]
        ],
        animationDelay: (idx) => {
          return idx * 5
        }
      },
      {
        name: 'H04L',
        type: 'scatter',
        symbolSize: (val) => {
          return val[2] % 40
        },
        data: [
          [0, 4, 444],
          [1, 4, 699],
          [2, 4, 951],
          [3, 4, 1126],
          [4, 4, 1347],
          [5, 4, 1993],
          [6, 4, 3096],
          [7, 4, 5196],
          [8, 4, 1750],
          [9, 4, 222]
        ],
        animationDelay: (idx) => {
          return idx * 5
        }
      },
      {
        name: 'G16H',
        type: 'scatter',
        symbolSize: (val) => {
          return val[2] % 40
        },
        data: [
          [0, 5, 444],
          [1, 5, 699],
          [2, 5, 951],
          [3, 5, 1126],
          [4, 5, 1347],
          [5, 5, 1993],
          [6, 5, 3096],
          [7, 5, 5196],
          [8, 5, 1750],
          [9, 5, 222]
        ],
        animationDelay: (idx) => {
          return idx * 5
        }
      },
      {
        name: 'G05B',
        type: 'scatter',
        symbolSize: (val) => {
          return val[2] % 40
        },
        data: [
          [0, 6, 444],
          [1, 6, 699],
          [2, 6, 951],
          [3, 6, 1126],
          [4, 6, 1347],
          [5, 6, 1993],
          [6, 6, 3096],
          [7, 6, 5196],
          [8, 6, 1750],
          [9, 6, 222]
        ],
        animationDelay: (idx) => {
          return idx * 5
        }
      },
      {
        name: 'G08C',
        type: 'scatter',
        symbolSize: (val) => {
          return val[2] % 40
        },
        data: [
          [0, 7, 444],
          [1, 7, 699],
          [2, 7, 951],
          [3, 7, 1126],
          [4, 7, 1347],
          [5, 7, 1993],
          [6, 7, 3096],
          [7, 7, 5196],
          [8, 7, 1750],
          [9, 7, 222]
        ],
        animationDelay: (idx) => {
          return idx * 5
        }
      },
      {
        name: 'H04N',
        type: 'scatter',
        symbolSize: (val) => {
          return val[2] % 40
        },
        data: [
          [0, 8, 444],
          [1, 8, 699],
          [2, 8, 951],
          [3, 8, 1126],
          [4, 8, 1347],
          [5, 8, 1993],
          [6, 8, 3096],
          [7, 8, 5196],
          [8, 8, 1750],
          [9, 8, 222]
        ],
        animationDelay: (idx) => {
          return idx * 5
        }
      },
      {
        name: 'H04M',
        type: 'scatter',
        symbolSize: (val) => {
          return val[2] % 40
        },
        data: [
          [0, 9, 444],
          [1, 9, 699],
          [2, 9, 951],
          [3, 9, 1126],
          [4, 9, 1347],
          [5, 9, 1993],
          [6, 9, 3096],
          [7, 9, 5196],
          [8, 9, 1750],
          [9, 9, 222]
        ],
        animationDelay: (idx) => {
          return idx * 5
        }
      }
    ]
  }
}
// 柱状图 - 参考示例 https://www.makeapie.cn/echarts_content/xQWEnqAtdc.html
export function barEcharts() {
  return {
    backgroundColor: '#001120',
    tooltip: {
      trigger: 'axis',
      axisPointer: {
        // 坐标轴指示器,坐标轴触发有效
        type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
      }
    },
    legend: {
      data: ['邮件营销', '联盟广告'],
      textStyle: {
        color: 'rgba(55,255,249,1)'
      }
    },
    grid: {
      left: '3%',
      right: '4%',
      bottom: '3%',
      containLabel: true
    },
    xAxis: [
      {
        type: 'category',
        data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日'],
        splitLine: {
          show: false
        },
        axisLine: {
          lineStyle: {
            color: 'rgba(55,255,249,1)'
          }
        },
        axisLabel: {
          color: 'rgba(55,255,249,1)'
        }
      }
    ],
    yAxis: [
      {
        type: 'value',
        splitLine: {
          show: false
        },
        axisLine: {
          lineStyle: {
            color: 'rgba(55,255,249,1)'
          }
        }
      }
    ],
    series: [
      {
        name: '邮件营销',
        type: 'bar',
        barWidth: 20,
        itemStyle: {
          barBorderRadius: 20,
          color: new Echarts.graphic.LinearGradient(0, 0, 0, 1, [
            {
              offset: 0,
              color: 'rgba(55,255,249,1)'
            },
            {
              offset: 1,
              color: 'rgba(0,222,215,0.2)'
            }
          ])
        },
        data: [120, 132, 101, 134, 90, 230, 210]
      },
      {
        // 替代柱状图 默认不显示颜色,是最下方柱图(邮件营销)的value值 - 20
        type: 'bar',
        barWidth: 20,
        barGap: '-100%',
        stack: '广告',
        itemStyle: {
          color: 'transparent'
        },
        data: [100, 102, 81, 114, 70, 210, 190]
      },
      {
        name: '联盟广告',
        type: 'bar',
        barWidth: 20,
        barGap: '-100%',
        stack: '广告',
        itemStyle: {
          barBorderRadius: 20,
          color: new Echarts.graphic.LinearGradient(0, 0, 0, 1, [
            {
              offset: 0.4,
              color: 'rgba(255,252,0,1)'
            },
            {
              offset: 1,
              color: 'rgba(8,228,222,0.2)'
            }
          ])
        },
        data: [220, 182, 191, 234, 290, 330, 310]
      }
    ]
  }
}

效果展示

在这里插入图片描述

相关数据处理(代码备份 - 可不看)

/**** echarts 折线图、散点图 - 数据处理 ****/

// 数据源
const info = {
  itemMap: {
    警告: [
      {
        total: 28,
        cfzl: '1',
        cfzlView: '警告',
        wfxl: '12',
        wfxlView: '超速行驶',
        jtfs: 'B11',
        jtfsView: '重型栏板半挂车'
      },
      {
        total: 3,
        cfzl: '1',
        cfzlView: '警告',
        wfxl: '17',
        wfxlView: '未低速通过',
        jtfs: 'B11',
        jtfsView: '重型栏板半挂车'
      },
      {
        total: 6,
        cfzl: '1',
        cfzlView: '警告',
        wfxl: '26',
        wfxlView: '违法停车',
        jtfs: 'B11',
        jtfsView: '重型栏板半挂车'
      },
      {
        total: 21,
        cfzl: '1',
        cfzlView: '警告',
        wfxl: '28',
        wfxlView: '违法装载',
        jtfs: 'B11',
        jtfsView: '重型栏板半挂车'
      },
      {
        total: 3,
        cfzl: '1',
        cfzlView: '警告',
        wfxl: '49',
        wfxlView: '其他影响安全行为',
        jtfs: 'B11',
        jtfsView: '重型栏板半挂车'
      },
      {
        total: 1,
        cfzl: '1',
        cfzlView: '警告',
        wfxl: '28',
        wfxlView: '违法装载',
        jtfs: 'B21',
        jtfsView: '中型栏板半挂车'
      }
    ],
    罚款: [
      {
        total: 56,
        cfzl: '2',
        cfzlView: '罚款',
        wfxl: '12',
        wfxlView: '超速行驶',
        jtfs: 'B11',
        jtfsView: '重型栏板半挂车'
      },
      {
        total: 6,
        cfzl: '2',
        cfzlView: '罚款',
        wfxl: '17',
        wfxlView: '未低速通过',
        jtfs: 'B11',
        jtfsView: '重型栏板半挂车'
      },
      {
        total: 12,
        cfzl: '2',
        cfzlView: '罚款',
        wfxl: '26',
        wfxlView: '违法停车',
        jtfs: 'B11',
        jtfsView: '重型栏板半挂车'
      },
      {
        total: 42,
        cfzl: '2',
        cfzlView: '罚款',
        wfxl: '28',
        wfxlView: '违法装载',
        jtfs: 'B11',
        jtfsView: '重型栏板半挂车'
      },
      {
        total: 6,
        cfzl: '2',
        cfzlView: '罚款',
        wfxl: '49',
        wfxlView: '其他影响安全行为',
        jtfs: 'B11',
        jtfsView: '重型栏板半挂车'
      },
      {
        total: 2,
        cfzl: '2',
        cfzlView: '罚款',
        wfxl: '28',
        wfxlView: '违法装载',
        jtfs: 'B21',
        jtfsView: '中型栏板半挂车'
      }
    ]
  },
  columns: [
    { jtfs: 'B11', jtfsView: '重型栏板半挂车' },
    { jtfs: 'B21', jtfsView: '中型栏板半挂车' }
  ]
}

// 处理代码
function optionsObj() {
  const xAxisData = []
  const yAxisData = []
  this.info?.columns?.forEach((item) => {
    !xAxisData.includes(item.jtfsView) && xAxisData.push(item.jtfsView)
  })
  const seriesNameList = Object.keys(this.info?.itemMap)
  const seriesList1 = []
  const seriesList2 = []
  seriesNameList.forEach((seriesName) => {
    const data1 = []

    this.info?.itemMap[seriesName].forEach((i) => {
      const xIndex = xAxisData.findIndex((xItem) => xItem === i.jtfsView)
      const yIndex = yAxisData.findIndex((yItem) => yItem === i.wfxlView)
      if (!yAxisData.includes(i.wfxlView)) {
        yAxisData.push(i.wfxlView)
        seriesList2.push({
          name: i.wfxlView,
          data: [[xIndex, seriesList2.length, i.total]]
        })
      } else {
        const seriesList2Index = seriesList2.findIndex(
          (seriesList2Item) => seriesList2Item.name === i.wfxlView
        )
        const seriesDataIndex = seriesList2[seriesList2Index].data.findIndex(
          (dataItem) => dataItem[0] === xIndex && dataItem[1] === yIndex
        )
        if (seriesDataIndex !== -1) {
          seriesList2[seriesList2Index].data[seriesDataIndex] = [
            xIndex,
            yIndex,
            i.total + seriesList2[seriesList2Index].data[seriesDataIndex][2]
          ]
        } else {
          seriesList2[seriesList2Index].data.push([xIndex, yIndex, i.total])
        }
      }
      data1[xIndex] = (data1[xIndex] || 0) + (i.total || 0)
    })
    seriesList1.push({
      name: seriesName,
      data: data1
    })
  })

  console.log('xAxisData----', xAxisData)
  console.log('yAxisData----', yAxisData)
  console.log('seriesList1----', seriesList1)
  console.log('seriesList2----', seriesList2)

  return {
    // 折线图
    JdcTimeEcharts1: lineEcharts({
      xAxisData,
      seriesList: seriesList1
    }),
    // 散点图
    JdcTimeEcharts2: scatterEcharts({
      xAxisName: '车辆类型',
      xAxisData,
      yAxisData,
      seriesList: seriesList2
    })
  }
}

// 处理结果
const xAxisData = ['重型栏板半挂车', '中型栏板半挂车']
const yAxisData = ['超速行驶', '未低速通过', '违法停车', '违法装载', '其他影响安全行为']
const seriesList1 = [
  {
    name: '警告',
    data: [61, 1]
  },
  {
    name: '罚款',
    data: [122, 2]
  }
]
const seriesList2 = [
  {
    name: '超速行驶',
    data: [[0, 0, 84]]
  },
  {
    name: '未低速通过',
    data: [[0, 1, 9]]
  },
  {
    name: '违法停车',
    data: [[0, 2, 18]]
  },
  {
    name: '违法装载',
    data: [[0, 3, 63], [1, 3, 3]]
  },
  {
    name: '其他影响安全行为',
    data: [[0, 4, 9]]
  }
]

/**** echarts图表option配置项 ****/
// import * as Echarts from 'echarts'

// 折线图
function lineEcharts({ xAxisData = [], seriesList = [] }) {
  const colorList = [
    '#00b3f4',
    '#00ca95',
    '#fce07e',
    '#f18585',
    '#8fcde5',
    '#62b58e',
    '#fd9d75',
    '#ae80c3'
  ]
  const defaultColor = '#ee96d6'

  return {
    backgroundColor: '#080b30',
    title: {
      show: !xAxisData.length && !seriesList.length,
      text: '暂无数据',
      left: 'center',
      top: 'center',
      textStyle: {
        color: '#fff'
      }
    },
    tooltip: {
      trigger: 'axis',
      axisPointer: {
        lineStyle: {
          color: {
            type: 'linear',
            x: 0,
            y: 0,
            x2: 0,
            y2: 1,
            colorStops: [
              {
                offset: 0,
                color: 'rgba(0, 255, 233,0)'
              },
              {
                offset: 0.5,
                color: 'rgba(255, 255, 255,1)'
              },
              {
                offset: 1,
                color: 'rgba(0, 255, 233,0)'
              }
            ],
            global: false
          }
        }
      }
    },
    grid: {
      top: '15%',
      left: '5%',
      right: '5%',
      bottom: '15%'
      // containLabel: true
    },
    xAxis: [
      {
        type: 'category',
        axisLine: {
          show: true
        },
        splitArea: {
          // show: true,
          color: '#f00',
          lineStyle: {
            color: '#f00'
          }
        },
        axisLabel: {
          color: '#fff'
        },
        splitLine: {
          show: false
        },
        boundaryGap: false,
        // data: ['A', 'B', 'C', 'D', 'E', 'F']
        data: xAxisData
      }
    ],

    yAxis: [
      {
        type: 'value',
        min: 0,
        // max: 140,
        splitNumber: 4,
        splitLine: {
          show: true,
          lineStyle: {
            color: 'rgba(255,255,255,0.1)'
          }
        },
        axisLine: {
          show: false
        },
        axisLabel: {
          show: false,
          margin: 20,
          textStyle: {
            color: '#d1e6eb'
          }
        },
        axisTick: {
          show: false
        }
      }
    ],
    series: seriesList.map((item, index) => {
      return {
        name: item.name,
        type: 'line',
        smooth: true,
        showAllSymbol: true,
        symbol: 'circle',
        symbolSize: 15,
        lineStyle: {
          normal: {
            color: colorList[index] || defaultColor,
            shadowColor: 'rgba(0, 0, 0, .3)',
            shadowBlur: 0,
            shadowOffsetY: 5,
            shadowOffsetX: 5
          }
        },
        label: {
          show: true,
          position: 'top',
          textStyle: {
            color: colorList[index] || defaultColor
          }
        },
        itemStyle: {
          color: colorList[index] || defaultColor,
          borderColor: '#fff',
          borderWidth: 3,
          shadowColor: 'rgba(0, 0, 0, .3)',
          shadowBlur: 0,
          shadowOffsetY: 2,
          shadowOffsetX: 2
        },
        areaStyle: {
          normal: {
            color: new Echarts.graphic.LinearGradient(
              0,
              0,
              0,
              1,
              [
                {
                  offset: 0,
                  color: (colorList[index] || defaultColor) + '4d' // 30%
                },
                {
                  offset: 1,
                  color: (colorList[index] || defaultColor) + '00' // 0%
                }
              ],
              false
            ),
            shadowColor: (colorList[index] || defaultColor) + 'e6', // 90%
            shadowBlur: 20
          }
        },
        // data: [502.84, 205.97, 332.79, 281.55, 398.35, 214.02]
        data: item.data
      }
    })
  }
}
// 散点图
function scatterEcharts({ xAxisName = '', xAxisData = [], yAxisData = [], seriesList = [] }) {
  return {
    title: {
      show: !xAxisData.length && !yAxisData.length && !seriesList.length,
      text: '暂无数据',
      left: 'center',
      top: 'center',
      textStyle: {
        color: '#fff'
      }
    },
    tooltip: {
      position: 'top',
      formatter: function(params) {
        return (
          yAxisData[params.value[1]] +
          '<br />' +
          params.marker +
          xAxisData[params.value[0]] +
          ':' +
          params.value[2]
        )
      }
    },
    legend: {
      show: false,
      left: 'center'
    },
    xAxis: {
      name: xAxisName,
      nameLocation: 'center',
      nameGap: 30,
      type: 'category',
      boundaryGap: false,
      splitLine: {
        show: false
      },
      axisLine: {
        show: false
      },
      // data: ['2012', '2013', '2014', '2015', '2016', '2017', '2018', '2019', '2020', '2021'],
      data: xAxisData
    },
    yAxis: {
      name: '',
      nameLocation: 'center',
      nameGap: 50,
      type: 'category',
      axisLabel: {
        margin: 20
      },
      splitLine: {
        show: true,
        lineStyle: {
          type: 'dashed'
        }
      },
      axisLine: {
        show: false
      },
      // data: ['G06F', 'G06Q', 'G10L', 'G06K', 'H04L', 'G16H', 'G05B', 'G08C', 'H04N', 'H04M'],
      data: yAxisData
    },

    series: seriesList.map((item) => {
      return {
        name: item.name,
        type: 'scatter',
        symbolSize: (val) => {
          return val[2] % 40
        },
        animationDelay: (idx) => {
          return idx * 5
        },
        // data: [
        //   [0, 0, 444],
        //   [1, 0, 699],
        //   [2, 0, 951],
        //   [3, 0, 1126],
        //   [4, 0, 1347],
        //   [5, 0, 1993],
        //   [6, 0, 3096],
        //   [7, 0, 5196],
        //   [8, 0, 1750],
        //   [9, 0, 222]
        // ],
        data: item.data
      }
    })
  }
}

数据处理后页面展示

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/642790.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI多模态「六边形战士」,原创音乐、1分钟百页PPT、抖音爆款……

2024年AI行业最大的看点是什么&#xff1f; 那一定是多模态AI应用。 大模型发展到今天这个阶段&#xff0c;文本处理已经是各家大模型的必备技能了&#xff0c;对音频、视觉等多模态的理解和应用才是下一个阶段大模型比拼的赛道。 3.5研究测试&#xff1a;hujiaoai.cn 4研究测…

C++ 数据结构算法 学习笔记(32) -五大排序算法

C 数据结构算法 学习笔记(32) -五大排序算法 选择算法 如下若有多个女生的身高需要做排序: 常规思维: 第一步先找出所有候选美女中身高最高的&#xff0c;与最后一个数交换 第二步再找出除最后一位美女外其它美女中的最高者&#xff0c;与倒数第二个美女交换位置 再找出除最…

网创教程wordpress插件自动采集并发布

使用教程 出现404的请搞定自己网站的伪静态。一般都是伪静态问题。 需要定制可以联系我。 本次更新主要更新了。界面的设置。用户可以直接设置文章的分类。 设置文章发布的金额。 使插件更加的人性化。优化了采集更新发布的代码。 更新了网站的界面。 主要功能&#xff1a; w…

创建FreeRTOS工程

创建STM32CubeMX工程 配置时钟 配置FreeRTOS 生成Keil MDK的工程 打开工程 结尾 这就是我们用STM32CubeMX创建的最基本的一个FreeRTOS的工程。可以看到&#xff0c;这个与我们使用stm32开发的裸机程序有相同的地方&#xff0c;也有不同的地方&#xff0c;我们可以发现&am…

【spring】@ControllerAdvice注解学习

ControllerAdvice介绍 ControllerAdvice 是 Spring 框架提供的一个注解&#xff0c;用于定义一个全局的异常处理类或者说是控制器增强类&#xff08;controller advice class&#xff09;。这个特性特别适用于那些你想应用于整个应用程序中多个控制器的共有行为&#xff0c;比…

基于Matlab深度学习的语义分割

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 在计算机视觉和图像分析领域&#xff0c;语义分割是一项关键技术&#xff0c;它致力于理解图像…

Spring的FactoryBean多例问题

关于spring bean&#xff0c;我们了解的最多的还是单例&#xff0c;而多例bean,除了平时我们自己new的那些多实例外&#xff08;但不属于IOC管理了&#xff09;&#xff0c;几乎很少能用到&#xff0c;而在spring 层面&#xff0c;FactoryBean刚好是多例的一个体现&#xff0c;…

45岁前TVB有型熟男生图流出

凭无线处境剧《爱回家》中饰演律师「严谨」一角成功入屋的张达伦&#xff0c;于2022年约满无线离巢后&#xff0c;正式「卖身」给杜琪峰成为旗下艺人&#xff0c;先后亮相ViuTV剧集及综艺节目&#xff0c;又参与电影演出&#xff0c;作多方面尝试和发展。 日前有网民食完糖水在…

全局平均池化笔记

全局平均池化&#xff08;Global Average Pooling, GAP&#xff09;是一种用于卷积神经网络&#xff08;CNN&#xff09;中的池化操作&#xff0c;其主要作用和优点包括&#xff1a; 减少参数数量&#xff1a;全局平均池化层将每个特征图通过取其所有元素的平均值&#xff0c;压…

STM32 学习——2. PWM

这个项目将会不断改变pwm占空比&#xff0c;使用proteus示波器进行观察。 1. proteus8.15 原理图 2. cubemx 上图是配置外部晶振 上图配置在proteus中没啥作用&#xff0c;注意&#xff1a; 在实际开发板中&#xff0c;一定要配置它&#xff0c;不然下一次你写不进代码。 上图配…

基于51单片机的多功能万年历温度计—可显示农历

基于51单片机的万年历温度计 &#xff08;仿真&#xff0b;程序&#xff0b;原理图&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 本设计基于STC89C52&#xff08;与AT89S52、AT89C52通用&#xff0c;可任选&#xff09;单片机以及DS1302时钟芯片、DS18B…

Python 实现批量文件重命名工具

在现代软件开发中&#xff0c;图形用户界面 (GUI) 工具的创建是一个常见需求。对于那些需要频繁处理文件的任务&#xff0c;拥有一个简便的 GUI 工具尤为重要。在这篇博客中&#xff0c;我们将介绍如何使用 wxPython 创建一个简单的批量文件重命名工具。该工具可以选择一个文件…

会声会影调速怎么用 会声会影如何调整音频速度

会声会影是一款功能强大的视频编辑软件&#xff0c;可以帮助我们轻松的实现剪辑。 会声会影的操作简单易懂&#xff0c;界面简洁明快。适合家庭使用&#xff0c; 我们使用会声会影可以在家就能将视频剪辑成好莱坞大片。但是在使用的过程中&#xff0c;仍然会遇到一些操作上的问…

【Windows系统】解决Intel 6代CPU安装win7系统过程中无法操作键盘鼠标的问题

问题 微软表示&#xff0c;从 2016 年 7 月 17 日起&#xff0c;新的 Intel、AMD 和Qualcomm 处理器将仅支持 Windows 10&#xff0c;不再支持 Windows 7 和 8.1。因此&#xff0c;Intel 6代以后的CPU因为没有USB驱动无法完成win7系统的安装。 下文核心思想是通过老毛桃PE系统…

基于地理坐标的高阶几何编辑工具算法(2)——相交面裁剪

文章目录 工具步骤应用场景算法输入算法输出算法示意图算法原理后处理 工具步骤 选中一个需要裁剪的面&#xff0c;点击“相交面裁剪”工具&#xff0c;多选裁剪模板面&#xff0c;空格执行。 应用场景 常用于基于遥感影像的建筑物几何面编辑。 算法输入 一个待裁剪的面&a…

如何找到docker的run(启动命令)

使用python三方库进行 需要安装python解释器 安装runlike安装包 pip3 install runlike 运行命令 runlike -p <container_name> # 后面可以是容器名和容器id&#xff0c;-p参数是显示自动换行实验 使用docker启动一个jenkins 启动命令为 docker run -d \ -p 9002:80…

【数据结构与算法篇】二叉树链式结构及实现

【数据结构与算法篇】二叉树链式结构及实现 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 4. 二叉树链式结构的实现 4.1 前置说明 4.2 二叉树的遍历 4.2.1 前序、中序以及…

【大模型】Spring AI对接ChatGpt使用详解

目录 一、前言 二、spring ai介绍 2.1 什么是Spring AI 2.2 Spring AI 特点 2.3 Spring AI 为开发带来的便利 2.4 Spring AI应用领域 2.4.1 聊天模型 2.4.2 文本到图像模型 2.4.3 音频转文本 2.4.4 嵌入大模型使用 2.4.5 矢量数据库支持 2.4.6 用于数据工程ETL框架 …

云动态摘要 2024-05-24

给您带来云厂商的最新动态&#xff0c;最新产品资讯和最新优惠更新。 最新优惠与活动 [免费试用]大模型知识引擎体验招募 腾讯云 2024-05-21 大模型知识引擎产品全新上线&#xff0c;为回馈新老客户&#xff0c;50万token免费送&#xff0c;开通服务即领取&#xff01; 云服…

蓝桥杯杨辉三角

PREV-282 杨辉三角形【第十二届】【蓝桥杯省赛】【B组】 &#xff08;二分查找 递推&#xff09;&#xff1a; 解析&#xff1a; 1.杨辉三角具有对称性&#xff1a; 2.杨辉三角具有一定规律 通过观察发现&#xff0c;第一次出现的地方一定在左部靠右的位置&#xff0c;所以从…