F2图例封装 - Bar

基于vue3 和 F2 3.5.0

<template><div :style="{minHeight: `${height}px`,width: '100%' }" ref="container"><canvas v-show="showChart"  :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: 'barChart'},group: {type: Boolean,default: true},color: {type: String,default: 'itemName'},colorArray: {type: Array,default: ['l(90) 0:#BFDCFDFF 1:#458BFFFF','l(90) 0:#CFF4F3FF 1:#73E3CBFF','#7357F6FF', '#459EF5FF', '#78D86CFF', '#97DFD8FF', '#F0BD58FF', '#7DBBF8FF', '#A1E498FF', '#B6E9E4FF', '#F5D18AFF', '#B5D8FBFF', '#C9EFC4FF', '#D5F2EFFF', '#F9E5BCFF'],// default: ['#459EF5FF','#97DFD8FF','#84BBF0FF','#F0BD58FF','#7357F6FF'],},legendPosition: {type: String,default: 'bottom'},unit: {type: String,default: ''},intervalPositionX: {type: String,default: 'xValue'},intervalPositionY: {type: String,default: 'yValue'},isScrollBar: {type: Boolean,default: false},adjustType: {type: String,default: 'dodge'},intervalSize: {type: Number,default: 15},transposed: {type: Boolean,default: false},isShowText: {type: Boolean,default: false},showToolTotal: {type: Boolean,default: false}
})const chart = 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: [10, 20, 20, 10],appendPadding: [10, 25, 10, 10],pixelRatio: window.devicePixelRatio,});
}/*** @description: 柱状图* @param {*} data 数据* @return {*}*/
const initChartTimeout = (data: any) => {if (data.length > 0) {showChart.value = truelet ipX: any = {}// let nameList: any = {}if (chart.value) {chart.value.clear(); // 清理所有}chart.value.tooltip(false);chart.value.legend({position: props.legendPosition,align: 'center',})if (props.isScrollBar) {const originDates = data.map((item: any) => item[props.intervalPositionX]).slice(0, 4);ipX[props.intervalPositionX] = {tickCount: 4,values: originDates,}ipX[props.intervalPositionY] = {tickCount: 4}chart.value.source(data, ipX);chart.value.interval().position(`${props.intervalPositionX}*${props.intervalPositionY}`).color(props.colorArray)//分组时改变color属性.size(props.intervalSize); // 柱状宽度chart.value.interaction('pan');chart.value.scrollBar({mode: "x",xStyle: {offsetY: -5}});chart.value.axis(props.intervalPositionX, {//y轴配置label: (label: any) => {return {text:  label}}})} else {ipX[props.intervalPositionX] = {tickCount: 5,}let colorItem: anyif ( props.group ) {colorItem = [props.color,props.colorArray]} else {colorItem = [props.colorArray]}chart.value.source(data,ipX);chart.value.interval().position(`${props.intervalPositionX}*${props.intervalPositionY}`).color(...colorItem)//分组时改变color属性.adjust({type: props.adjustType, // 分组 stack 堆叠marginRatio: 0.5 // 设置分组间柱子的间距}).size(props.intervalSize); // 柱状宽度}if ( props.isShowText) {data.forEach((obj: any) => {chart.value.guide().text({position: [obj[props.intervalPositionX], obj[props.intervalPositionY]],content: obj[props.intervalPositionY],style: {textAlign: 'center',fontSize: '10',},offsetY: -10,limitInPlot: true,});});}if (props.transposed) {chart.value.coord({transposed: true});chart.value.guide().text({top: true, // 是否绘制在 canvas 最上层,默认为 falseposition: [0, 0], // ['min', 'max']、文本的起始位置,值为原始数据值,支持 callbackcontent: props.unit || '',style: {// fill: '#000', // 文本颜色fontSize: '8', // 文本大小},offsetX: -25, // x 方向的偏移量 -15offsetY: 26, // y 方向偏移量 -20});} else {chart.value.guide().text({top: true, // 是否绘制在 canvas 最上层,默认为 falseposition: ['min', 'max'], // 文本的起始位置,值为原始数据值,支持 callbackcontent: props.unit || '',style: {// fill: '#000', // 文本颜色fontSize: '10', // 文本大小},offsetX: -15, // x 方向的偏移量 -15offsetY: -10, // y 方向偏移量 -20});}chart.value.tooltip({layout: 'vertical',offsetY: props.transposed ? 0 : 110,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) {//   obj.items// if ( props.showToolTotal ) {//   obj.items.unshift({//       name: '',//       value: '222'//     });// } else {//  obj.items// }// }})render()} else {showChart.value = false}}const initChart = (data: any) => {setTimeout(() => {initChartTimeout(data)}, 100);
}const render = () => {chart.value.render();
}defineExpose({initChart, chart, render})</script>

引用

滚动

  <InitBarChart ref="financingWayChart" chartId="financingWayChart" intervalPositionX="name"intervalPositionY="value" :colorArray="['#459EF5FF']" :group="false" :height="260" unit="万元" :isShowText="true":isScrollBar="true" />
const queryChart = (originalData: any) => {let chartData: any = []originalData.forEach((item: any) => {chartData.push({value: Number(item.indexValue),name: item.itemName,const: 'const',})})debtChart.value.initChart(chartData, labelNumber.value)
}

对比

<InitBarChart ref="otherChart" chartId="otherChart"intervalPositionX="sdate"intervalPositionY="payAmt"unit="分"color="itemName":colorArray="['l(90) 0:#BFDCFDFF 1:#458BFFFF','l(90) 0:#CFF4F3FF 1:#73E3CBFF']":intervalSize="8":height="260"/>

堆叠对比

    <InitBarChartref="jdzfChart" chartId="jdzfChart"intervalPositionX="payType"intervalPositionY="payAmt":height="150"unit="单位:万元"legendPosition="top"color="itemName"adjustType="stack":transposed="true":colorArray="['#7357F6FF', '#459EF5FF', '#78D86CFF', '#97DFD8FF', '#F0BD58FF',]"/>
if (res.data) {res.data.forEach((item: any) => {chartData.push({itemName: item.itemName.includes('完成投资') ? item.date : '计划支付',payAmt: item.payAmt,payType: item.itemName.includes('完成投资') ? '实际支付' : '计划支付',、})})}

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

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

相关文章

零感佩戴的开放式耳机,音质悦耳更耐听,西圣Air体验

每天都用蓝牙耳机的朋友应该不少&#xff0c;我平时也经常戴&#xff0c;不过最近我用的不是常规的入耳式耳机&#xff0c;因为它佩戴不舒适&#xff0c;戴久了耳朵特别难受。所以现在我换上了开放式耳机&#xff0c;这种耳机叫做OWS&#xff0c;我的这款是西圣Air&#xff0c;…

查看mysql数据库的版本

要查看MySQL数据库的版本&#xff0c;可以使用以下几种方法&#xff1a; 命令行&#xff08;已连接到MySQL服务器&#xff09;&#xff1a; 登录到MySQL服务器后&#xff0c;在MySQL提示符下执行&#xff1a; mysql> SELECT VERSION(); 或者&#xff0c;也可以执行 STATUS; …

Zynq(音标可以是zɪŋk)中的PS和PL

在 Zynq 架构下&#xff0c;"PS" 和 "PL" 分别指代 SoC&#xff08;System on Chip&#xff09;中的两个主要部分。 PS&#xff08;Processing System&#xff09;&#xff1a;它是 Zynq SoC 中的处理系统部分&#xff0c;包括 ARM Cortex-A 系列处理器核…

Java异常梳理总结

目录 什么是异常 , 异常的分类 ? 异常的基本概念 什么是Throwable ? Throwable 类常用方法有哪些&#xff1f; Exception 和 Error 有什么区别&#xff1f; 运行时异常与一般异常有什么区别&#xff1f; 常见的RuntimeException 有哪些 ? NoClassDefFoundError 和 C…

面试总结之JVM入门

文章目录 &#x1f412;个人主页&#x1f3c5;JavaEE系列专栏&#x1f4d6;前言&#xff1a;&#x1f380;你为什么要学习JVM&#xff1f;&#x1f380;JVM的作用 &#x1f380;JVM的构成&#xff08;5大类&#xff09;&#x1f3e8;1.类加载系统&#x1f415;类什么时候会被加…

Linux-线程-009

1基本概念 线程&#xff1a;线程是一个轻量级的进程&#xff0c;位于进程空间内部&#xff0c;一个进程中可以创建多个线程 2.线程创建 线程独占栈空间&#xff0c;文本段&#xff0c;数据段和堆区与进程共享 3.线程调度 与进程调度是一样的 宏观穿行&#xff0c;微观并行 4.线…

《业务建模驱动的企业架构转型白皮书》

当前&#xff0c;我国金融等国民经济重点行业和企业的数字化转型&#xff0c;仍存在战略落地难、业务技术协同难以及投入产出匹配难等问题&#xff0c;亟需通过实施企业架构&#xff0c;从顶层设计出发&#xff0c;制定符合自身需要的转型战略&#xff1b;从全局视角出发&#…

人工智能产生的幻觉问题真的能被看作是创造力的另一种表现形式吗?

OpenAI的首席执行官山姆奥特曼&#xff08;Sam Altman&#xff09;曾声称&#xff0c;人工智能产生的“幻觉”其实未尝不是一件好事&#xff0c;因为实际上GPT的优势正在于其非凡的创造力。 目录 一.幻觉问题的概念 二.幻觉产生的原因 三.幻觉的分类 四.减轻AI的幻觉问题到…

Django如何配置数据库

Django是一个功能强大的Python Web框架&#xff0c;它内置了对象关系映射&#xff08;ORM&#xff09;层&#xff0c;使得开发者能够轻松地与数据库进行交互。在Django项目中&#xff0c;数据库的配置是非常重要的一步&#xff0c;因为它决定了你的应用如何存储和检索数据。下面…

Windows部署WebDAV服务并映射到本地盘符实现公网访问本地存储文件

文章目录 前言1. 安装IIS必要WebDav组件2. 客户端测试3. 使用cpolar内网穿透&#xff0c;将WebDav服务暴露在公网3.1 安装cpolar内网穿透3.2 配置WebDav公网访问地址 4. 映射本地盘符访问 前言 在Windows上如何搭建WebDav&#xff0c;并且结合cpolar的内网穿透工具实现在公网访…

01.05 校招 实习 内推 面经

绿*泡*泡VX&#xff1a; neituijunsir 交流*裙 &#xff0c;内推/实习/校招汇总表格 1、校招 | 比博斯特汽车电子2024校园招聘 校招 | 比博斯特汽车电子2024校园招聘 2、校招 | 顺丰集团 2024届-优才计划招聘正在进行中 校招 | 顺丰集团 2024届-优才计划招聘正在进行中 3、…

Qt QWidget 简约美观的加载动画 第四季

&#x1f60a; 第四季来啦 &#x1f60a; 效果如下: 只有三个文件,可以直接编译运行的 //main.cpp #include "LoadingAnimWidget.h" #include <QApplication> #include <QVBoxLayout> #include <QGridLayout> int main(int argc, char *argv[]) …

matlab 三质量-弹簧系统受激振力

1、内容简介 略 44-可以交流、咨询、答疑 建立系统运动方程&#xff0c;研究固有频率和对应主振型 2、内容说明 略 三质量&#xff0d;弹簧系统受激振力&#xff0c;并不考虑各自的阻尼。建立系统运动方程。 解&#xff1a;由于阻尼对固有频率没有影响&#xff0c;故本文不…

代码随想录训练营第40天| 343. 整数拆分、96.不同的二叉搜索树

343. 整数拆分 题目链接&#xff1a;343. 整数拆分 - 力扣&#xff08;LeetCode&#xff09; 动态规划法&#xff1a; class Solution {public int integerBreak(int n) {int[] dp new int[n1];if(n < 3) {return n - 1;}dp[0] 0;dp[1] 1;dp[2] 2;dp[3] 3;for(int i …

【蓝桥杯省赛真题25】python密室逃脱游戏 青少年组蓝桥杯比赛python编程省赛真题解析

目录 python密室逃脱游戏 一、题目要求 1、编程实现 2、输入输出

【深入理解设计模式】代理设计模式

代理设计模式&#xff1a; 代理设计模式是一种结构型设计模式&#xff0c;它允许你提供一个替代物或占位符来控制对其他对象的访问。在代理模式中&#xff0c;一个类代表另一个类的功能。这种类型的设计模式属于结构型模式&#xff0c;因为该模式涉及类和对象的组合。 概述 …

vm 虚拟机中ubuntu环境配置共享文件夹的方式

1. 在虚拟机设置中启用共享文件夹选项&#xff0c;映射到Windows中具体的目录。 2. 启动虚拟机。 3. 挂在cd #查看cd设备文件 sudo blkid#创建挂载点 sudo mkdir -p /media/cdrom#挂载cd sudo mount /dev/sr0 /media/cdrom#卸载cd sudo umount /media/cdrom 4. 执行完挂载后…

常见集合框架底层原理

常见集合框架底层原理 常见的集合有哪些 Java集合类主要由两个接口Collection和Map派生出来的&#xff0c;Collection有三个子接口: List、 Set、Queue List代表了有序可重复集合&#xff0c;可直接根据元素的索引来访问Set代表了无序集合&#xff0c;只能根据元素本身来访问…

Android 监听网络状态变化

文章目录 Android 监听网络状态变化封装工具类使用 Android 监听网络状态变化 封装工具类 <uses-permission android:name"android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name"android.permission.ACCESS_WIFI_STATE"…