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…

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

Python 实现 BRAR 指标计算&#xff08;情绪指标&#xff09;&#xff1a;股票技术分析的利器系列&#xff08;11&#xff09; 介绍算法公式 代码rolling函数介绍核心代码计算BR计算AR 完整代码 介绍 BRAR 是一种情绪指标&#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} …

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

随着科技的发展和人们生活水平的提高&#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;填写联系信息和地…

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…

常用芯片学习——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…

R绘图 | 单列数据的分布图,对A变量分bin求B变量的平均值

问题1&#xff1a;单个向量的 density 分布图&#xff1f; (1) 模拟数据 set.seed(202402) datdiamonds[sample(nrow(diamonds), 1000),]> head(dat) # A tibble: 6 10carat cut color clarity depth table price x y z<dbl> <ord> &l…

物资管理新篇章:Java+SpringBoot实战

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

微信小程序本地开发

微信小程序本地开发时不需要在小程序后台配置服务器域名直接在小程序项目中填写后端在本机的IP地址和端口号 如图&#xff08;第一步&#xff09; 填写地址后发现报错&#xff0c;url不是合法域名&#xff0c;则在详情设置不校验合法域名 如图&#xff08;第二歩&#xff09;…

Flink代码单词统计 ---批处理

flatMap&#xff1a;一对多转换操作&#xff0c;输入句子&#xff0c;输出分词后的每个词groupBy&#xff1a;按Key分组&#xff0c;0代表选择第1列作为Keysum&#xff1a;求和&#xff0c;1代表按照第2列进行累加print&#xff1a;打印最终结果 1.WordCount代码编写 需求&am…

如何从零实现一个词云效果

词云是一种文本数据的可视化形式&#xff0c;它富有表现力&#xff0c;通过大小不一&#xff0c;五颜六色&#xff0c;随机紧挨在一起的文本形式&#xff0c;可以在众多文本中直观地突出出现频率较高的关键词&#xff0c;给予视觉上的突出&#xff0c;从而过滤掉大量的文本信息…

Segment Routing IPv6介绍

定义 SRv6&#xff08;Segment Routing IPv6&#xff0c;基于IPv6转发平面的段路由&#xff09;是基于源路由理念而设计的在网络上转发IPv6数据包的一种协议。SRv6通过在IPv6报文中插入一个路由扩展头SRH&#xff08;Segment Routing Header&#xff09;&#xff0c;在SRH中压…