F2图例封装 - Bar

news2025/1/11 10:13:53

基于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.clientWidth
  const domWidth = container.value.clientWidth

  chart.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 = true
    let 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: any
      if ( 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 最上层,默认为 false
        position: [0, 0], // ['min', 'max']、文本的起始位置,值为原始数据值,支持 callback
        content: props.unit || '',
        style: {
          // fill: '#000', // 文本颜色
          fontSize: '8', // 文本大小
        },
        offsetX: -25, // x 方向的偏移量 -15
        offsetY: 26, // y 方向偏移量 -20
      });

    } else {
      chart.value.guide().text({
        top: true, // 是否绘制在 canvas 最上层,默认为 false
        position: ['min', 'max'], // 文本的起始位置,值为原始数据值,支持 callback
        content: props.unit || '',
        style: {
          // fill: '#000', // 文本颜色
          fontSize: '10', // 文本大小
        },
        offsetX: -15, // x 方向的偏移量 -15
        offsetY: -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"
        />

堆叠对比

    <InitBarChart
                  ref="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.coloradmin.cn/o/1471598.html

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

相关文章

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

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

【云原生】Spring Cloud Gateway的底层原理与实践方法探究

&#x1f389;&#x1f389;欢迎光临&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;特别推荐给大家我的最新专栏《Spring 狂野之旅&#xff1a;从入门到入魔》 &#x1f680; 本…

【深度学习笔记】深度学习训练技巧

深度学习训练技巧 1 优化器 随机梯度下降及动量 随机梯度下降算法对每批数据 ( X ( i ) , t ( i ) ) (X^{(i)},t^{(i)}) (X(i),t(i)) 进行优化 g ∇ θ J ( θ ; x ( i ) , t ( i ) ) θ θ − η g g\nabla_\theta J(\theta;x^{(i)},t^{(i)})\\ \theta \theta -\eta g g…

Aigtek前置微小信号放大器在传感器检测中的应用有哪些

传感器是将物理量转换为电信号的装置&#xff0c;其精度和灵敏度直接影响到检测系统的性能。而传感器的输出信号通常都非常微弱&#xff0c;需要进行放大处理才能得到可靠的测量结果。前置微小信号放大器&#xff0c;作为一种重要的传感器检测元件&#xff0c;在传感器检测中发…

苏宁商品详情大揭秘:一键解锁API接口,电商数据尽在掌握

苏宁商品详情API接口技术深度探索 一、引言 在电商领域&#xff0c;获取商品详情是许多业务场景的基础需求。苏宁商品详情API接口为此提供了便捷的途径。本文将带你深入了解苏宁商品详情API接口的技术细节&#xff0c;帮助你更好地利用这一接口&#xff0c;提升业务效率。 二…

春节医美热,爱美客、昊海生科谁更赚钱?

在颜值经济赛道上&#xff0c;医美项目逐渐成为消费主流。随着春节假期的到来&#xff0c;医美消费又将迎来高峰期。 “医美三剑客”中&#xff0c;爱美客(300896.SZ)、昊海生科(688366.SH)近日相继公布了2023年的业绩报告&#xff1a;2023年&#xff0c;爱美客预计实现净利润…

[机器视觉]halcon应用实例 边缘检测

一个学习找边的实例 边缘检测的步骤图解 步骤 1.通过Blob方法获取需要测量的Region 1.1 主要运用图像形态学、二值化 2.创建测量句柄 2.1 create_metrology_model (MetrologyHandle) 3.设置目标图像大小 3.1 set_metrology_model_image_size (MetrologyHandle, Width, Height)…

学会玩游戏,智能究竟从何而来?

最近在读梅拉妮米歇尔《AI 3.0》第三部分第九章&#xff0c;谈到学会玩游戏&#xff0c;智能究竟从何而来&#xff1f; 作者: [美] 梅拉妮米歇尔 出版社: 四川科学技术出版社湛庐 原作名: Artificial Intelligence: A Guide for Thinking Humans 译者: 王飞跃 / 李玉珂 / 王晓…

Helm vs Kustomize 深度比较

Helm和Kustomize都是流行的Kubernetes集群部署管理工具&#xff0c;本文比较了两者的优缺点&#xff0c;方便读者根据项目实际情况采用适合的方案。原文: Helm vs Kustomize: why, when, and how[1] 挑战 开始讨论之前&#xff0c;先来看看为什么要使用 Helm 或 Kustomize。 这…

Mac使用K6工具压测WebSocket

commend空格 打开终端&#xff0c;安装k6 brew install k6验证是否安装成功 k6 version设置日志级别为debug export K6_LOG_LEVELdebug执行脚本&#xff08;进入脚本所在文件夹下&#xff09; k6 run --vus 100 --duration 10m --out csvresult.csv script.js 脚本解释&…

亿道丨三防平板丨手持平板丨加固平板丨助力地震救援

自土耳其发生7.8级大地震以来&#xff0c;一直都牵动着世人的心。2023年2月10日&#xff0c;据法新社最新消息&#xff0c;强震已造成土耳其和叙利亚两国超2万人遇难。报道称&#xff0c;相关官员和医护人员表示&#xff0c;地震造成土耳其17674人死亡&#xff0c;叙利亚则有33…

基于Springboot的旅游网管理系统设计与实现(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的旅游网管理系统设计与实现&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层…

第二代80KM高效远距离传输:100G ZR4光模块的应用与发展

随着信息时代的发展&#xff0c;数据传输的需求日益增长&#xff0c;而光模块作为数据中心和网络基础设施的关键组成部分&#xff0c;其性能和应用范围也在不断扩大。易天光通信的第二代100G ZR4 80KM光模块很好的满足了当代社会通信网络的需求。本文易天光通信将探讨第二代高效…

3款黑科技软件,却常被错认是微软开发,纯国产的它功能逆天

美丽的外表往往大同小异&#xff0c;而实用的软件却是难得一遇的珍品。尤其是最后一款国产软件&#xff0c;尽管许多人都在使用&#xff0c;但却常常因为误解而闹出笑话。 1、PhotoDemon 这款由国外技术专家开发的免费、开源图片编辑工具&#xff0c;体积小巧&#xff0c;仅需…

Nacos简易示例

目录 步骤&#xff1a; 1. 下载并启动 Nacos Server 2. 创建用户订单微服务 2.1 创建 Spring Boot 项目 2.2 添加依赖 2.3 配置 Nacos 2.4 编写业务逻辑 3. 注册服务到 Nacos 4. 测试服务 Nacos 是一个开源的服务发现和配置管理系统&#xff0c;可以用于微服务架构中的…

Python 鼠标模拟

鼠标模拟即&#xff1a;通过python 进行模拟鼠标操作 引入类库 示例如下&#xff1a; import win32api import win32con import time 设置鼠标位置 设置鼠标位置为窗口中的回收站。 示例如下&#xff1a; # 设置鼠标的位置 win32api.SetCursorPos([30, 40]) 双击图标 设置…

项目:shell实现多级菜单脚本编写

目录 1. 提示 2. 演示效果 2.1. 一级菜单 2.2. 二级菜单 2.3. 执行操作 3. 参考代码 1. 提示 本脚本主要实现多级菜单效果&#xff0c;并没有安装LAMP、LNMP环境&#xff0c;如果要用在实际生成环境中部署LNMP、LAMP环境&#xff0c;只需要简单修改一下就可以了。 2. 演…

自动换刀主轴应用领域有哪些?

自动换刀主轴是一种先进的机床技术&#xff0c;能够实现快速、准确地更换刀具&#xff0c;提高加工效率和精度&#xff0c;因此在现代制造业中得到了广泛应用。 一、自动换刀主轴的应用领域 1.汽车制造业 汽车制造业是自动换刀主轴应用最广泛的领域之一。在汽车制造过程中&am…

DWT硬件延时

DWT硬件延时 文章目录 DWT硬件延时软件&硬件延时方案软件延时硬件延时方案 DWT硬件延时方案DWT硬件延时方案DEMCR寄存器DWT硬件延时方案实现延时初始化&#xff1a;US延时&#xff1a;MS延时&#xff1a; 软件&硬件延时方案 软件延时 static void Delay(uint32_t cou…