前言

在最近的项目中,有可视化图表的需求,第一时间就想到了Echarts和Hightcharts。

要用到的可视化图表都是比较常见的,Echarts文档和实例都比较全面,而且还是中文的,方便阅读,于是选择了Echarts。

Echarts的图表样式如果是自用,肯定是没啥问题的,但是 UI 肯定是不满意的,于是进行了一系列的样式调整...

安装及配置

前端框架为easywebpack-vue,使用的Echarts版本为^5.0.1

Echarts 官方文档: echarts.apache.org/zh/index.ht…

1. 安装 Echarts

npm install echarts --save

2. 全局引入 Echarts

在 main.js 加入如下代码:

import * as echarts from "echarts";
Vue.prototype.$echarts = echarts;

3. 按需引入 Echarts

(1)新增 echarts.js 文件

// 引入 echarts 核心模块,核心模块提供了 echarts 使用必须要的接口
import * as echarts from "echarts/core";

// 引入各种图表,图表后缀都为 Chart
import { BarChart, LineChart, PieChart } from "echarts/charts";

// 引入提示框,标题,直角坐标系等组件,组件后缀都为 Component
import {
  TitleComponent,
  TooltipComponent,
  ToolboxComponent,
  GridComponent,
  LegendComponent,
  AxisPointerComponent,
  DatasetComponent,
} from "echarts/components";

// 引入 Canvas 渲染器,注意引入 CanvasRenderer 或者 SVGRenderer 是必须的一步
import { SVGRenderer } from "echarts/renderers";

// 注册必须的组件
echarts.use([
  BarChart,
  LineChart,
  PieChart,

  TitleComponent,
  TooltipComponent,
  ToolboxComponent,
  GridComponent,
  LegendComponent,
  AxisPointerComponent,
  DatasetComponent,

  SVGRenderer,
]);

export default echarts;

(2)在 main.js 文件中引入

import echarts from "./utils/echarts";
Vue.prototype.$echarts = echarts;

使用举例

<template>
  <div id="charts" style="width: 600px; height: 400px"></div>
</template>

<script>
  import * as R from "ramda";

  export default {
    mounted() {
      this.initCharts();
    },
    methods: {
      initCharts() {
        let charts = this.$echarts.init(document.getElementById("charts"));
        let option = {
          title: {
            text: "逐月消费趋势", // 标题
            subtext: "柱状图", // 副标题
          },
          xAxis: {
            type: "category",
          },
          yAxis: {
            type: "value",
          },
          color: ["#1890ff", "#52c41a", " #faad14"], // 柱状图颜色
          dataset: {
            source: [
              // 数据源
              ["1月", 1330, 666, 560],
              ["2月", 820, 760, 660],
              ["3月", 1290, 1230, 780],
              ["4月", 832, 450, 890],
              ["5月", 901, 880, 360],
              ["6月", 934, 600, 700],
            ],
          },
          series: [
            // 图标列设置
            { type: "bar", stack: "total", name: "苹果" },
            { type: "bar", stack: "total", name: "梨子" },
            { type: "bar", stack: "total", name: "桃子" },
          ],
          tooltip: {
          // 提示框组件
          }
        };
        charts.setOption(option);
      },
    },
  };
</script>

<style lang="scss" scoped></style>

原始效果展示:

改造后目标效果展示:

样式优化

x 轴基础样式

基础设置如下所示,可设置刻度和轴线相关的属性

xAxis: {
  type: "category",
  boundaryGap: true, // 坐标轴两边留白策略,默认为true
  axisTick: { // 刻度
    show: false,
  },
  axisLabel: { // 刻度标签
    color: "#808080",
    fontSize: 12,
    margin: 8, // 刻度标签与轴线之间的距离
    interval: "auto", // x轴标签显示间隔,自动
  },
  axisLine: { // 轴线
    lineStyle: {
      color: "#c3c3c3",
      width: 0.5,
    },
  },
  splitLine: { // 分割线
    show: false,
    interval: "auto",
  },
  splitArea: { // 分割区域
    show: false,
    areaStyle: {},
  },
},

最大和最小刻度标签

主要属性是interval,要设置的足够大,比正常展示的刻度个数大一些,就能实现只展示最大和最小刻度标签

xAxis: {
  axisLabel: {
    // interval: "auto",
    interval: 50, // 只显示最大和最小坐标
    showMinLabel: true, // 显示最小刻度标签
    showMaxLabel: true, // 显示最大刻度标签
  }
}

series 数据列悬浮高亮

const stackBarSeries = {
  type: "bar", // 柱状图
  barWidth: 32, // 柱体宽度
  stack: "total", // 数据堆叠
  showBackground: false, // 是否显示柱条背景色
  // 高亮的图形样式和标签样式
  emphasis: {
    // 鼠标hover时,同业务项高亮,其他项淡出图形
    // focus: "series",
    // 默认配置,仅当前hover数据淡出
    focus: "none",
  },
};

let option = {
  series: R.map(
    (o) =>
      R.merge(stackBarSeries, {
        name: o,
      }),
    ["苹果", "梨子", "桃子"]
  ),
};

坐标指示器背景渐变色

主要是设置tooltip提示框组件的trigger,让 x 轴悬浮触发;然后设置xAxis的坐标指示器axisPointer,指示器遮罩样式shadowStyle可以设置渐变色

let option = {
  tooltip: {
    // 提示框组件
    trigger: "axis", // 坐标轴触发
  },
  xAxis: {
    // 坐标轴指示器
    axisPointer: {
      type: "shadow",
      // 坐标轴指示器的 z 值,控制图形的前后顺序
      z: 1,
      // 指示器遮罩样式
      shadowStyle: {
        // 解决hover背景色渐变问题
        color: {
          type: "linear",
          x: 0,
          y: 0,
          x2: 0,
          y2: 1,
          colorStops: [
            {
              offset: 0,
              color: "rgba(234,244,255,1)", // 0% 处的颜色
            },
            {
              offset: 1,
              color: "rgba(234,244,255,0.3)", // 100% 处的颜色
            },
          ],
          global: false, // 缺省为 false
        },
        // 设置背景色及阴影
        // color: "rgba(234,244,255,1)",
        // opacity: 1,
        // shadowColor: "rgba(0, 0, 0, 0.5)",
        // shadowBlur: 10,
        // shadowOffsetX: 10,
        // shadowOffsetY: 10,
      },
    },
  },
};

tooltip 提示框自定义样式

tooltip默认的样式或者值可能不符合开发的要求,可以使用formatter函数自定义处理

let option = {
  tooltip: {
    // 提示框组件
    trigger: "axis", // 坐标轴触发
    padding: [20, 16, 12, 16],
    backgroundColor: "#fff",
    alwaysShowContent: false,
    formatter: function(params) {
      let html = `<div style="height:auto;width: 163px;">
          <div style="font-size:14px;font-weight:bold;color:#333;margin-bottom:16px;line-height:1;">
            ${params[0].axisValue}
          </div>
          ${params
            .map(
              (
                item
              ) => `<div style="font-size:12px;color:#808080;margin-bottom:8px;display:flex;align-items:center;line-height:1;">
                <span style="display:inline-block;margin-right:8px;border-radius:6px;width:6px;height:6px;background-color:${
                  item.color
                };"></span>
                ${item.seriesName}
                <span style="flex:1;text-align:right;">¥${item.value[
                  item.encode.y[0]
                ] || 0}</span>
              </div>`
            )
            .join("")}
            <div style="display:flex;align-items:center;justify-content:space-between;font-size:12px;color:#333;padding-top:4px;margin-bottom:8px;line-height:1;">
            <span>总计</span>
            <span>¥${R.reduceRight(
              R.add,
              0,
              R.drop(1, params[0].value || [])
            )}</span>
          </div>
        </div>`;
      return html;
    },
  },
};

y 轴基础样式

let option = {
  yAxis: {
    type: "value",
    minInterval: 100,
    nameGap: 8,
    axisLabel: {
      color: "#808080",
      fontSize: 10,
      // formatter: (value) => {
      //   return moneyFormatValue(value);
      // },
    },
    splitLine: {
      lineStyle: {
        type: "dashed",
        color: "#ebebeb",
        width: 0.5,
      },
    },
  },
};

legend 图例样式自定义

let option = {
  grid: {
    left: 0,
    right: 12,
    bottom: 0,
    top: 68,
    containLabel: true,
  },
  // 图例设置
  legend: {
    top: 32,
    left: -5,
    icon: "circle",
    itemHeight: 6, // 修改icon图形大小
    itemGap: 24,
    textStyle: {
      fontSize: 12,
      color: "#333",
      padding: [0, 0, 0, -8], // 修改文字和图标距离
    },
  },
};

总结

到此这篇关于Echart Bar双柱状图样式的文章就介绍到这了,更多相关Echart Bar双柱状图样式内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

Echart Bar双柱状图样式最全详解的更多相关文章

  1. html5中canvas图表实现柱状图的示例

    本篇文章主要介绍了html5中canvas图表实现柱状图的示例,本文使用canvas来实现一个图表,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. 用swift实现navigation bar的完全透明 &amp; navigation bar中button的字体大小调整

    2>或者我们可以来改变这个返回按钮的样式,比如手动把它的文字字体大小调整下注意,因为我们其实是改变的UIBarButtonItem,所以,这段代码我们要放到Appdelegate中来实现。这样,所有的bar中的button类的字体都被强制设定为12号大小了

  3. swift – 如何解开任意类型的可选值?

    给定一个[Any]的数组,其中包含可选值和非可选值,例如:我们如何提取在Any类型(如果有)的Optional的值,所以我们可以创建一个通用打印函数,只打印出值。这个printArray函数遍历并打印每个元素:其中将输出:我们如何更改它,以便它只打印底层值,以便它解包的值,如果它是可选的?将总是解包任何类型。

  4. swift – 从常规方法调用协议默认实现

    我想知道是否可能实现这样的事情。它在某种程度上类似于调用super。类中的方法来满足实现每个属性的需求等,但是我看不到使用struct实现相同的可能性。我不知道你是否仍然在寻找这个答案,但方法是从协议定义中删除该函数,将对象转换为Foo,然后调用它的方法:由于某种原因,它只有在函数未声明为协议的一部分,而是在协议的扩展中定义时才有效。

  5. swift – 使用依赖于其他实例变量的值初始化惰性实例变量

    我已经例如尝试将getEventCalendar从方法转换为函数,但这也无济于事.你可以使用一次只执行的闭包来捕获self的属性并在执行时使用它们.例如.W.r.t.对于你自己的尝试:你可以以同样的方式在这个曾经执行过的闭包中使用self的帮助(实例)函数.

  6. 泛型 – 如何在Swift的泛型类上实现NSCoding?

    我在Swift中遇到泛型类和NSCoding问题.具体来说,这个示例代码很好地工作:但是,当我尝试相同的代码,并添加一个泛型参数;当我尝试编码对象;我收到一个’无法识别的选择器发送到实例’错误:以下是错误详细信息和堆栈跟踪:当我读到这一点,当类是通用的时,Swift无法调用encodeWithCoder的实现.它是否正确?为了在泛型类上使用NSCoding,我该如何解决这个问题?

  7. 在Swift 3中如何记录函数的闭包参数的参数?

    在Xcode8beta和Swift3中,当您有一个以闭包为参数的方法时,例如:如何记录关闭所需的参数?据我所知,如果您标记它们,您只能记录关闭参数:这是不太理想的:它强制您在调用闭包时使用参数标签,如果有命名冲突,似乎没有办法区分两者.编辑:as@Arnaud指出,您可以使用_来阻止在调用闭包时使用参数标签:事实上,这是Swift3中唯一有效的方法,因为参数标签不再是类型系统的一部分.

  8. 如何以即时模式从其他.swift文件中包含.swift文件?

    具有功能定义bar.swift的文件:一个脚本可以立即运行foo.swift:如何从foo.swift导入bar.swift的foo()函数?我认为现在的答案是你不能分割多个文件的代码,除非你编译代码.使用#!

  9. Swift枚举具有相同值的多个案例

    在C中,你可以使你的枚举有这个在迅速我想做相当的.但编译器抱怨说它不是唯一的.我如何告诉我,我想要两个案例具有相同的价值?我试过了和但它似乎不像我想要的那样工作.我感谢任何帮助.Swift不支持重复的值.如果您不介意,可以使用这样的东西来模拟它.

  10. swift – 有客观原因我不能拥有带元素标签的单元素元组吗?

    在Swift中直到并包括Swift3,我无法创建一个单元素元组,其中元素被命名.所以funcfoo()–>酒吧很好,而funcfoo()–>产生编译错误.但是,我可以想到这种模式的一些可能用途,例如:…这已经作为SwiftEvolution系统的一部分进行了讨论吗?

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部