首页/文章/echarts

ECharts柱状图相关功能点

2024-03-05
1122 字约 4 分钟
...

highlight: a11y-dark theme: cyanosis

记录一下在公司遇到的一些功能,以及相关实现

经过之前环形图需求,对ECharts的使用感觉已经非常熟练了,这次写柱状图的时候就快了很多。

在这里还是力推一下这个ECharts图表集,大部分的灵感都来自于这 ^_^

echarts图表集

等会讲具体功能的时候,也会将一些具体的案例提供给大家

柱状样式

首先,我给大家提供一种柱状图样式,个人感觉不错,而且实现也很简单

看着很酷,实现也很简单,只需要改变一下柱状的color即可,改为渐变色

我取巧,弄了种很简单的方式

{
	option.color: [{
    return {
      type: 'linear',
      x: 0,
      y: 0,
      x2: 0,
      y2: 1,
      colorStops: [
        {
          offset: 0,
          color: '#21B8FA' 
        },
        {
          offset: 0.8,
          color: '#21B8FA' + '00'
        }
      ]
    }
  }]
}

可以看到,在颜色后面加00即可,也就是透明度大小,换成另一种形式,大家可能看着更熟悉,

#21B8FA → rgb(33,184,250),而加00就是,#21B8FA00 → rgba(33,184,250, 0)

接下来我们来看具体功能点吧

柱状类型

有个配置项,是设置柱状类型的,有两个选项

  • 方形
  • 子弹头

效果如下

这个很容易实现,通过配置项即可

属性为:seriesitemStyle.borderRadius

borderRadius: 5, 
borderRadius: [5, 5, 0, 0] 

所以方向很明确了,直接设置为[9999, 9999, 0, 0]即可

最终实现效果

顶部装饰

效果如下

也是有两种实现方式,一种是通过再加一个series去实现,把所有的点换成图片即可

使用的是散点图,我的理解是没有折线的折线图

    const headDecoratorSeries = {
      silent: true,
      animation: false,
      type: 'scatter',
      symbol: `image://${url}`,
      symbolSize: [width, height],
      symbolOffset: [offsetX, offsetY],
      label: {
        show: false
      },
      itemStyle: undefined
    }

然后利用symbolSize和symbolOffset来控制大小和偏移去实现的

另一种方式是通过label的rich属性去实现的,也就是给label添加一个样式,样式里添加背景图片,并控制大小和偏移,具体代码如下

    seriesItem.label.formatter = '{bg|{c}}'
    seriesItem.label.rich = {
      bg: {
        align: 'center',
        backgroundColor: {
          image: url
        },
        width: width,
        height: height,
        padding: [offsetX, offsetY]
      }
    }

为了性能上的取舍,最终选中了用label的rich去实现的

最终实现效果

提示框

效果如下

这边的话,主要就是去自定义tooltip的formatter,去自己重新写一个提示框来满足该效果,然后注意系列颜色啥的就好了,其他没啥

我把其中的HTML内容抽离出来

item HTML

    <div style="display: flex;justify-content: space-between;align-items: center;">
      <p style="margin: 0;">
        <span style="display: inline-block;margin-right:5px;width: 10px;height: 10px;border-radius: 50%;background-color: ${param.color.colorStops[0].color}"></span>
        ${param.seriesName}
      </p>
      <span>${param.value}</span>
    </div>

return HTML

    <div style="border-radius: 5px;box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);width: ${width}px;height: ${height}px;transform: translate(${offsetX}px, ${offsetY}px);background: url(url);">
      <p style="margin: 0; margin-bottom: 2px;font-family: inherit;">
        ${params[0].axisValueLabel}
      </p>
      <div style="display: flex;flex-direction: column;gap: '1px';font-family: inherit;">
        ${item}
      </div>
    </div>

最终内容

    props.option.tooltip.formatter = params => {
        const item = params.reduce(
          (sum, param) =>
            sum +
            `
          <div style='display: flex;justify-content: space-between;align-items: center;'>
            <p style='margin: 0;'>
              <span style='display: inline-block;margin-right:5px;width: 10px;height: 10px;border-radius: 50%;background-color: ${param.color.colorStops[0].color}'></span>
              ${param.seriesName}
            </p>
            <span>${param.value}</span>
          </div>`,
          ''
        )

        return `
          <div style="border-radius: 5px;box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
            width: ${width}px;height: ${height}px;transform: translate(${offsetX}px, ${offsetY}px);
    				background: `url(${url}) 50% 50% / 100% 100% no-repeat`;
    			>
            <p style='margin: 0; margin-bottom: 2px;font-family: inherit;'>
              ${params[0].axisValueLabel}
            </p>
            <div style="display: flex;flex-direction: column;gap: '1px';font-family: inherit;">
              ${item}
            </div>
          </div>
    	  `
      }

里面包括了设置背景图片、宽高、偏移等功能

最终实现效果

去除提示框自带的阴影效果

首先给tooltip提供一个className

    option.tooltip.className = 'echarts-tooltip'

然后用CSS样式设置一下即可

    
    .echarts-tooltip {
      box-shadow: unset !important;
    }

提示框动画

效果如下

如果看过我之前那篇文字的同学,可能会对这里很熟悉,实现的方式是一样的,只是同时多了个显示提示框的功能

这里我就直接附上代码了,有兴趣的可以去看我的上一篇文章

    const timer = useRef<NodeJS.Timer>()
    const currentIndex = useRef<number>(0)

    const resetSelect = () => {
      eChartInstance.current?.dispatchAction({
        type: 'downplay',
        seriesIndex: 0
      })
    }

    const selectSector = () => {
      eChartInstance.current?.dispatchAction({
        type: 'highlight',
        seriesIndex: 0,
        dataIndex: currentIndex.current
      })
      eChartInstance.current?.dispatchAction({
        type: 'showTip',
        seriesIndex: 0,
        dataIndex: currentIndex.current
      })
    }

    
    const rotatingAnimation = () => {
      if (props.tooltip.isActive) {
        clearInterval(timer.current)
        timer.current = setInterval(() => {
          const dataLen = eChartOption.current?.series[0].data.length ?? 0
          currentIndex.current = (currentIndex.current + 1) % dataLen
          resetSelect()
          selectSector()
        }, props.tooltip.duration * 1000)
      } else {
        resetSelect()
      }
    }

    useEffect(() => {
      rotatingAnimation()

      return () => {
        clearInterval(timer.current)
      }
    }, [props.tooltip])

这边的实现会比环形图简单不少,少了一些功能

最终实现效果

水球图

这次的内容比较少,所以我就把刚做的这个需求也添加到这次的文章里了 ^_^

实现效果

参考案例

echarts图表集

看着确实非常酷炫,实现其实也很简单,echarts没有,但有一个这个水球图插件扩展

安装

    npm install echarts
    npm install echarts-liquidfill

引入

    import * as echarts from 'echarts';
    import 'echarts-liquidfill'

使用

    option = {
      backgroundColor: 'transparent',
      series: [{
        type: 'liquidFill',
        radius: '72%',
        data: [0.6, 0.6, 0.6],
        backgroundStyle: {
          color: 'transparent'
        },
        label: {
          show: false
        },
        outline: {
          show: false
        },
        color: [convertColor(color)]
      }]
    }

其中文字的话,我是额外附加的,放到一个div里面去处理的

还有一个就是背景图片了,需要根据图表位置进行调整和偏移

最终将其抽离为一个组件,遍历3次即可得到该效果

最终实现效果

好了,今天的内容点就到这里啦🎉🎉🎉 ^_^

如果您觉得这篇文章有帮助,请点个赞吧~

分享文章

相关文章

更多文章 →
http-网络2026-10-15
OAuth 2.0是什么,以及如何正确接入
一、先从一个需求理解 OAuth 2.0 假设你开发了一个相册整理工具,用户希望它读取某个云盘里的照片。 把云盘密码交给工具,会带来几个问题:工具拿到的权限太大,密码可能泄漏,用户也难以只撤销这个工具的访问。 OAuth 2.0 提供一套 委托授权机制 :用户在云盘自己的页面确认授权,工具取得一个有权限范围和有效期的访问令牌,再用它调用云盘 API。用户的云盘密码不交给工具。 可以把它理解为:给工具一张“限定用途的通行证”。但令牌泄漏同...
学习
前端2026-10-15
前端动画全景指南
一、前端动画到底是什么 前端动画,就是让画面随时间、用户输入或页面状态连续变化。变化的对象可以是按钮的位置、弹窗的透明度、SVG 的线条、Canvas 里的粒子,也可以是三维场景中的镜头。 先把三个问题分开: | 问题 | 常见答案 | | | | | 画什么? | DOM/CSS、SVG、Canvas 2D、GPU 渲染的场景、预制动画素材 | | 怎样变化? | CSS 过渡/关键帧、Web Animations API、逐帧计算、...
学习
flutter2026-10-14
Flutter Android 正式签名实战:生成密钥、配置构建与验证 APK
Flutter Android 正式签名实战:生成密钥、配置构建与验证 APK Android 正式签名不需要购买证书。开发者可以自己生成密钥,用它给 APK 签名;密钥的用途是建立稳定的应用身份。签名有效并不等于应用已经通过商店审核,也不等于应用功能已完成真机验收。 本文面向 Flutter Android 项目,介绍从开发签名切换到独立正式签名的完整流程。应用名称、目录、包名和证书信息均使用通用示例,不包含真实项目密码、私钥、签名指...
学习
flutter2026-10-14
Flutter 新版本发布实战:完整安装包与 Shorebird 热更新
一、先判断该发完整包还是补丁 | 这次改动 | 发布方式 | | | | | Dart 文案、Flutter 页面布局、业务逻辑修复 | 通常可以发布补丁 | | 纯 Dart 依赖变化 | 可以尝试补丁构建,仍需验证兼容性 | | Kotlin、Java、Swift、Objective C 或原生构建配置变化 | 发布完整包 | | 插件的原生实现变化、新增原生插件、权限变化 | 发布完整包 | | 新增或修改打包图片、字体、应用图标...
学习
react2026-09-15
React 19.3 新特性总结
React 19.3 已发布到 npm,核心是把去年以实验 API 形式公布的 View Transitions 和 Fragment Refs 正式转正,同时新增了几个 DOM 与 RSC 相关的 API。下面按特性整理。 一、View Transitions(视图过渡动画,正式发布) 是什么 是基于浏览器原生 封装的组件。把你想要加动画的元素包起来,当元素 进入、退出、移动或尺寸变化 时,React 自动播放过渡动画。 基本用法 只...
学习
AI2026-09-01
Deep Agents 01:何为 Agent Harness,以及如何开始
1、本篇任务:完成一份多步骤、带证据的技术调研 普通客服 Agent 的问题短、工具少、输出即时。技术调研或编码任务会持续很久,产生计划、搜索结果、文件和中间结论。Deep Agents 在 LangChain/LangGraph 之上预装规划、虚拟文件系统、上下文压缩和子 Agent,适合这类开放任务。 本课让 Agent 比较两种向量数据库,并交付一份可验证报告。 2、什么时候需要 Deep Agent 满足以下两项以上再考虑:任务...
学习

评论

请登录后发表评论

去登录
加载评论中...

目录