一些ECharts配置

news2024/11/16 17:45:40

基于vue3,EChart5.4.3版本

Line

<script setup lang="ts">
import {onBeforeUnmount, onMounted, ref, watch} from "vue"
import {useEcharts, type ECOption} from "@/composables"
import * as echarts from "echarts/core";

const chartOptions = ref<ECOption>();
const {domRef: chart} = useEcharts(chartOptions);

const props = defineProps({
  chartXData: {
    type: Array,
    default: []
  },
  chartYData: {
    type: Array,
    default: []
  },
  seriesData: {
    type: Array,
    default: []
  },
  seriesNameList: {
    type: Array,
    default: []
  },
  yName: {
    type: String,
    default: ''
  },
  lineColorList: {
    type: Array,
    default: ['rgba(1, 145, 219, 1)', 'rgba(9, 162, 51, 1)', 'rgba(191, 153, 18, 1)']
  },
  isAreaStyle: {
    type: Boolean,
    default: false
  },
  areaColorStyle: {
    type: Array,
    default: [new echarts.graphic.LinearGradient(0, 0, 0, 1, [
      {
        offset: 0,
        color: 'rgba(3, 200, 242, 0.64)',
      },
      {
        offset: 1,
        color: 'rgba(3, 200, 242, 0)',
      },
    ]), new echarts.graphic.LinearGradient(0, 0, 0, 1, [
      {
        offset: 0,
        color: 'rgba(4, 148, 44, 0.16)',
      },
      {
        offset: 1,
        color: 'rgba(4, 148, 44, 0)',
      },
    ]), new echarts.graphic.LinearGradient(0, 0, 0, 1, [
      {
        offset: 0,
        color: '#BF9912AB',
      },
      {
        offset: 1,
        color: '#BF991200',
      },
    ])]
  },
  stack: {
    type: String,
    default: ''
  },
  isSmooth: {
    type: Boolean,
    default: false
  },
  symbol: {
    type: String,
    default: ''
  },
  title: {
    type: String,
    default: ''
  },
  topGrid: {
    type: String,
    default: '25'
  },
})

const watcher = watch(()=> props.seriesData, (value: any) => {
  chartOptions.value.series = getSeriesData(value)
})

const watcherTitle = watch(()=> props.title, (value: any) => {
  chartOptions.value.title['text'] = value
})

const watcherXData = watch(()=> props.chartXData, (value: any) => {
  chartOptions.value.xAxis.data = value
})

onBeforeUnmount(() => {
  watcher();
  watcherTitle();
  watcherXData();
})

const getChartData = () => {
  updateChartOptions();
}

const updateChartOptions = () => {
  chartOptions.value = {
    title: {
      text: props.title,
      left: 0,
      top: 5,
      textStyle: {
        fontSize: 16,
      },
    },
    backgroundColor: 'white',
    tooltip: {
      trigger: 'axis',
      color: '#fff', // 设置文字颜色为白色
      backgroundColor: 'rgba(16,24,41)', // 设置背景颜色为黑色,透明度为0.7
      borderColor: 'rgba(16,24,41)', // 设置边框颜色为白色
      borderWidth: 1, // 设置边框宽度为1px
    },
    legend: {
      left: 'right',
      top: 10,
      itemWidth: 8,
      itemHeight: 8,
      itemGap: 16,
      borderRadius: 4,
      color: 'rgba(202,231,254,0.5)',
      fontSize: 10,
    },
    xAxis: {
      type: 'category',
      data: props.chartXData,
      boundaryGap: false,
      axisLine: {
        show: false,
      },
      axisTick: {
        show: false,
      },
      axisLabel: {
        interval: 1,
        show: true,
        color: 'rgba(202,231,254,0.5)', //X轴文字颜色
      },
    },
    yAxis: [
      {
        type: 'value',
        nameTextStyle: {
          color: '#CAE7FE80',
          // fontFamily: 'Alibaba PuHuiTi',
          fontSize: 10,
          fontWeight: 600,
          // padding: [0, 0, 0, 40], // 四个数字分别为上右下左与原位置距离
        },
        nameGap: 10, // 表现为上下位置
        axisLine: {
          show: false,
        },
        axisTick: {
          show: false,
        },
        axisLabel: {
          color: 'rgba(202,231,254,0.5)',
          fontSize: 10,
          // interval: 2, // 设置为0表示每隔一个显示一个标签
        },
        splitLine: {
          show: true,
          lineStyle: {
            color: 'rgba(147,219,209,0.16)',
          },
        },
      },
      {
        type: 'value',
        // name: '金额:万元',
        nameTextStyle: {
          color: 'rgba(202,231,254,0.5)',
          fontFamily: 'Alibaba PuHuiTi',
          fontSize: 10,
          fontWeight: 600,
          // padding: [0, 0, 0, 40], // 四个数字分别为上右下左与原位置距离
        },
        position: 'right',
        splitLine: {
          show: false,
        },
        axisTick: {
          show: false,
        },
        axisLine: {
          show: false,
        },
        axisLabel: {
          show: true,
          formatter: '{value}', //右侧Y轴文字显示
          textStyle: {
            color: 'rgba(202,231,254,0.5)',
          },
        },
      },
    ],

    series: getSeriesData(props.seriesData),
    grid:{ // 让图表占满容器
      top:"50px",
      left:"20px",
      right:"50px",
      bottom:"0px",
      containLabel: true,
    }

  };
}

const getSeriesData = (seriesData: any) => {
  const length = props.seriesNameList?.length
  let seriesArray = []
  for (let i = 0; i < length; i++) {
    seriesArray.push({
      name: props.seriesNameList?.[i],
      type: 'line',
      showAllSymbol: true, //显示所有图形。
      // stack: props.stack,//stack1
      smooth: props.isSmooth,
      areaStyle: {
        // 设置堆叠效果的颜色和透明度
        color: props.areaColorStyle?.[i],
      },
      symbol: props.symbol, //标记的图形为实心圆 rect
      symbolSize: 4, //标记的大小
      lineStyle: {
        color: props.lineColorList?.[i],
      },
      itemStyle: {
        color: props.lineColorList?.[i]
      },
      data: seriesData?.[i],
    })
  }
  return seriesArray

}

onMounted(() => {
  getChartData();
})

</script>

<template>
  <div class="wh-full" ref="chart"></div>
</template>

<style scoped>

</style>

Bar

<script setup lang="ts">
import {onMounted, ref,onBeforeUnmount,watch} from "vue"
import {useEcharts, type ECOption} from "@/composables"
import * as echarts from "echarts/core";

const chartOptions = ref<ECOption>();
const {domRef: chart} = useEcharts(chartOptions);

const props = defineProps({
  chartXData: {
    type: Array,
    default: []
  },
  chartYData: {
    type: Array,
    default: []
  },
  seriesData: {
    type: Array,
    default: []
  },
  seriesNameList: {
    type: Array,
    default: []
  },
  yName: {
    type: String,
    default: ''
  },
  barWidth: {
    type: String,
    default: '16'
  },
  title: {
    type: String,
    default: ''
  },
  topGrid: {
    type: String,
    default: '40px'
  },
  lineColorList: {
    type: Array,
    default: ['rgba(1, 145, 219, 1)', 'rgba(191, 153, 18, 1)', 'rgba(9, 162, 51, 1)']
  },
  areaColorStyle: {
    type: Array,
    default: [new echarts.graphic.LinearGradient(0, 0, 1, 1, [
      {
        offset: 0,
        color: '#3A65F7FF',
      },
      {
        offset: 1,
        color: '#20C2F0FF',
      },
    ]), new echarts.graphic.LinearGradient(0, 0, 0, 1, [
      {
        offset: 0,
        color: '#BF9912AB',
      },
      {
        offset: 1,
        color: '#BF991200',
      },
    ]), new echarts.graphic.LinearGradient(0, 0, 0, 1, [
      {
        offset: 0,
        color: '#03C8F200',
      },
      {
        offset: 1,
        color: 'rgba(4, 148, 44, 0)',
      },
    ])]
  },
})

const watcher = watch(()=> props.seriesData, (value: any) => {
  chartOptions.value.series[0].data = value
})

const watcherXData = watch(()=> props.chartXData, (value: any) => {
  chartOptions.value.yAxis[0].data = value
})

onBeforeUnmount(() => {
  watcher();
  watcherXData();
})

const getChartData = () => {
  updateChartOptions();
}

const updateChartOptions = () => {
  chartOptions.value = {
    backgroundColor: '#FFFFFF',
    title: {
      text: props.title,
      left: 16,
      top: 10,
      textStyle: {
        fontSize: 16,
      }
    },
    tooltip: {
      trigger: 'axis',
      axisPointer: {
        // 坐标轴指示器,坐标轴触发有效
        type: 'shadow', // 默认为直线,可选为:'line' | 'shadow'
      },
      confine: true,
      textStyle: {
        color: '#fff', // 设置文字颜色为白色
      },
      backgroundColor: 'rgba(16,24,41)', // 设置背景颜色为黑色,透明度为0.7
      borderColor: 'rgba(16,24,41)', // 设置边框颜色为白色
      borderWidth: 1, // 设置边框宽度为1px
    },
    legend: {
      left: 'right',
      top: 20,
      textStyle: {
        color: '#FFFFFFE6',
        fontSize: 14,
      },
      itemWidth: 10,
      itemHeight: 10,
      itemGap: 15,
    },
    xAxis: {
      type: 'value',
      axisLine: {
        show: true,
        lineStyle: {
          color: '#FFFFFF4D',
        },
      },
      axisTick: {
        show: false,
      },
    },
    yAxis: [
      {
        type: 'category',
        data: props.chartXData,
        nameTextStyle: {
          color: '#FFFFFF4D',
          fontFamily: 'Alibaba PuHuiTi',
          fontSize: 14,
          fontWeight: 600,
          // padding: [0, 0, 0, 40], // 四个数字分别为上右下左与原位置距离
        },
        nameGap: 10, // 表现为上下位置
        axisLine: {
          show: true,
          lineStyle: {
            color: '#FFFFFF4D',
          },
        },
        axisTick: {
          show: false,
        },
        axisLabel: {
          color: '#FFFFFFE6',
          fontSize: 14,
        },
        splitLine: {
          show: false,
          lineStyle: {
            color: 'rgba(147,219,209,0.16)',
          },
        },
      },
    ],
    series: [
      {
        type: 'bar',
        data: props.seriesData,
        barWidth: `${props.barWidth}rem`,
        itemStyle: {
          // 设置堆叠效果的颜色和透明度
          color: props.areaColorStyle?.[0],
        },
        lineStyle: {
          color: props.lineColorList?.[0],
        },
        showBackground: true,
        backgroundStyle: {
          color: '#20C2F01A'
        }
      },

    ],
    grid: { // 让图表占满容器
      top: `${props.topGrid}px`,
      left: "16px",
      right: "30px",
      bottom: "24px",
      containLabel: true,
    }
  };
}

const getSeriesData = () => {
  const length = props.seriesNameList?.length
  let seriesArray = []
  for (let i = 0; i < length; i++) {
    seriesArray.push({
      name: props.seriesNameList?.[i],
      type: 'bar',
      barWidth: `${props.barWidth}rem`,
      itemStyle: {
        // 设置堆叠效果的颜色和透明度
        color: props.areaColorStyle?.[i],
      },
      lineStyle: {
        color: props.lineColorList?.[i],
      },
      data: props.seriesData?.[i],//props.seriesData?.[i]
    })
  }
  return seriesArray
}

onMounted(() => {
  getChartData();
})


</script>

<template>
  <div class="wh-full" ref="chart"></div>
</template>

<style scoped>

</style>

Pie

<script setup lang="ts">
import {onMounted, ref,onBeforeUnmount,watch} from "vue"
import {useEcharts, type ECOption} from "@/composables"
import * as echarts from "echarts/core";

const chartOptions = ref<ECOption>();
const {domRef: chart} = useEcharts(chartOptions);

const props = defineProps({
  percentData: {
    type: Number,
    default: 0
  },
})

const watcher = watch(()=> props.percentData, (value: any) => {
  chartOptions.value.series[1].data[1].value = value
  chartOptions.value.series[1].data[0].value = 100 - value
})

onBeforeUnmount(() => {
  watcher();
})

const getChartData = () => {
  updateChartOptions();
}

const updateChartOptions = () => {
  chartOptions.value = {
    tooltip: {
      show: 'false',
    },
    series: [
      {
        type: 'pie',
        radius: ['65%', '71%'],
        tooltip: {
          show: false // 禁用该 pie 的悬浮提示
        },
        avoidLabelOverlap: false,
        label: {
          show: false,
        },
        emphasis: {
          disabled: false,
          scale: false,

        },
        color: ['#0e2a4dFF'],
        data: [
          { value: 100},
        ]
      },
      {
        type: 'pie',
        radius: ['71%', '86%'],
        tooltip: {
          show: false // 禁用该 pie 的悬浮提示
        },
        avoidLabelOverlap: false,
        label: {
          show: false,
        },
        emphasis: {
          disabled: false,

        },
        itemStyle: {
          borderColor: '#0F0F11FF',
          borderWidth: 1
        },
        color: ['#257B4FFF','#C8676DFF'],//C8676DFF
        data: [
          { value: 100 - props.percentData , name:'1'},
          { value: props.percentData, name:'2' },
        ]
      },
      {
        type: 'pie',
        radius: ['86%', '100%'],
        tooltip: {
          show: false // 禁用该 pie 的悬浮提示
        },
        avoidLabelOverlap: false,
        label: {
          show: false,
        },
        emphasis: {
          disabled: false,
          scale: false,
        },
        color: ['#0e2a4eFF',],
        data: [
          { value: 100},
        ]
      }
    ],

  };
}

onMounted(() => {
  getChartData();
})

</script>

<template>
  <div class="wh-full" ref="chart"></div>
</template>

<style scoped>

</style>

使用

<template>
  <Line
      class="w-[calc(100%-30px)] h-[calc(100%-40px)] ml-15"
      :chartXData="chartXLineData"
      :seriesData="seriesLineData"
      :seriesNameList="seriesNameList"
      stack="stack1"
      symbol="rect"
      :title="`服务访问总数 ${titleData}`"
      top-grid="50"
      :isSmooth="true"
  ></Line>
</template>

<script lang="ts" setup>
import {onMounted, ref} from "vue"
import Line from '../Line.vue'

onMounted(() => {
  init();
})

const chartXLineData = ref([])
const seriesNameList = ref(["", '', ''])
const seriesLineData = ref<number[]>([])
const lineColorList = ["rgba(1, 145, 219, 1)", 'rgba(9, 162, 51, 1)', "rgba(191, 153, 18, 1)"]
const seriesList = []

</script>
<style lang="scss" scoped>

</style>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

API网关与社保模块

API网关与社保模块 理解zuul网关的作用完成zuul网关的搭建 实现社保模块的代码开发 zuul网关 在学习完前面的知识后&#xff0c;微服务架构已经初具雏形。但还有一些问题&#xff1a;不同的微服务一般会有不同的网 络地址&#xff0c;客户端在访问这些微服务时必须记住几十甚至…

​iOS上架App Store的全攻略

第一步&#xff1a;申请开发者账号 在开始将应用上架到App Store之前&#xff0c;你需要申请一个开发者账号。 1.1 打开苹果开发者中心网站&#xff1a;Apple Developer 1.2 使用Apple ID和密码登录&#xff08;如果没有账号则需要注册&#xff09;&#xff0c;要确保使用与公…

【Unity3D编辑器拓展】Unity3D的IMGUI、GUI、GUILayout、EditorGUI、EditorGUILayout、OnGUI【全面总结】

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 在开发中&#xff0c;常常会遇到要使用OnGUI的地方。 也会遇到…

4090今天被下架了

刚看了一下基本知识&#xff0c;我来给他们简单普及一下它。 4090网吧还有Ai公司都很常用&#xff0c;比如我们公司就用他来训练数字人。 4090经测试&#xff0c;训练的速度是3060的8倍。也就是说&#xff0c;我训练一个数字人要1天&#xff0c;但是3060需要8天。这个成本显而…

统计学习方法 感知机

文章目录 统计学习方法 感知机模型定义学习策略学习算法原始算法对偶算法 学习算法的收敛性 统计学习方法 感知机 读李航的《统计机器学习》时&#xff0c;关于感知机的笔记。 感知机&#xff08;perceptron&#xff09;是一种二元分类的线性分类模型&#xff0c;属于判别模型…

1024程序员节特辑 | OKR VS KPI谁更合适?

专栏集锦&#xff0c;赶紧收藏以备不时之需 Spring Cloud实战专栏&#xff1a;https://blog.csdn.net/superdangbo/category_9270827.html Python 实战专栏&#xff1a;https://blog.csdn.net/superdangbo/category_9271194.html Logback 详解专栏&#xff1a;https://blog.…

预测性维护为何能够帮助企业降低设备维护成本?

预测性维护在企业设备管理中扮演着重要的角色&#xff0c;它通过实时监测设备状态和数据分析&#xff0c;能够提前预测潜在故障&#xff0c;并采取相应的维修措施&#xff0c;从而帮助企业降低设备维护成本。本文将介绍预测性维护的作用&#xff0c;探讨造成设备维护成本高的原…

板带纠偏控制系统伺服比例阀放大器

板带纠偏控制系统是集光、机、电、液四方面有机结合在一起的全闭环电液伺服系统&#xff0c;是用途广泛的机电一体化高新技术产品。 板带纠偏控制系统可广泛地应用于机械、冶金、造纸、橡胶、织带、纺织印染、电镀、塑膜胶片等诸多行业的不同种类的带材生产线的在线纠偏。 板…

UE5 ChaosVehicles载具换皮 (连载二)

1.导出SKM_SportsCar&#xff0c;删除模型&#xff0c;保留骨骼层级 2.导入新的汽车模型并合并成一个整体模型&#xff0c;调整上图红框中的四个快乐轮子对应的骨骼位置&#xff08;大致在快乐轮子的中心&#xff09;&#xff0c;骨骼角度归零。绑定并设置权重&#xff0c;快乐…

多线程进阶篇

多线程进阶篇 文章目录 多线程进阶篇1、常见的锁策略1) 乐观锁 vs 悲观锁2) 重量级锁 vs 轻量级锁3) 自旋锁 vs 挂起等待锁4) 读写锁 vs 互斥锁5) 公平锁 vs 非公平锁6) 可重入锁 vs 不可重入锁 2、死锁1) 死锁的三种典型情况:2) 如何解决死锁问题3) 死锁产生的必要条件 3、Syn…

数据结构:一篇拿捏十大排序(超详细版)

排序的概念&#xff1a; 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录&#xff0c;若经…

浅谈AI人体姿态识别技术的先进性及安防视频监控应用场景

随着计算机视觉技术和安防监控技术的不断发展&#xff0c;基于AI算法的人体姿态识别技术也得到了广泛的应用。然而&#xff0c;传统的安防监控系统通常只局限于简单的视频监控等功能&#xff0c;无法准确地识别人体的姿态&#xff0c;使得一些安防监控存在着一定的漏洞和不足之…

中国人民大学与加拿大女王大学金融硕士项目——开启全球金融视野,锻造未来领袖

你是否曾梦想过站在国际金融的巅峰&#xff0c;洞察全球经济的脉搏&#xff0c;引领企业的创新与发展&#xff1f;如果你对金融充满热情&#xff0c;渴望在全球化的环境中锻炼自己&#xff0c;那么&#xff0c;中国人民大学与加拿大女王大学金融硕士项目便是你的转折点。 中国…

Confluence使用教程

1、如何创建空间 可以把空间理解成一个gitlab仓库&#xff0c;空间之间相互独立&#xff0c;一般建议按照部门&#xff08;小组的人太少&#xff0c;没必要创建空间&#xff09;或者按照项目分别创建空 2、confluence可以创建两种类型的文档&#xff1a;页面和博文 从内容上来…

SICP-- 元语言抽象--Scheme的变形--惰性求值

正则序和应用序 应用序&#xff1a;在过程应用时&#xff0c;提供给Scheme的所有参数都需要完成求值 正则序&#xff1a;将把对过程参数的求值延后到需要这些实际参数的值的时候。 将过程参数的求值拖延到最后的可能时刻被称为 惰性求值 如果在某个参数还没有完成求值之前就…

Apache Jmeter测压工具快速入门

Jmeter测压工具快速入门 一、Jmeter介绍二、Jmeter On Mac2.1 下载2.2 安装2.2.1 环境配置2.2.2 初始化设置 2.3 测试2.3.1 创建JDBC Connection Configuration2.3.2 创建线程组2.3.3 创建JDBC Request2.3.4 创建结果监控2.3.4 运行结果 2.4 问题记录2.4.1 VM option UseG1GC异…

查询企业信息的四种方法

在工作中或者对于找工作的求职人来说&#xff0c;怎么查看企业的信息呢&#xff1f;可能很多人会想到各种查查类软件&#xff0c;但是这类软件需要会员或者付费才能查看&#xff0c;对于没有会员的人来说&#xff0c;有没有其他查询企业的方法呢&#xff1f;答案肯定是有的&…

AI也可以​算命和占卜?一定要试试这个模型

01 模型介绍 Mistral Trismegistus 7B&#xff1a;专为玄学、神秘学、超自然和灵异感兴趣的人设计的模型。 专门用于处理与神秘学、灵性、超自然、占卜、炼金术、宗教、冥想等相关的问题和任务。该数据集包含大约35000个指令响应对&#xff0c;覆盖了数百个与神秘学有关的子…

安装visual studio报错“无法安装msodbcsql“

在安装visual studio2022时安装完成后提示无法安装msodbcsql, 查看日志文件详细信息提示&#xff1a;指定账户已存在。 未能安装包“msodbcsql,version17.2.30929.1,chipx64,languagezh-CN”。 搜索 URL https://aka.ms/VSSetupErrorReports?qPackageIdmsodbcsql;PackageActi…

[ Windows ] ping IP + Port 测试 ip 和 端口是否通畅

开发过程中经常会黑窗口中手动测试一下计划请求的目标ip和端口是否通畅&#xff0c;测试方式如下&#xff1a; 一、单纯测试ip是否能够 ping 通&#xff0c;这个比较熟悉了&#xff0c;运行 cmd 打开黑窗口 输入如下指令&#xff0c;能够如下提示信息&#xff0c;表示端口是通…