F2图例封装 - BarAndLine

基于vue3 和 F2 3.5.0

<template><div :style="{minHeight: `${height}px`,width: '100%' }" ref="container"><canvas v-show="showChart" ref="canvas" :id="chartId" class="chart-canval"></canvas><empty-box v-show="!showChart"></empty-box></div>
</template><script setup lang="ts">
import {ref, onMounted} from 'vue'
import F2 from '@antv/f2/lib/index-all.js';const props = defineProps({height: {type: Number,default: 300,required: false},chartId: {type: String,default: 'barAndLineChart'},color: {type: String,default: 'itemName'},colorArray: {type: Array,default: ['#7357F6FF', '#459EF5FF', '#78D86CFF', 'red'],//, 'l(90) 0:#BFDCFD 1:#458BFF', 'l(90) 0:#CFF4F3 1:#73E3CB'},legendPosition: {type: String,default: 'bottom'},unit: {type: String,default: ''},unit2: {type: String,default: ''},intervalPositionX: {type: String,default: 'xValue'},intervalPositionY: {type: String,default: 'yValue'},intervalPositionY2: {type: String,default: 'yValue'},mask: {type: String,default: ''},type: {type: String,default: 'type'},type2: {type: String,default: 'type2'},legendItems: {type: Array,default: []},isScrollBar: {type: Boolean,default: false},intervalSize: {type: Number,default: 8},
})const chart = ref()
const canvas = ref()
const container = ref()
const showChart = ref(true)onMounted(() => {setTimeout(() => {newChartBox()}, 100);
})
const newChartBox = () => {const clientWidth = document.documentElement.clientWidthconst domWidth = container.value.clientWidthchart.value = new F2.Chart({id: props.chartId,width: domWidth || clientWidth,height: props.height,padding: ['auto', 'auto', 'auto', 'auto'],pixelRatio: window.devicePixelRatio,});
}/*** @description: 柱状图* @param {*} data 数据* @return {*}*/
const initChartTimeout = (data: any) => {if (data.length > 0) {data.sort((a: any,b: any) => {return Number(new Date(a[props.intervalPositionX])) - Number(new Date(b[props.intervalPositionX]));})data.forEach((item: any) => {if (item[props.intervalPositionY]) {item[props.intervalPositionY] = parseFloat(item[props.intervalPositionY])}})showChart.value = trueif (chart.value) {chart.value.clear(); // 清理所有}chart.value.tooltip({layout: 'vertical',offsetY: 60,background: {radius: 6,fill: '#1890FF',},nameStyle: {fontSize: 10,},valueStyle: {fontSize: 10,},onShow: function onShow(ev: any) {const items = ev.items;items.unshift({name: items[0].title,x: items[0].x,y: items[0].y,})},onChange(obj: any) {// console.log("onChange ~ obj:", obj)}});let ipX: any = {}if (props.isScrollBar) {const originDates = data.map((item: any) => item[props.intervalPositionX]).slice(-4);ipX[props.intervalPositionX] = {tickCount: 4,values: originDates,}ipX[props.intervalPositionY] = {tickCount: 4,// formatter: function formatter(val) {//   return val + props.unit// }}chart.value.source(data, ipX);chart.value.interval().position(`${props.intervalPositionX}*${props.intervalPositionY}`)//柱.adjust({type: 'dodge', // 分组marginRatio: 0.2 // 设置分组间柱子的间距}).color(props.type, props.colorArray).size(props.intervalSize);chart.value.interaction('pan');chart.value.scrollBar({mode: "x",xStyle: {offsetY: -5}});chart.value.axis(props.intervalPositionX, {label: (label: any) => {return {text: label}}})} else {ipX[props.intervalPositionX] = {tickCount: 6,label: {textAlign: 'center',}}chart.value.source(data, ipX);chart.value.interval().position(`${props.intervalPositionX}*${props.intervalPositionY}`)//柱.adjust({type: 'dodge', // 分组marginRatio: 0.2 // 设置分组间柱子的间距}).color(props.type, props.colorArray).size(props.intervalSize);chart.value.axis(props.intervalPositionX);}chart.value.line().position(`${props.intervalPositionX}*${props.intervalPositionY2}`)//线.color(props.type2, ['#FDAD15FF', '#2AC670', '#ff7957FF'])chart.value.legend({position: 'top',// align: "left",marker: 'square',custom: props.legendItems?.length > 0 ,items: props.legendItems})chart.value.guide().text({top: true, // 是否绘制在 canvas 最上层,默认为 falseposition: ['min', 'max'], // 文本的起始位置content: props.unit,style: {// fill: '#000', // 文本颜色fontSize: '10', // 文本大小},offsetX: -15, // x 方向的偏移量offsetY: -20, // y 方向偏移量});chart.value.guide().text({top: true, // 是否绘制在 canvas 最上层,默认为 falseposition: ['max', 'max'], // 文本的起始位置content: props.unit2,style: {fontSize: '10', // 文本大小},offsetX: 15, // x 方向的偏移量offsetY: -18, // y 方向偏移量});render()} else {showChart.value = false}}const initChart = (data: any) => {setTimeout(() => {initChartTimeout(data)}, 100);
}const render = () => {chart.value.render();
}defineExpose({initChart, chart, render})</script>

引用

     <InitBarAndLineChart ref="chartRef":chartId="uuidv4()"intervalPositionX="statTime"intervalPositionY="accu"intervalPositionY2="yoy"color="itemName":colorArray="['l(90) 0:#BFDCFDFF 1:#458BFFFF','l(90) 0:#CFF4F3FF 1:#73E3CBFF','l(90) 0:#846BF9FF 1:#DCD4FFFF','l(90) 0:#D6FAF8FF 1:#E7FFFEFF',]"adjustType="stack":showToolTotal="true":height="260"unit2="%"/>

数据格式

    {type: `${indexName}企业产值`,type2: `${indexName}企业产值累计同比`,accu: item.outp,yoy: item.outpYoy,statTime: item.statTime},

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

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

相关文章

【stm32】hal库-双通道ADC采集

【stm32】hal库-双通道ADC采集 CubeMX图形化配置 程序编写 /* USER CODE BEGIN PV */ #define BATCH_DATA_LEN 1 uint32_t dmaDataBuffer[BATCH_DATA_LEN]; /* USER CODE END PV *//* USER CODE BEGIN 2 */lcd_init();lcd_show_str(10, 10, 24, "Demo14_4:ADC1 ADC2 S…

微服务中排除父项目中的某个依赖

微服务中&#xff0c;子项目排除父项目中的某个依赖 在微服务项目中&#xff0c;可以通过使用maven的exclusions标签排除父项目中的某个依赖。具体操作如下&#xff1a; 打开子项目的pom.xml文件。 在子项目的dependency标签中&#xff0c;添加exclusions标签&#xff0c;指定…

Python 实现 BRAR 指标计算(情绪指标):股票技术分析的利器系列(11)

Python 实现 BRAR 指标计算&#xff08;情绪指标&#xff09;&#xff1a;股票技术分析的利器系列&#xff08;11&#xff09; 介绍算法公式 代码rolling函数介绍核心代码计算BR计算AR 完整代码 介绍 BRAR 是一种情绪指标&#xff0c;用于衡量特定金融市场中的买卖情绪。它代表…

牛客周赛34(A-E)

目录 1.A 2.B 3.C 4.D 5.E 这场出题人号称是考思维,把我给搞蒙了,把我这菜鸡实力暴露的淋漓尽致,不过这场还是让我学到了东西.A,B题就是签到题,会语法就能做(doge),c题我知道思路是啥,但我没想到切分出来的偶数也可能爆long long,所以还得用字符串存,自定义cmp比较函数,而我…

关于内容生成及其上下游的一些问题和想法以及SmartChat给出的答复

写在问题前面 下面的一系列问题&#xff0c;是为了要实现问题中所提到的内容而提出的。如果有感兴趣的朋友&#xff0c;让我们一起学习进步。同时&#xff0c;以下代码、架构和实现都是我计划想要完成的&#xff0c;如果有任何一方面有基础又愿意一起实现它们的请留言或私信一…

试一下newb,还是有错误呀

解题&#xff1a;原式&#xff1d; 2. 在递增的等比数列 ( a n ) (a_n) (an​)中&#xff0c;若 ( a 3 − a 1 5 2 ) (a_3 - a_1 \frac{5}{2}) (a3​−a1​25​), ( a 2 3 ) (a_2 3) (a2​3), 则公比 (q) A. ( 4 3 ) ( \frac{4}{3} ) (34​) B. ( 3 2 ) ( \frac{3}{2} …

netcat(nc)下载及基本使用

netcat&#xff08;nc&#xff09;下载及基本使用 - 知乎

旧物回收小程序开发,开启绿色生活新篇章

随着科技的发展和人们生活水平的提高&#xff0c;物质生活的丰富带来了大量的废弃物。如何合理处理这些废弃物&#xff0c;实现资源的再利用&#xff0c;已成为社会关注的焦点。旧物回收小程序的开发与应用&#xff0c;为这一问题提供了有效的解决方案。本文将探讨旧物回收小程…

软考47-上午题-【数据库】-数据查询语言DQL2

一、聚合函数 聚合函数实现数据统计的功能&#xff0c;返回一个单一的值。聚合函数一般与select语句的group by子句一起使用。 示例&#xff1a; 二、数据分组-group by 聚合函数加上group by子句进行分组。 通常一个聚合函数的作用范围是满足where子句中指定条件的记录&…

Atcoder ABC341 C - Takahashi Gets Lost

Takahashi Gets Lost&#xff08;高桥迷路了&#xff09; 时间限制&#xff1a;3s 内存限制&#xff1a;1024MB 【原题地址】 所有图片源自Atcoder&#xff0c;题目译文源自脚本Atcoder Better! 点击此处跳转至原题 【问题描述】 【输入格式】 【输出格式】 【样例1】 【…

vscode输入英文时字体之间的间隔突然变大,似中文

vscode输入英文时字体之间的间隔突然变大&#xff0c;似中文 主要原因&#xff1a; 是由于输入法变成全角模式了。原因可能是不小心按了 shift空格键快捷键造成的。 正常情况&#xff0c;全角就是字母和数字等与汉字占等宽位置的字。 半角就是ASCII方式的字符&#xff0c;在没…

并发编程线程安全性之可见性有序性

可见性 可见性: 就是说一个线程对共享变量的修改&#xff0c;另一个线程能够立刻看到 通俗点说&#xff0c;就是两个线程共享一个变量&#xff0c;无论哪一个线程修改了这个变量&#xff0c;另外一个线程都能够立刻看到上一个线程对这个变量的修改 产生线程安全问题的原因 计…

桶装水配送小程序有什么功能 怎么制作

桶装水配送小程序是一种方便快捷的订水服务工具&#xff0c;可以帮助用户轻松订购桶装水&#xff0c;并实时跟踪订单配送情况。下面具体介绍送水小程序的功能。 1. 客户订水功能&#xff1a;用户可以通过小程序轻松选择需要的桶装水数量和配送时间&#xff0c;填写联系信息和地…

LeetCode 2960.统计已测试设备

给你一个长度为 n 、下标从 0 开始的整数数组 batteryPercentages &#xff0c;表示 n 个设备的电池百分比。 你的任务是按照顺序测试每个设备 i&#xff0c;执行以下测试操作&#xff1a; 如果 batteryPercentages[i] 大于 0&#xff1a; 增加 已测试设备的计数。 将下标在 …

leet hot 100-7 无重复字符的最长子串

无重复字符的最长子串 原题链接思路代码 原题链接 leet hot 100-7 3. 无重复字符的最长子串 思路 声明一个无序map容器&#xff0c;容器里面记录着窗口里面字符的数量 &#xff0c;如果字符的数量大于1 遍历到s[i]的时候 数量1 此时如果map里面相关的数量大于1 说明窗口里面…

ocr识别tesseract.js本地复现

来源&#xff1a; https://github.com/naptha/tesseract.js chatgpt今天帮倒忙&#xff0c;一直给一些旧的东西&#xff0c;代码就老报错&#xff0c;最后还是我出面看看log和err调了一下&#xff0c;还的是我啊 复现效果 这个挺好复现的&#xff0c;用的英文模式比中文识别…

阿里云服务器ECS u1实例性能如何?199元一年

阿里云服务器ECS u1实例&#xff0c;2核4G&#xff0c;5M固定带宽&#xff0c;80G ESSD Entry盘优惠价格199元一年&#xff0c;性能很不错&#xff0c;CPU采用Intel Xeon Platinum可扩展处理器&#xff0c;购买限制条件为企业客户专享&#xff0c;实名认证信息是企业用户即可&a…

如何本地构建一个 dpdk l2fwd snap 包?

目标 基于 dpdk-19.11 l2fwd 程序及其依赖库本地构建一个 snap 包&#xff0c;能够在 ubuntu 20.04 桌面环境中安装并测试运行。 编写 snap 包 yaml 描述文件 yaml 文件&#xff1a; name: test # you probably want to snapcraft register <name> base: core22 # th…

常用芯片学习——YC688语音芯片

YC688 广州语创公司语音芯片 使用说明 YC688是一款工业级的MP3语音芯片 &#xff0c;完美的集成了MP3、WAV的硬解码。支持SPI-Flash、TF卡、U盘三种存储设备。可通过电脑直接更新SPI-Flash的内容&#xff0c;无需上位机软件。通过简单的串口指令即可完成三种存储设备的音频插…

C/C++文件操作

一、文本文件操作 1、写文件操作 代码 #include<fstream> #include<iostream>int main() {ofstream outfile("Student.txt", ios::out);if (!outfile) {cout << "文件写入失败" << endl;exit(0); //程序终止}cout << &qu…