数据的跃动之美:探索ECharts动态排序柱状图的魔力

前言

echarts 中,动态排序柱状图是一种常用图表,可以帮助我们更好地理解数据的变化和排序规律。本文将介绍如何使用 echarts 库创建动态排序柱状图,以展示数据的变化趋势和排序情况。


完整代码

<template>
  <div class="acrossStyle">
    <div id="acrossChart" :style="{ width: '100%', height: '100%' }"></div>
  </div>
</template>

<script>
export default {
  mounted() {
    const dataArr = [
      {
        cdate: "2000",
        cname: "水蜜桃,蓝莓,猕猴桃,香蕉,美人指,杨桃,草莓",
        cut: "223, 234, 345, 456, 567, 678, 789",
      },
      {
        cdate: "2001",
        cname: "水蜜桃,蓝莓,猕猴桃,香蕉,美人指,杨桃,草莓",
        cut: "234, 345, 456, 567, 678, 789, 890",
      },
      {
        cdate: "2002",
        cname: "水蜜桃,蓝莓,猕猴桃,香蕉,美人指,杨桃,草莓",
        cut: "245, 456, 567, 678, 789, 890, 901",
      },
      {
        cdate: "2003",
        cname: "水蜜桃,蓝莓,猕猴桃,香蕉,美人指,杨桃,草莓",
        cut: "256, 567, 678, 789, 890, 901, 123",
      },
      {
        cdate: "2004",
        cname: "水蜜桃,蓝莓,猕猴桃,香蕉,美人指,杨桃,草莓",
        cut: "267, 678, 789, 890, 901, 123, 234",
      },
      {
        cdate: "2005",
        cname: "水蜜桃,蓝莓,猕猴桃,香蕉,美人指,杨桃,草莓",
        cut: "278, 789, 890, 901, 123, 234, 345",
      },
      {
        cdate: "2006",
        cname: "水蜜桃,蓝莓,猕猴桃,香蕉,美人指,杨桃,草莓",
        cut: "289, 890, 901, 123, 234, 345, 456",
      },
      {
        cdate: "2007",
        cname: "水蜜桃,蓝莓,猕猴桃,香蕉,美人指,杨桃,草莓",
        cut: "290, 901, 123, 234, 345, 456, 567",
      },
      {
        cdate: "2008",
        cname: "水蜜桃,蓝莓,猕猴桃,香蕉,美人指,杨桃,草莓",
        cut: "201, 123, 234, 345, 456, 567, 678",
      },
      {
        cdate: "2009",
        cname: "水蜜桃,蓝莓,猕猴桃,香蕉,美人指,杨桃,草莓",
        cut: "123, 234, 345, 456, 567, 678, 789",
      },
      {
        cdate: "2010",
        cname: "水蜜桃,蓝莓,猕猴桃,香蕉,美人指,杨桃,草莓",
        cut: "234, 345, 456, 567, 678, 789, 890",
      },
      {
  		cdate: "2011",
  		cname: "水蜜桃,蓝莓,猕猴桃,香蕉,美人指,杨桃,草莓",
  		cut: "345, 456, 567, 678, 789, 890, 901",
	  },
    ];
    // 处理数据
    this.acrossEcharts(this.processData(dataArr));
  },
  methods: {
    // 处理数据方法
    processData(dataArr) {
      return dataArr.map((data) => {
        const cname = data.cname.split(",");
        const cut = data.cut.split(",");
        return {
          cdate: data.cdate,
          cname,
          cut,
        };
      });
    },
    acrossEcharts(dataArr) {
      // 颜色映射表
      const countryColors = {
        水蜜桃: "#FFC0CB",
        蓝莓: "#191970",
        猕猴桃: "#2E8B57",
        香蕉: "#FFC107",
        美人指: "#800080",
        杨桃: "#D4F2E7",
        草莓: "#DC143C",
      };
      const myChart = this.$echarts.init(
        document.getElementById("acrossChart")
      );
      // 更新频率
      const updateFrequency = 700;
      // 起始年份、名称和数量
      const startYear = dataArr[0].cdate;
      const startName = dataArr[0].cname;
      const startCut = dataArr[0].cut;

      // 按照更新频率逐年渲染图表
      dataArr.forEach((year, i) => {
        setTimeout(() => {
          updateYear(year);
        }, (i + 1) * updateFrequency);
      });

      function updateYear(year) {
        option.yAxis.data = year.cname;
        option.series[0].data = year.cut;
        option.graphic.elements[0].style.text = year.cdate;
        myChart.setOption(option);
      }

      const option = {
        xAxis: {
          max: "dataMax", //取数据中的最大值作为最大刻度
          splitLine: {
            // 分隔线配置项
            show: true,
          },
          axisLabel: {
            //x轴标签配置项
            formatter: (n) => Math.round(n) + "",
          },
        },
        dataset: {
          //数据集配置项,这里使用dataArr作为数据源
          source: dataArr,
        },
        yAxis: {
          type: "category", //类型,这里设置为"category"表示分类轴
          inverse: true, //是否反向显示,这里设置为true表示反向显示
          max: 6, //y轴的最大值,这里设置为6
          data: startName, //y轴的刻度标签数据,这里使用startName作为刻度标签
          axisLabel: {
            //y轴标签配置项
            show: true,
            fontSize: 14,
          },
          animationDuration: 300, //动画时长 缓动效果
          animationDurationUpdate: 300, //排序(柱图上升或者下降)动画完成时间
        },
        series: [
          {
            realtimeSort: true, //是否实时排序
            seriesLayoutBy: "column", //数据排列方式,这里设置为"column"表示按列排列
            type: "bar", //系列类型,这里设置为"bar"表示柱状图
            itemStyle: {
              color: function (param) {
                //设置每个分类对应的柱状颜色
                return countryColors[param.name];
              },
            },
            encode: {
              //数据映射配置项
              x: 0, //x轴映射到数据的第0列
              y: 3, //y轴映射到数据的第3列
            },
            label: {
              //数据标签配置项
              show: true, //显示数值
              precision: 2, //保留小数点几位
              position: "right", //居右
              valueAnimation: true, //开启数值动画
              fontFamily: "monospace", //字体选择
              formatter: `{c}吨`, //标签格式化函数,这里使用模板字符串将数值添加单位"吨"
            },
            data: startCut, //数据项,这里使用startCut作为数据
          },
        ],
        animationDuration: 600, //动画时长 缓动效果
        animationDurationUpdate: 600, //排序(柱图上升或者下降)动画完成时间
        animationEasing: "linear", //初始动画缓动效果,这里设置为"linear",表示线性缓动
        animationEasingUpdate: "linear", //数据更新时的动画缓动效果,这里设置为"linear",表示线性缓动
        graphic: {
          //图形元素配置项
          elements: [
            // 年份样式
            {
              type: "text",
              right: 160,
              bottom: 60,
              style: {
                text: startYear,
                font: "bolder 60px monospace",
                fill: "rgba(100, 100, 100, 0.25)",
              },
              z: 100,
            },
          ],
        },
      };
      myChart.setOption(option);
      window.addEventListener("resize", () => {
        myChart.resize();
      });
    },
  },
};
</script>

<style scoped>
.acrossStyle {
  width: 50%;
  height: 50vh;
}
</style>

实现思路

以上代码就实现了一个基于 vueecharts 的动态柱状图,可以根据数据源中的年份、名称和数量逐年渲染图表,并支持实时排序和动画效果。

  • 首先,在 vue 组件的 mounted 钩子函数中,我们将数据源 dataArr 传入 processData 方法进行处理,将名称和数量分别转化为数组,并将处理后的数据作为参数传入 acrossEcharts 方法中;
  • acrossEcharts 方法中,我们首先定义了一个颜色映射表 countryColors,用于将每个分类对应的柱状颜色进行设置。然后,我们使用 echartsinit 方法初始化图表,并设置了一些基本的配置项,如 x 轴、y 轴、数据集、系列类型等;
  • 接下来,我们定义了一个 updateFrequency 变量,表示每年更新的时间间隔。然后,我们将起始年份、名称和数量分别赋值给 startYearstartNamestartCut 变量,并使用 forEach 方法遍历数据源中的每一年数据,使用 setTimeout 方法将每年的数据传入 updateYear 方法中,并在 updateFrequency 的时间间隔后进行渲染;
  • updateYear 方法中,我们将当前年份的名称和数量分别赋值给 option.yAxis.dataoption.series[0].data,并将当前年份的年份值赋值给 option.graphic.elements[0].style.text,最后使用 myChart.setOption 方法将 option 配置项应用到图表中;
  • option 配置项中,我们设置了 x 轴的最大值、分隔线、标签格式化函数等,设置了 y 轴的类型、反向显示、最大值、刻度标签数据等,设置了柱状图的实时排序、数据映射、标签格式化函数等,同时还设置了动画时长、缓动效果、图形元素等;
  • 最后,我们使用 window.addEventListener 方法监听 resize 事件,当窗口大小发生变化时,调用 myChart.resize 方法重新渲染图表。

实现效果

在这里插入图片描述


相关推荐

⭐ 玩转数据可视化,从入门到精通 Echarts

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java 数据结构集合

文章目录 Java 数据结构1. 基本数据结构1.1 数组 (Array)1.2 链表 (Linked List)1.3 栈 (Stack)1.4 队列 (Queue)双向队列优先级队列 2. 树形数据结构2.1 二叉树 (Binary Tree)2.2 堆 (Heap) 3. 散列数据结构3.1 哈希表 (Hash Map)3.2 LinkedHashMap3.3 TreeMapConcurrentHashM…

Cesium for Unity包无法加载

太上老君急急如律⚡令⚡ &#x1f959;关闭UnityHub&#x1f9c0;启动梯子&#x1f96a;cmd 启动UnityHub &#x1f959;关闭UnityHub &#x1f9c0;启动梯子 &#x1f96a;cmd 启动UnityHub 把批处理启动文件&#x1f448;中的exe的路径换成自己的安装目录&#xff01;保存…

[完美解决]Vue/React项目运行时出现this[kHandle] = new _Hash(algorithm, xofLen)

问题出现的原因 出现这个问题是node.js 的版本问题&#xff0c;因为 node.js V17开始版本中发布的是OpenSSL3.0, 而OpenSSL3.0对允许算法和密钥大小增加了严格的限制&#xff0c;可能会对生态系统造成一些影响。故此以前的项目在使用 nodejs V17以上版本后会报错。而github项目…

redis报错:WRONGTYPE Operation against a key holding the wrong kind of value

这个是在redis存取的数据时&#xff0c;存数据时的数据类型和取数据时的数据类型不一致导致的 原因分析 首先需要明白的是&#xff0c;出现这种错误的原因是因为我们在取值的时候&#xff0c;使用的命令不对&#xff0c;比如你用获取string类型的get命令去取列表list类…

【AI视野·今日Robot 机器人论文速览 第七十五期】Thu, 11 Jan 2024

AI视野今日CS.Robotics 机器人学论文速览 Thu, 11 Jan 2024 Totally 16 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers Analytical Model and Experimental Testing of the SoftFoot: an Adaptive Robot Foot for Walking over Obstacles and Irre…

山体滑坡在线监测预警系统解决方案

一、方案概述 我国是一个山区面积较大的国家&#xff0c;山地、丘陵约占国土总面积的2/3&#xff0c;在众多的山区中&#xff0c;都具备泥石流形成的基本条件&#xff0c;这也让我国成为受山体滑坡泥石流灾害影响最大的国家。山体滑坡是指山体斜坡上某一部分岩土在重力(包括岩土…

【C/C++】C/C++编程——C++ 开发环境搭建

C的开发环境种类繁多&#xff0c;以下是一些常见的C 集成开发环境&#xff1a; AppCode &#xff1a;构建与JetBrains’ IntelliJ IDEA 平台上的用于Objective-C&#xff0c;C,C&#xff0c;Java和Java开发的集成开发环境CLion&#xff1a;来自JetBrains的跨平台的C/C的集成开…

肺癌相关文献6

第十四篇 Classification of lung adenocarcinoma based on stemness scores in bulk and single cell transcriptomes IF&#xff1a;6.0 中科院分区:2区 生物学WOS分区&#xff1a;Q1被引次数&#xff1a; 4 背景&#xff1a;癌细胞具有无限期自我更新和增殖的能力[2]。在一…

解决撸卡、撸货、采退成功率低的原因和方法

在亚马逊和沃尔玛等平台上&#xff0c;不论是进行测评、撸卡还是撸货&#xff0c;确保环境的安全性和稳定性是首要任务。一个稳定的环境是进行这些项目的基础&#xff0c;如果无法解决安全性问题&#xff0c;那么进行这些项目就毫无意义。我们团队经过八、九年的环境技术研发&a…

解锁无限可能,Roxlabs代理引领未来网络新体验

文章目录 前言网络隐匿利器&#xff1a;IP代理什么是Roxlabs&#xff1f;世界百花争艳&#xff0c;我独爱一枝什么是住宅IP&#xff1f;如何选择代理类型 利用IP代理进行国外数据采集实战教学附赠一个利用代理IP实现赚钱的方法总结 前言 在数字时代的今天&#xff0c;我们对于…

ai智能写作软件有分享吗?分享4款解放双手的软件!

随着人工智能技术的不断发展&#xff0c;AI智能写作软件逐渐成为内容创作者们的新宠。这些软件不仅能够帮助我们快速生成高质量的文本内容&#xff0c;还能在优化搜索引擎排名等方面发挥重要作用。本文将为大家介绍几款常用的AI智能写作软件&#xff0c;让您轻松提升内容创作效…

香港云服务器:如何计算其正常运行时间

​  在中国香港云服务器使用中&#xff0c;有心的小伙伴应该会有留意到服务商对其“正常运行时间”的描述。简单来说&#xff0c;正常运行时间是指网站或在线服务保持正常状态并可供用户使用而不会中断或中断的时间。正常运行时间通常以百分比表示&#xff0c;显示服务器在线…

【GitHub项目推荐--不错的 Java 开源项目】【转载】

1 基于 Java 的沙盒塔防游戏 Mindustry 是一款用 Java 编写的沙盒塔防游戏。玩家需要建造精密的传送带供应链&#xff0c;提供炮塔弹药&#xff0c;生产建筑材料&#xff0c;保护建筑并抵御敌人。也可以在跨平台多人合作游戏中与朋友一起战斗&#xff0c;或组队进行 PVP 比赛。…

【EI会议征稿通知】第五届机械仪表与自动化国际学术会议(ICMIA 2024)

第五届机械仪表与自动化国际学术会议&#xff08;ICMIA 2024&#xff09; The 5th International Conference on Mechanical Instrumentation and Automation 2024年第五届机械仪表与自动化国际学术会议&#xff08;ICMIA 2024&#xff09;定于2024年4月5-7日在中国武汉隆重…

骨传导耳机综评:透视南卡、韶音和墨觉三大品牌的性能与特点

在当前的蓝牙音频设备领域中&#xff0c;骨传导蓝牙运动耳机以其出色的安全特性和舒适的体验&#xff0c;受到了健身爱好者们的广泛好评。这类耳机不同于我们常见的入耳式耳机&#xff0c;它的工作方式是直接通过振动将声音传递到用户的耳骨中&#xff0c;这样既可以享受音乐&a…

简述Elasticsearch(ES)是什么 全文搜索概念 (倒排索引 管理文档)

今天 我们来说说 NoSql 中的 Elasticsearch 大家基本都叫它 ES 官方介绍 它是一个分布式全文搜索引擎 分布式是一个系统架构的概念 而 全文搜索引擎 全文搜索 可以说基本大家天天都在接触 就比如 我们京东购物 想买什么东西 在全文输入框中搜索 它就会在所有物品中 帮你找出需…

Pytest中conftest.py的用法

Pytest中conftest.py的用法 ​ 在官方文档中&#xff0c;描述conftest.py是一个本地插件的文件&#xff0c;简单的说就是在这个文件中编写的方法&#xff0c;可以在其他地方直接进行调用。 注意事项 只能在根目录编写conftest.py 插件加载顺序在搜集用例之前 基础用法 这里…

自由落体(C语言刷题)

专栏(刷题)&#xff1a;https://blog.csdn.net/2301_79293429/category_12545690.html 这一题直接给我梦回高中&#x1f636;‍&#x1f32b;️ //题目理解&#xff1a;小车开始运动的时候小球都开始下落&#xff0c; // 需要知道下落到 小车顶部的时间 和 落地的时间&#xf…

RC滤波电路的原理

RC滤波电路分为低通滤波和高通滤波 低通滤波通过低频信号 看上面这两个电路 先分析低通滤波 由于电容C具有隔直通交的特性&#xff0c;所以输入的高频分量相当于经过电阻R后直接对地短接&#xff0c;并没有输出到后端负载上&#xff0c;只有低频的输入分量才会输出到后端。 电…

怎样进行医学论文翻译,需要掌握哪些技能?

众所周知&#xff0c;医学领域是一个高度专业化的领域&#xff0c;其中包含了大量的研究成果和学术论文。通过翻译医学论文&#xff0c;可以促进国际医学专家之间的使用、借鉴与交流&#xff0c;进而提高医学水平。那么&#xff0c;怎样进行医学论文翻译比较好呢&#xff1f;翻…