echarts优秀使用案例

news2025/8/8 23:15:39

echarts优秀使用案例

在这里插入图片描述
在这里插入图片描述

App.vue

<template>
    <div class="box">
        <a-card size="small" title="各类型监测设备利用率" class="center">
            <!-- color 值由组件外部进行传递(会重复修改的部分尽量减少逻辑复杂程度) -->
            <!-- type 值直接传输汉字(没有必要进行判断) -->
            <SmallChartVue :data="store.EquUseRatio" type="利用率" :color="['#66a6ff', '#89f7fe']" />
        </a-card>
    </div>
    <div class="box">
        <a-card size="small" title="各类型监测站在线率" class="center">
            <SmallChartVue :data="store.StationOnlineRatio" type="在线率" :color="['#84fab0', '#8fd3f4']" />
        </a-card>
    </div>
</template>
<script setup>
import SmallChartVue from './SmallChart.vue';
import { onUnmounted } from 'vue';
import { UseRateStore } from './store.js'
const store = UseRateStore();

// 初始化数据加载及获取
store.initData();


// 实时循环刷新数据
var Timer = setInterval(() => {
    store.initData();
}, 2000);

// 注销时,清除循环
onUnmounted(() => {
    clearInterval(Timer);
});
</script>
<style scoped>
.box {
    width: 310px;
    height: 175px;
    margin-bottom: 15px;
}

:deep(.ant-card) {
    background: #191a23;
}

:deep(.ant-card-head-title) {
    color: #fff;
    /* 标题内边距 */
    padding: 12px 0 !important;
    /* 字间距 */
    letter-spacing: 2px;
}

:deep(.ant-card) {
    border: 1px solid rgba(255, 255, 255, 0.1)
}

:deep(.ant-card-body) {
    height: 130px;
    padding: 5px;
}

:deep(.params-name) {
    text-align: left;
    color: rgba(255, 255, 255, 0.5);
}

:deep(.params-value) {
    text-align: right;
    color: #18be6b;
}

:deep(.w-100) {
    width: 100px;
}
</style>

SmallChart.vue

<template>
    <div ref="SmallDar" class="wh-100"></div>
</template>
<script setup>
import { ref, onMounted, onUnmounted, watch } from 'vue';
import chart from './SmallChart.js'

var _chart = null;

const props = defineProps({
    data: Object,
    type: String,
    color: Array,
})
const SmallDar = ref();

// 格式化数据方法
const buildChart = (res) => {
    // 哪怕 res.length 值为 0 ,只会不渲染数据,并不会阻止程序运行
    // 深拷贝位置更改
    let data = JSON.parse(JSON.stringify(res));
    var xAxisData = [];
    var SeriesData = [];
    for (var i = 0; i < data.length; i++) {
        xAxisData.push(data[i].name)
        SeriesData.push(data[i].value)
    }
    _chart.setData(xAxisData, SeriesData);
}

// 监听数据变化
watch(() => props.data, (res) => {
    buildChart(res);
})

// 初始化图表
onMounted(() => {
    _chart = new chart(SmallDar.value, {
        Grid: {
            top: 15,
            left: 30,
            right: 8,
            bottom: 25
        },
        type: props.type,
        Color: props.color,
    });
    buildChart(props.data);
})

// 组件注销时,删除图表
onUnmounted(() => {
    _chart.destroy()
})

</script>
<style scoped>
.wh-100 {
    width: 100%;
    height: 100%;
}
</style>

SmallChart.js

import * as echarts from 'echarts'

class BarEchart {
    constructor(view, option) {
        this.chart = echarts.init(view, 'dark');
        this.color = option.Color;
        this.grid = option.Grid;
        // type 值由外部传递
        this.type = option.type || '';
        // 给最大值最小值一个默认值
        this.MAX = option.MAX || 100;
        this.MIN = option.MIN || 0;
    }
    setData(xAxisData, SeriesData) {
        // 删除了 UI 中用不到的 Echart 配置项
        var option = {
            backgroundColor: '#191a23',
            tooltip: {
                trigger: 'axis',
                backgroundColor: "#191a23",
                borderColor: "rgba(255, 255, 255, 0.1)",
                axisPointer: {
                    type: 'shadow'
                },
                formatter: (params) => {
                    // 使用模板语法,看起来更好看一些
                    // 使他对其到左侧,为了实际输出代码时,减少左侧的字符串(其实没啥用)
                    return `
${params[0].name}<br/>
<div class="ant-row w-100">
    <div class="ant-col ant-col-12 params-name">${this.type}</div> 
    <div class="ant-col ant-col-12 params-value">${params[0].value}%</div>
</div>`;
                }
            },
            grid: this.grid,
            xAxis: {
                type: 'category',
                axisLine: {
                    show: true,
                    lineStyle: {
                        // 此处颜色改为实色,挡住最后一个分割中的虚线
                        color: 'rgba(80, 80, 80)',
                    },
                },
                axisTick: {
                    show: false
                },
                axisLabel: {
                    padding: [3, 0, 0, 0],
                    color: 'rgba(255, 255, 255, 0.5)',
                    // 修改文字大小
                    fontSize: 12,
                    // 强制显示X轴所有标签
                    interval: 0
                },
                data: xAxisData,
            },
            yAxis: {
                type: 'value',
                min: this.MIN,
                max: this.MAX,
                // 设置分割间隔
                interval: 25,
                axisLabel: {
                    show: true,
                    // 修改文字大小
                    fontSize: 11,
                    color: 'rgba(255, 255, 255, 0.5)'
                },
                splitLine: {
                    show: true,
                    // 虚线
                    lineStyle: {
                        type: [2, 1],
                    }
                },
            },
            series: [{
                name: '排名',
                type: 'bar',
                // 修改柱状条宽度
                barWidth: '35%',
                data: SeriesData,
                itemStyle: {
                    color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
                        { offset: 0, color: this.color[0] },
                        { offset: 1, color: this.color[1] },
                    ])
                },
            }]
        };
        this.chart.setOption(option);
    }
    destroy() {
        // 修改了 注销方法
        this.chart.dispose();
    }
}
export default BarEchart

TestData.js

// 测试数据生成方法
// 用于接口伪装
const random = (min, max) => min + Math.floor(Math.random() * (max - min + 1))
let renderFunction = (label) => {
    var total = random(0, 100);
    var online = random(0, total);
    var working = random(0, online);
    return {
        label: label,
        total: total,
        online: online,
        working: working
    }
}
let LabelArray = ["一类", "二类", "三类", "四类", "监测", "船载", "便携", "传感器"];

const install = () => {
    // 数据由同步获取改为异步获取
    return new Promise((resolve, reject) => {
        let res = [];
        LabelArray.forEach(item => {
            res.push(renderFunction(item))
        });
        // 给数组一个随机函数,用来打乱数组顺序(给自己增加难度)
        res.sort((a, b) => Math.random() > 0.5 ? 1 : -1)
        resolve(res);
    });
}

export default install;

store.js

import { defineStore } from 'pinia'
import TestData from './TestData.js';

// 格式化数据方法
const Formatter = (_arr, callback) => {
    // 使用Array.prototype.map()方法生成新数组,可以省略创建数组的一步。
    // 如果严格要求效率的情况下,仍然建议使用For循环
    return _arr.map(item => {
        return {
            name: item.label,
            // 因为是计算属性,在不计较 ∞ 时,直接判断是否为真
            value: callback(item) || 0,
        }
    });
}

// 此处 store ID 是为了区分示例项目模块。请勿效仿
export const UseRateStore = defineStore('901_inspect', {
    state: () => {
        return {
            // 将两份数据分开进行存放,更贴合业务实际情况
            EquData: [],
            StationData: [],
        }
    },
    getters: {
        // 通过Getter 实时刷新数据
        EquUseRatio() {
            return Formatter(this.EquData, (stat) => {
                // 取两位小数并四舍五入(注,不用 Number.toFix(2) 方法的原因是这种方法会出现 20.00 的情况 )
                return Math.round(stat.working / stat.total * 10000) / 100;
            });
        },
        StationOnlineRatio() {
            return Formatter(this.StationData, (stat) => {
                return Math.round(stat.online / stat.total * 10000) / 100;
            });
        },
    },
    actions: {
        // 初始化数据方法,使数据可以实时刷新
        async initData() {
            // 假设数组返回值时乱序的,如何根据已有数据顺序排序返回值
            // Array 写在这个地方是为了方便大家寻找逻辑,实际情况请将 Array 对象放在全局中,防止重复创建 
            const LabelArray = ["一类", "二类", "三类", "四类", "监测", "船载", "便携", "传感器"];

            // 根据指定的 Key 值,在已经排序好的数组里面取 当前值的下标,
            // 下方为 indexOf 方法示例

            this.EquData = (await TestData()).sort((a, b) => {
                return LabelArray.indexOf(a.label) - LabelArray.indexOf(b.label)
            });


            // 如果 indexOf 的效率满足不了需求,还可以用 Mapping 结构提升效率查询值过程的效率
            // 注:Mapping 写在这个地方是为了方便大家寻找逻辑,实际情况请将 Mapping 对象放在全局中,防止重复创建 
            const LabelMapping = {
                "一类": 0,
                "二类": 1,
                "三类": 2,
                "四类": 3,
                "监测": 4,
                "船载": 5,
                "便携": 6,
                "传感器": 7
            }
            this.StationData = (await TestData()).sort((a, b) => {
                return LabelMapping[a.label] - LabelMapping[b.label]
            });;
        },
    }
});

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

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

相关文章

开源让这位 00 后逆袭成为各类大奖收割者

OpenI 启智社区在 2022 年推出的开源打榜活动&#xff0c;聚集了一帮非常活跃的开发者&#xff0c;上榜者覆盖了来自全国高校、科研机构、企业达 100 多家。其中&#xff0c;高校学生占 65%&#xff0c;近 60%的上榜者是 90 后&#xff0c;32%的上榜者是 00 后。真是 00 后浪推…

[hadoop全分布部署]虚拟机Hadoop集群交换 SSH 密钥与验证SSh无密码登录

&#x1f468;‍&#x1f393;&#x1f468;‍&#x1f393;博主&#xff1a;发量不足 个人简介&#xff1a;耐心&#xff0c;自信来源于你强大的思想和知识基础&#xff01;&#xff01; &#x1f4d1;&#x1f4d1;本期更新内容&#xff1a;虚拟机Hadoop集群交换 SSH 密钥与…

留学生怎么正确应对Paper写作?

留学生很多都是对Paper比较抗拒的&#xff0c;因为Paper写作的频率是很高的&#xff0c;平时的课程也是比较紧凑的。相信对于初到英国留学的小伙伴们而言Paper将很长时间都是大家的痛。多少留学生被Paper折磨&#xff0c;其实英文Paper写不好的原因在于&#xff0c;对于中国留学…

Neo4j 5的自治图数据库集群

原文作者&#xff1a;John Stegeman &#xff0c;图数据库产品专家&#xff0c;Neo4j。基于原文翻译并补充整理而成。 新近发布的Neo4j 版本5推出了自治集群&#xff08;Autonomous Cluster&#xff09;&#xff0c;以支持易于部署、可扩展、自容错等重要特性。下面我们就来一…

隐私计算推动金融转型

肖峰 开放隐私计算 开放隐私计算 开放隐私计算OpenMPC是国内第一个且影响力最大的隐私计算开放社区。社区秉承开放共享的精神&#xff0c;专注于隐私计算行业的研究与布道。社区致力于隐私计算技术的传播&#xff0c;愿成为中国 “隐私计算最后一公里的服务区”。 178篇原创…

Outside ExpertPDF HtmlToPdf 转换器 17.0

Outside Software Inc. 是一家罗马尼亚软件公司&#xff0c;旨在提供可靠、高质量的 IT 服务。该团队的成员在开发完整的 Web 应用程序、完全可伸缩的数据库解决方案、复杂的基于 Windows 的应用程序、出色的开发人员组件和工具方面拥有多年的经验。ExpertPDF HtmlToPdf 转换器…

【现代机器人学】学习笔记一:位形空间

由于工作的关系&#xff0c;一年前开始接触机械臂。与此同时也在学习【现代机器人学】与【机器人学导论】两本书&#xff0c;感觉【现代机器人学】写的更好一些。大致走马观花的看了一遍&#xff0c;确实有所收获。因此想再从头过一遍&#xff0c;做一些总结&#xff0c;写给自…

python下载安装教程

1、下载python 下载地址&#xff1a;https://www.python.org/&#xff0c;点击Downloads,选择对应电脑系统&#xff0c;进行下载。 &#xff08;文末送读者福利&#xff09; 2、安装python&#xff0c;以python3.10.7安装为例。 &#xff08;1&#xff09;双击安装包&#x…

数据获取 | 如何获取各地高质量的航拍图并生成等高线地形?

“ 做规划的基础资料少不了航拍图和地形图&#xff0c;但是实际操作中从甲方手上并不能拿到比较新的航拍图&#xff0c;至于地形图就只能看缘分了&#xff0c;那么&#xff0c;是否还有其他渠道可以获取到呢&#xff1f;” 先说结论&#xff0c;现在&#xff08;2018年6月&…

43、集合的第一大类:Set

一、基本介绍&#xff1a; 1、Set接口的特点&#xff1a; 1&#xff09;无序&#xff08;添加和取出的顺序不一致&#xff09; &#xff0c;没有索引 2&#xff09;不允许重复元素&#xff0c;所以最多包含一个null 3&#xff09; JDK API中Set接口的实现类有&#xff1a;…

闪电连接算法之Python实现

文章目录简介原理Python实现简介 LAPO&#xff0c;即闪电连接优化(Lightning Attachment Procedure Optimization)&#xff0c;听名字就知道是受到了闪电的刺激&#xff0c;而获得灵感的一种算法。 为了走进LAPO的内心&#xff0c;于是上网搜了一下闪电的图片 呃不好意思&…

网页设计期末作业,基于HTML+CSS+JavaScript超酷超炫的汽车类企业网站(6页)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

商用短链平台_第8章_ 账号微服务注册模块+短信验证码+阿里云OSS开发实战

商用短链平台_第8章_ 账号微服务注册模块短信验证码阿里云OSS开发实战 文章目录商用短链平台_第8章_ 账号微服务注册模块短信验证码阿里云OSS开发实战第八章 账号微服务注册模块短信验证码阿里云OSS开发实战第1集 账号微服务注册功能和流程介绍第2集 第三方短信验证码平台接入申…

1802907-97-6|Alkyne PEG5 甲基四嗪|炔基点击试剂

【中文名称】甲基四嗪-五聚乙二醇-炔&#xff0c;甲氨基-五聚乙二醇-炔基 【英文名称】 Methyltetrazine-PEG5-alkyne&#xff0c;Alkyne PEG5 Methyltetrazine 【结 构 式】 【CAS号】1802907-97-6 【分子式】C20H26N4O5 【分子量】402.45 【基团】炔基基团 【纯度】95% 【规…

数据分析案例-大数据相关招聘岗位可视化分析

数据集介绍 本次数据集来源于xx招聘网共计4223条招聘信息&#xff0c;每条招聘信息字段包括岗位名称、公司名称、工作经验要求、学历要求、工作地点、薪酬、公司规模、发布时间、公司福利共9条字段信息。 数据预处理 首先导入本次数据集&#xff0c; import pandas as pd da…

使用Cent Browser+Aria2+Bilibili Envolved下载b站视频--保姆级安装步骤

1 使用前准备 Cent Browser百分浏览器下载&#xff1a;https://www.centbrowser.cn/加强版谷歌浏览器&#xff0c;chrome内核。 Tempermonkey&#xff1a;https://chrome.zzzmh.cn/info/dhdgffkkebhmkfjojejmpbldmpobfkfo Aria2&#xff1a;https://github.com/aria2/aria2/re…

外汇天眼:多位支持加息放缓!美元走弱黄金上涨

黄金小时图 黄金方面&#xff1a; 周三&#xff08;11月23日&#xff09;晚间&#xff0c;黄金短线下挫至1728美元之后快速收回。 美联储11月的会议纪要显示&#xff0c;尽管通胀前景风险上行&#xff0c;但大多数的与会者认为尽早放缓加息是合适的&#xff0c;利率正在接近足…

哪些岗位需要考CDMP/CDGA/CDGP证书?

大数据时代&#xff0c;数据成为社会和组织的宝贵资产&#xff0c;像工业时代的石油和电力一样驱动万物。假如数据的真实性、可用性大打折扣&#xff0c;那么数据的价值将会大大折扣&#xff0c;甚至根本不可用&#xff0c;不敢用。因此&#xff0c;数据治理是大数据时代我们用…

把报文再扔回内核,DPDK这样做

在DPDK中经常看到一个词&#xff0c;exception path&#xff0c;它是什么&#xff1f; 在DPDK使用环境中&#xff0c;物理网卡收到的报文不再进入内核协议栈&#xff0c;而是直接到达DPDK应用。但是在有些场景中&#xff0c;用户希望把报文&#xff08;如控制报文&#xff09;…

iTOP3A5000_7A2000开发板龙芯全国产处理器LoongArch架构核心主板

主要参数 处理器: 龙芯3A5000 主频: 2.3GHz-2.5GHz 桥片: 7A2000 内存: 8GB、16GB DDR4带ECC纠错&#xff08;配置可选&#xff09; 系统: Loongnix 典型功耗: 35W 核心板: 16层 底板: 4层 核心板参数 尺寸: 125*95mm CPU: 龙芯四核3A5000处理器 主频: 2.3GHz-2.5GHz 桥片…