郭某人的网站

关于 / 留言

微信小程序接入 ECharts.js 相关功能的代码示例

使用 echarts-for-weixin 在微信小程序中呈现图表


ECharts.js 是一个基于 JavaScript 的开源可视化图表库,它的功能很丰富,效果还不错,使用起来比较容易;它支持微信小程序平台,有个名叫 echarts-for-weixin 的微信小程序组件可用,你可以在它的官网找到下载地址,此篇文章介绍在微信小程序中使用 ECharts.js 的示例,下面看张效果图:

开始写主体代码前,需要将你下载的组件引入到微信小程序的项目中并且配置好在 .json 文件里的引用代码,比如:

"usingComponents": {
    "ec-canvas": "/components/ec-canvas/ec-canvas"
  }

你下载的 echarts-for-weixin 文件包里应该有个名叫 ec-canvas 的文件夹,里面应该有以 ec-canvas 为名的 4 个微信小程序页面文件和 echarts.js、wx-canvas.js 这两个 .js 文件。

wxml 部位代码:

<view class="VIEW_echart_graph_box">
  <ec-canvas ec="{{echart_curve}}"></ec-canvas>
</view>
<view class="VIEW_echart_graph_box">
  <ec-canvas ec="{{echart_bar}}"></ec-canvas>
</view>

那么 ec-canvas 元素就是图表组件了,建议应用中也将其用个容器元素包裹起来。

wxss 部位代码:

page {
  padding: 10px;
  box-sizing: border-box;
}
 
.VIEW_echart_graph_box {
  width: 100%;
  height: 320px;
  margin: 0 0 10px 0;
  border: 1px solid lightgray;
  box-sizing: border-box;
}

注意一定要给容器元素设置高度且不能是百分比单位,不然不会显示。

js 部位代码:

import * as echarts from '../../components/ec-canvas/echarts';
function getEchartOption_curve() {
  return {
    title: {
      top: 8,
      left: 8,
      text: "曲线图示例"
    },
    dataset: {
      source: [{
        date: "2023/1/1",
        income: 240,
        spend: 300
      }, {
        date: "2023/2/1",
        income: 1240,
        spend: 500
      }, {
        date: "2023/3/1",
        income: 321,
        spend: 457
      }, {
        date: "2023/4/1",
        income: 982,
        spend: 752
      }, {
        date: "2023/5/1",
        income: 278,
        spend: 808
      }, {
        date: "2023/6/1",
        income: 656,
        spend: 558
      }, {
        date: "2023/7/1",
        income: 990,
        spend: 543
      }, {
        date: "2023/8/1",
        income: 454,
        spend: 675
      }, {
        date: "2023/9/1",
        income: 122,
        spend: 23
      }, {
        date: "2023/10/1",
        income: 633,
        spend: 780
      }, {
        date: "2023/11/1",
        income: 3756,
        spend: 123
      }, {
        date: "2023/12/1",
        income: 2240,
        spend: 76
      }]
    },
    grid: {
      containLabel: true
    },
    legend: {
      top: 10,
      data: [{
        lineStyle: {
          color: "rgb(70,203,121)"
        },
        itemStyle: {
          color: "rgb(70,203,121)"
        },
        name: "收入"
      }, {
        lineStyle: {
          color: "rgb(198,57,57)"
        },
        itemStyle: {
          color: "rgb(198,57,57)"
        },
        name: "支出"
      }]
    },
    xAxis: [{
      type: "category",
      axisLine: {
        show: false
      },
      axisTick: {
        show: false
      }
    }],
    yAxis: [{
      name: "收入(元)",
      nameLocation: "center",
      nameTextStyle: {
        color: "rgb(70,203,121)",
        align: "left",
        padding: [0, 0, 30, 0]
      },
      type: "value",
      axisLine: {
        show: true
      },
      axisLabel: {
        color: "rgb(70,203,121)"
      },
      min: 0,
      max: 4000
    }, {
      name: "支出(元)",
      nameLocation: "center",
      nameTextStyle: {
        color: "rgb(198,57,57)",
        align: "left",
        padding: [30, 0, 0, 0]
      },
      type: "value",
      axisLine: {
        show: true
      },
      axisLabel: {
        color: "rgb(198,57,57)"
      },
      min: 0,
      max: 4000
    }],
    series: [{
      name: "收入",
      yAxisIndex: 0,
      type: "line",
      smooth: true,
      symbol: "none",
      lineStyle: {
        color: "rgb(70,203,121)"
      }
    }, {
      name: "支出",
      yAxisIndex: 1,
      type: "line",
      smooth: true,
      symbol: "none",
      lineStyle: {
        color: "rgb(198,57,57)"
      }
    }]
  }
}
function getEchartOption_bar() {
  return {
    title: {
      top: 8,
      left: 8,
      text: "柱状图示例"
    },
    dataset: {
      source: [{
        province: "重庆",
        male: 1620,
        female: 1585
      }, {
        province: "四川",
        male: 4229,
        female: 4139
      }, {
        province: "贵州",
        male: 1971,
        female: 1886
      }, {
        province: "云南",
        male: 2442,
        female: 2279
      }, {
        province: "西藏",
        male: 191,
        female: 173
      }]
    },
    grid: {
      containLabel: true
    },
    legend: {
      top: 20,
      selectedMode: false,
      data: [{
        itemStyle: {
          color: "rgb(37,176,243)"
        },
        name: ""
      }, {
        itemStyle: {
          color: "rgb(209,64,227)"
        },
        name: ""
      }]
    },
    xAxis: {
      type: "category",
      axisTick: {
        show: false
      }
    },
    yAxis: {
      type: "value",
      name: "人口数(万人)",
      nameLocation: "end",
      nameTextStyle: {
        align: "right"
      },
    },
    series: [{
      name: "",
      type: "bar",
      silent: true,
      stack: "people",
      itemStyle: {
        color: "rgb(37,176,243)"
      }
    }, {
      name: "",
      type: "bar",
      silent: true,
      stack: "people",
      itemStyle: {
        color: "rgb(209,64,227)"
      }
    }]
  }
}
Page({
  // 我总觉得下面两个 onInit 方法可以合并为一个方法,加个区别传递的 Option 参数,不过这是官方的用法,为了不节外生枝并确保别人的代码有效,我便没有测试是否可以这样做
  data: {
    echart_curve: {
      onInit: function (canvas, width, height, dpr) {
        const chart = echarts.init(canvas, null, {
          width: width,
          height: height,
          devicePixelRatio: dpr
        });
        canvas.setChart(chart);
        chart.setOption(getEchartOption_curve());
        return chart;
      }
    },
    echart_bar: {
      onInit: function (canvas, width, height, dpr) {
        const chart = echarts.init(canvas, null, {
          width: width,
          height: height,
          devicePixelRatio: dpr
        });
        canvas.setChart(chart);
        chart.setOption(getEchartOption_bar());
        return chart;
      }
    }
  },
  onLoad(options) {
  }
})

与通常的微信小程序代码有所不同的是,顶部先引入了 echarts 对象,这用来执行其初始化方法,ECharts 图表所用的 Option 参数写成了 Javascript 方法放到了微信小程序 Page 对象的外部,这是官方示例这样做的,毕竟 ECharts.js 不是专门为微信小程序而生的库,原生是 Javascript,这样的应用在微信小程序中看起来很奇怪,但还是尽量按照官方的意图来吧;ECharts 的 Option 参数配置方面请直接参看官方的文档,这些和原生平台是一样的。

结语:我在使用 ECharts 库的时候遇到了很多坑,这个库里有些功能的程序接口很反开发者的常规认知,很多参数不完善,小问题很多,使用时需多方面调测,不过我觉得它仍然是目前互联网上我用过的最好用的开源图表库。


最后更新时间:2024/11/01 15:07

如果您喜欢此文章,或此文章给您带来了任何帮助,请考虑对我进行资金赞赏,您的支持将会成为我坚持的力量。

注意!你的赞赏转账请考虑再三后支付,此收款不作任何形式的退款。