一图胜千言:ECharts 基础配置项快速入门

4,252 阅读18分钟

引言

不知道大家初学 Echarts 时有没有一种感觉,就是配置项极其的繁杂,根本不知道对应图中的哪个部分。本文将从 Echarts 常用配置项开始,最终实现一个基础的大屏项目。项目基于Vue 及 Echarts5 实现。先看下最终效果:

总览图.png

因公司项目不方便展示,除地图外,此项目中的 图形 样式来自 pink 老师的 B 站 ECharts 教程,感谢 pink 老师的无私奉献!创作不易,如文章对您有些许帮助,还请您点个赞再走!

1 快速上手

先介绍下最基础的用法,心里有个底先:

1.1 引入 Apache ECharts

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <!-- 引入刚刚下载的 ECharts 文件 -->
    <script src="https://cdn.jsdelivr.net/npm/echarts@5.4.3/dist/echarts.min.js"></script>
  </head>
</html>

打开这个 index.html,你会看到一片空白。但是不要担心,打开控制台确认没有报错信息,就可以进行下一步。

1.2 绘制一个简单的图表

在绘图前我们需要为 ECharts 准备一个定义了高宽的 DOM 容器。在刚才的例子 </head> 之后,添加:

  <body>
      <!-- 为 ECharts 准备一个定义了宽高的 DOM -->
      <div id="main" style="width: 600px;height:400px;"></div>
  </body>

然后就可以通过 echarts.init 方法初始化一个 echarts 实例并通过 setOption 方法生成一个简单的柱状图,下面是完整代码。

   <!DOCTYPE html>
    <html>
      <head>
        <meta charset="utf-8" />
        <title>ECharts</title>
        <!-- 引入刚刚下载的 ECharts 文件 -->
        <script src="echarts.js"></script>
      </head>
      <body>
        <!-- 为 ECharts 准备一个定义了宽高的 DOM -->
        <div id="main" style="width: 600px;height:400px;"></div>
        <script type="text/javascript">
          // 基于准备好的dom,初始化echarts实例
          var myChart = echarts.init(document.getElementById('main'));
    ​
          // 指定图表的配置项和数据
          var option = {
            title: {
              text: 'ECharts 入门示例'
            },
            tooltip: {},
            legend: {
              data: ['销量']
            },
            xAxis: {
              data: ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子']
            },
            yAxis: {},
            series: [
              {
                name: '销量',
                type: 'bar',
                data: [5, 20, 36, 10, 10, 20]
              }
            ]
          };
    ​
          // 使用刚指定的配置项和数据显示图表。
          myChart.setOption(option);
        </script>
      </body>
    </html>

这样你的第一个图表就诞生了!

快速上手柱状图.png

以上内容来自官网介绍:echarts.apache.org/handbook/zh…

2 Echarts 常用配置项图解

下面介绍下 myChart.setOption(option) 中的配置项 option,仅对我在项目中用到的常见配置项作介绍,起来抛砖引玉的作用:

通过术语速查手册可快速了解功能名称,帮助定位到配置项手册。文档地址:echarts.apache.org/zh/cheat-sh…

配置项手册地址:echarts.apache.org/zh/option.h…

2.1 color

如果系列没有设置颜色,则会依次循环从该列表中取颜色作为系列颜色。默认为:

['#5470c6', '#91cc75', '#fac858', '#ee6666', '#73c0de', '#3ba272', '#fc8452', '#9a60b4', '#ea7ccc']

Echarts 5 开始默认采用 '#5470c6' 色如下:

柱状图默认颜色.png

自定义color示例:color: ['yellow', 'green']

color示例.png

上方柱状图中有两个系列(黄色及绿色),黄色对应2011年,绿色对应2012年。3个类目(World、China、India)。系列的颜色根据给定的 color: ['yellow', 'green'] 来渲染。

要给系列中的单个柱子设置不同颜色,在 series 的 itemStyle 中设置:

option = {
  ...
  series: [
    {
      data: [
          20,
          52,
          {
            value: 200,
            itemStyle: {
              color: 'red',
            },
          },
          334,
          390,
          330,
          220,
        ],
      type: 'bar'
    }
  ]
};

单柱子颜色.png

2.2 title

标题组件,包含主标题和副标题。

title: {
    text: '特性示例:渐变色 阴影 点击缩放',
    subtext: 'Feature Sample: Gradient Color, Shadow, Click Zoom'
}

主标题、副标题.png

2.3 tooltip

鼠标悬浮在图上显示的提示框。

1、 show:<boolean> [ default: true ] 是否显示提示框组件,包括提示框浮层和 axisPointer。

2、 trigger: <string> [ default: 'item' ] 触发类型。

  • 'item':光标指在图形上触发,主要在散点图,饼图等无类目轴的图表中使用。
  • 'axis':光标进入类目轴时触发,主要在柱状图,折线图等有类目轴的图表中使用。
  • 'none':什么都不触发。

tooltip.trigger.png

3、 axisPointer:<string> [ default: 'line' ] 坐标轴指示器配置项。

注意: tooltip.axisPointer 中诸配置项的优先级低于轴上的 axisPointer 的配置项。

  • 'line':直线指示器

axisPointer-line.png

  • 'shadow':阴影指示器

axisPointer-shadow.png

  • 'none':无指示器

axisPointer-none.png

  • 'cross' :十字准星指示器。其实是种简写,表示启用两个正交的轴的 axisPointer

axisPointer-cross.png

4、 formatter:提示框浮层内容格式器,支持字符串模板和回调函数两种形式。

  • 字符串模板

    模板变量有 {a}, {b}{c}{d}{e},分别表示系列名,数据名,数据值等。 在 trigger'axis' 的时候,会有多个系列的数据,此时可以通过 {a0}, {a1}, {a2} 这种后面加索引的方式表示系列的索引。 不同图表类型下的 {a}{b}{c}{d} 含义不一样。 其中变量{a}, {b}, {c}, {d}在不同图表类型下代表数据含义为:

    • 折线(区域)图、柱状(条形)图、K线图 : {a}(系列名称),{b}(类目值),{c}(数值), {d}(无)
    • 散点图(气泡)图 : {a}(系列名称),{b}(数据名称),{c}(数值数组), {d}(无)
    • 地图 : {a}(系列名称),{b}(区域名称),{c}(合并数值), {d}(无)
    • 饼图、仪表盘、漏斗图: {a}(系列名称),{b}(数据项名称),{c}(数值), {d}(百分比)

    饼图示例:

    formatter: '{a} <br/>{b} : {c} ({d}%)',
    

    tooltip.formatter.png

  • 回调函数示例:

    params 参数部分属性释义:

    • seriesName:对应字符串模板中的 {a}(系列名称)

    • name:对应字符串模板中的 {b}(数据项名称)

    • value:对应字符串模板中的 {c}(数值)

    • percent:对应字符串模板中的 {d}(百分比)

      ...

实现和字符串模板一样的效果的回调:

formatter: function(params) {
   return `${params.seriesName} <br/>${params.name} : ${params.value} (${params.percent}%)`
}

回调函数参数 params 中更多属性请查看文档:echarts.apache.org/zh/option.h…

2.4 legend

图例组件。图例组件展现了不同系列的标记(symbol),颜色和名字。可以通过点击图例控制哪些系列不显示。

legend.png

当 series 中有 name 值时,legend 可不指定 data 而从 series.name 中获取,不过 legend 属性必须填上,即便为 空对象

2.5 axisPointer

这是坐标轴指示器(axisPointer)的全局公用设置。

注意: 一般来说,axisPointer 的具体配置项会配置在各个轴中(如 xAxis.axisPointer)或者 tooltip 中(如 tooltip.axisPointer)。

但是这几个选项只能配置在全局的 axisPointer 中:axisPointer.triggerOnaxisPointer.link

2.6 backgroundColor

整个canvas画布的背景色,默认无背景(transparent)。

2.7 grid

直角坐标系内绘图网格,单个 grid 内最多可以放置上下两个 X 轴,左右两个 Y 轴。可以在网格上绘制折线图,柱状图,散点图(气泡图)。

可以控制 echarts 图形在 dom容器 中所占的大小:

grid.png

上图中的 left、right、tip、bottom 分别对应 grid.left、grid.right、grid.top、grid.bottom。

1、 show:是否显示直角坐标系网格,即下图红框区域,默认false。

grid2.png

2、 borderColor:网格的边框颜色,注意:此配置项生效的前提是,设置了 show: true。

2.8 xAxis

直角坐标系 grid 中的 x 轴,一般情况下单个 grid 组件最多只能放上下两个 x 轴,多于两个 x 轴需要通过配置 offset 属性防止同个位置多个 x 轴的重叠。

1、 type: [ default: 'category' ] 坐标轴类型。

  • 'category' :类目轴,适用于离散的类目数据,为该类型时必须通过 data 设置类目数据。

            xAxis: {
          type: 'category'data: ['旅游行业','教育培训','游戏行业','医疗行业','电商行业','社交行业','金融行业',]
        }
    

    xAxis.type.png

  • 'value':数值轴,适用于连续数据。

2、 axisLabel:<Object> 坐标轴刻度标签的相关设置。

示例:设置颜色 和 字体大小

         axisLabel: {
            color: 'rgba(255,255,255,.6)',
            fontSize: '12',
        }

aAxis.axisLabel.png

3、 axisLine:<Object> 坐标轴轴线相关设置。

  • show:是否显示坐标轴轴线。从 v5.0.0 开始,数值轴 (type: 'value') 默认不显示轴线,需要显式配置。

    xAxis.png

  • lineStyle:设置单独的线条样式。

    lineStyle: {
                    color: '#f00', // 颜色
                    width: 1,      // 宽度    
                    type: 'solid', // 类型
       }
    

    aAxis2.png

4、 axisTick:<Object> 坐标轴刻度相关设置。

  • show:是否显示坐标轴刻度。默认显示

    xAxis.axisTick.png

  • alignWithLabel:类目轴中在 xAxis.boundaryGap 为 true 的时候有效,可以保证刻度线和标签对齐。

    false的时候刻度线不在类目轴的中点处:

    xAxis.axisTick.alignWithLabel-1692600338550.png

5、 boundaryGap:<Boolean> 坐标轴两边留白策略,类目轴中 boundaryGap 可以配置为 truefalse。默认为 true

为 true 的时候折线图如右:x 类目轴标签显示在刻度中间:

xAxis.boundaryGap.png

为 false 的时候:x 类目轴标签显示在刻度处:

xAxis.boundaryGap2.png

柱状图不要设为false,否则会变成这样:

xAxis.boundaryGap3.png

6、 data:<Object> 类目数据,在类目轴(type: 'category')中有效。数组中的数据会作为 坐标轴的 【刻度标签】显示在 坐标轴区域。

  • Array <String> 方式设置:

    data: ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子']
    

    xAxis.data.png

  • Array <Object> 方式设置:

    data: [
        {
            value: '衬衫',
            textStyle: {
                fontSize: 20,
                color: 'red',
            },
        },'羊毛衫','雪纺衫','裤子','高跟鞋','袜子',
    ]
    

xAxis.data2.png

7、 splitLine:<Object> 坐标轴在 grid 区域中的分隔线。

        splitLine: {
             show: true, // 是否显示分隔线。默认数值轴显示,类目轴不显示。
             // 线条样式
             lineStyle: {
                 color: 'rgba(255,255,255,.1)', 
             },
         }

类目轴图形show为false时示例:

image.png

类目轴图形show为true时示例:

image.png

2.9 yAxis

直角坐标系 grid 中的 y 轴,一般情况下单个 grid 组件最多只能放左右两个 y 轴,多于两个 y 轴需要通过配置 offset 属性防止同个位置多个 Y 轴的重叠。

1、 splitLine:<Object> 坐标轴在 grid 区域中的分隔线。

        splitLine: {
             lineStyle: {
                 color: 'rgba(255,255,255,.1)',
             },
         }

yAxis.splitLine.png

2、 axisLine:<Object> 坐标轴轴线相关设置。

  • show:是否显示坐标轴轴线。设置成 false 时 将隐藏 y 轴轴线。

  • lineStyle:设置单独的坐标轴轴线样式。

        lineStyle: {
            color: 'rgba(255,255,255,.1)',
            width: 2,
            type: 'solid',
        }
    

    yAxis.axisLine.png

3、 axisLabel:<Object> 坐标轴刻度标签的相关设置。

  • show:是否显示刻度标签。

  • formatter:刻度标签的内容格式器,支持字符串模板和回调函数两种形式。

示例:

    // 使用字符串模板,模板变量为刻度默认标签 {value} 
    formatter: '{value} %' 
    // 使用函数模板,函数参数分别为刻度数值(类目),刻度的索引 
    formatter: function (value, index) { return value + '%'; }

image.png

这样给y轴label添加上了百分号。关于 formatter 更多配置参考文档:echarts.apache.org/zh/option.h…

4、 inverse:<Boolean> 是否是反向坐标轴。默认false。

默认 false 即坐标轴从原点向上延伸为正向,yAxis.data 中的坐标轴刻度标签 对应 series.data 中的数据。

yAxis.inverse.png

2.10 series

Array,系列列表。每个系列通过 type 决定自己的图表类型。数组里面的每个对象代表一类数据。

2.10.1 柱状图(type:'bar')

是一种通过柱形的高度(横向的情况下则是宽度)来表现数据大小的一种常用图表类型。

1、 barWidth:<数值 或 百分比> 柱条的宽度,不设时自适应。

2、 barCategoryGap: 同一系列的柱间距离,默认为类目间距的20%,可设固定值。

下方设为 50% 后,绿色以绿色的类目轴宽度100 为基准来设置。

series: [{
    barCategoryGap: '50%',  
    ...
}]

series.barCategoryGap.png

3、 yAxisIndex: 使用的 y 轴的 index,在单个图表实例中存在多个 y轴的时候有用。

此例中有两个 y 轴,左侧y轴对应内部柱形图,右侧y轴对应柱形外框,右侧 y 轴设置 yAxisIndex 属性值比左侧大即可实现压住左侧内部柱形:

yAxisIndex.png

4、 itemStyle: 整体图形样式生效,单个生效需设置在 data 项中的 itemStyle 中。

  • borderRadius:圆角半径,单位px,支持传入数组分别指定 4 个圆角半径。

        borderRadius: 5, // 统一设置四个角的圆角大小
        borderRadius: [5, 5, 0, 0] //(顺时针左上,右上,右下,左下)
    

    borderRadius.png

  • color:柱条的颜色。

    设置为函数时 params 对应系列中的柱形对象,dataIndex 对应柱形对象索引,通过此方法给每个柱形设置不同颜色。

       color: (params) => {
        const colorList = [
            '#1089E7',
            '#F57474',
            '#56D0E3',
            '#F8B448',
            '#8B78F6',
        ]
        return colorList[params.dataIndex]
        },     
    

    itemStyle.color.png

5、 label: 单个柱条文本的样式设置。

  • 一般样式设置:

    
         label: {
                    show: true, // 是否显示标签。
                    position: 'inside', // 标签的位置。
                    color: 'rgba(255,255,255,.7)',  // 文本颜色
                    fontSize: 16, // 文字的字体大小
         }
    

    bar.label.png

  • formatter:标签内容格式器,支持字符串模板和回调函数,支持 \n 换行。

    模板变量:{a}:系列名。{b}:数据名。{c}:数据值。

            formatter: '{c}%'// 此时 series.data: [70, 34, 60, 78, 69]
    

    bar.label.formatter-1692606066650.png

6、 name: 系列名称,用于tooltip的显示,legend 的图例筛选。

bar.name.png

7、 data: 当只有一个轴为类目轴(axis.type 为 'category')的时候,数据可以简化用一个一维数组。

  • itemStyle

    和 xAxis.data 类似,数组项可用对象:

           data: [{value: 5,
               itemStyle: {
                    color: 'green',
                },
             },20,36,10,10,20,] // data: [5, 20, 36, 10, 10, 20] 对应 xAxis.data 中的类目项 
    ['衬衫', '羊毛衫','雪纺衫','裤子','高跟鞋','袜子'] 中的值。
    

    此时会改变单个 类目轴对应的 图形颜色 及 tooltip 对应的颜色

    bar.data.png

  • label:单个柱条 label 的样式设置。

2.10.2 折线/面积图(type:'line')

1、 stack: 数据堆叠,同个类目轴上系列配置相同的stack值后,后一个系列的值会在前一个系列的值上相加。

  • 'samesign' 只在要堆叠的值与当前累积的堆叠值具有相同的正负符号时才堆叠。

  • 'all' 堆叠所有的值,不管当前或累积的堆叠值的正负符号是什么。

  • 'positive' 只堆积正值。

  • 'negative' 只堆叠负值。

    数据未堆叠时,折线显示的数据对应的就是 各自series.data 中的数据,此时折线可能出现重叠:

    line.stack.png

    数据堆叠时,折线显示的数据会累加前一个系列中 series.data 中的数据,此时折线不会重叠,且对应的 y 轴坐标和 series.data 中的不一致:

    line.stack2.png

2、 smooth:<boolean,number> 默认false。

如果是 boolean 类型,则表示是否开启平滑处理。如果是 number 类型(取值范围 0 到 1),表示平滑程度,越小表示越接近折线段,反之则反。设为 true 时相当于设为 0.5。

3、 lineStyle: 线条样式。

注: 修改 lineStyle 中的颜色不会影响图例颜色,如果需要图例颜色和折线图颜色一致,需修改 itemStyle.color,线条颜色默认也会取该颜色

```js
    // 单独修改线的样式
    lineStyle: {
        color: 'red',
        width: 2,
    }
```

line.lineStyle.png

4、 areaStyle:<Object> 区域填充样式。设置后显示成区域面积图。

line.areaStyle.png

        areaStyle: {
            color: new echarts.graphic.LinearGradient(
                0,
                0,
                0,
                1,
                [
                    {
                        offset: 0,
                        color: 'rgba(1, 132, 213, 0.4)', // 渐变色的起始颜色
                    },
                    {
                        offset: 0.8,
                        color: 'rgba(1, 132, 213, 0.1)', // 渐变线的结束颜色
                    },
                ],
                false
            ),
           shadowColor: 'rgba(0, 0, 0, 0.1)',
        },
  • shadowColor:阴影颜色。支持的格式同color。

    areaStyle: {
       shadowColor: 'rgba(0, 0, 0, 0.1)',
    },
    

5、 拐点标记相关

  • showSymbol:是否显示拐点标记 symbol, 如果 false 则只有在 tooltip hover 的时候显示

  • symbol:拐点标记的图形

  • symbolSize:拐点标记的大小

  • itemStyle:折线拐点标志的样式

    示例:

                // 开始不显示拐点, 鼠标经过显示
                showSymbol: false,
                // 设置拐点 小圆点
                symbol: 'circle',
                // 拐点大小
                symbolSize: 8,
                // 设置拐点颜色以及边框
                itemStyle: {
                  color: '#0184d5',
                  borderColor: 'rgba(221, 220, 107, .1)',
                  borderWidth: 12,
                },

line拐点.png

2.10.3 饼图(type:‘pie’)

饼图主要用于表现不同类目的数据在总和中的占比。每个的弧度表示数据数量的比例。

1、 name: 系列名称,用于tooltip的显示,legend 的图例筛选。

pie.name.png

2、 center: default: ['50%', '50%'] 饼图的中心(圆心)坐标,数组的第一项是横坐标,第二项是纵坐标。

pie.center.png

3、 radius:<number、string、Array> [ default: [0, '75%'] 饼图的半径,数组的第一项是内半径,第二项是外半径。百分比单位相对于容器大小。

radius: ['40%', '60%'] // 此时有内圆

pie.radius.png

radius: ['0', '60%'] // 此时内圆消失,变成了饼图

pie.radius2.png

4、 label: 饼图图形上的文本标签,可用于说明图形的一些数据信息,比如值,名称等。

  • show:default: false 默认不显示标签, 即饼图中每一项对应的名称

  • fontSize:文字的字体大小

  • position:default: 'outside' 标签的位置

  • formatter:标签内容格式器,支持字符串模板和回调函数,支持\n 换行

    *   {a}:系列名。
    *   {b}:数据名。
    *   {c}:数据值。
    *   {d}:百分比。
    

5、 label 及 labelLIne 实例:

示例:

 label: {
    show: true,
    position: 'outside',
 },
 labelLine: {
    show: true,
 }

pie.labelLine.png

6、 labelLine: 标签的视觉引导线样式,在 label 位置 设置为'outside'的时候会显示视觉引导线。

  • show 是否显示视觉引导线。

  • length 视觉引导线第一段的长度

  • length2 视觉引导项第二段的长度

pie.labelLine2.png

7、 data: 系列中的数据内容数组。

data: [
    { value: 1, name: "0岁以下" },
    { value: 4, name: "20-29岁" },
    { value: 2, name: "30-39岁" },
    { value: 2, name: "40-49岁" },
    { value: 1, name: "50岁以上" }
]

pie.data.png

8、 roseType:<boolean、string> [default: false] 是否展示成南丁格尔图。

  • 'radius' 扇区圆心角展现数据的百分比,半径展现数据的大小。数据不一样圆心角也不一样

roseType1.png

  • 'area' 所有扇区圆心角相同,仅通过半径展现数据大小。圆心角都是一样的

roseType2.png

9、 emphasis: hover 在图形上时的效果,高亮状态的扇区和标签样式。

  • scale 默认true,是否开启高亮后扇区的放大效果。
  • scaleSize 默认10,高亮后扇区的放大尺寸,在开启 emphasis.scale 后有效。

2.10.4 二维地图(type:‘map’)

二维地图的完整用法在本节后面列出,这里先对配置项作一下说明。

geo 常用配置项:

      geo: {
              map: 'hunan', // 使用 registerMap 注册的地图名称
              aspectScale: 1, // 长宽比
              zoom: 0.8, // 地图放大 1.1 倍
              roam: true, // 开启后可以鼠标可以拖动和缩放
              scaleLimit: { // 滚轮缩放的极限控制,通过min, max最小和最大的缩放值,默认的缩放为1
                min: 0.5,
                // max: 20,
              },
              // left: '0%', // 组件离容器左侧的距离。
              // top: '0%',  // 组件离容器上侧的距离。
              // layoutCenter: ['50%', '50%'], // 需要将地图定位到容器中间且不超出容器时使用
              // layoutSize: 100,  // 需要将地图定位到容器中间且不超出容器时使用
              // 区域样式
              itemStyle: {
                areaColor: 'rgba(20,41,80,.6)', // 地图区域的颜色
                borderColor: '#0692a4', // 图形的描边颜色。
                borderWidth: 1, // 描边线宽。为 0 时无描边
                shadowColor: '#182f68', // 阴影颜色
                shadowOffsetX: 0,  // 阴影水平方向上的偏移距离
                shadowOffsetY: 25, // 阴影垂直方向上的偏移距离
              },
              
              label: {
                show: true,  // 是否显示标签
                textStyle: {
                  color: '#fff',  // 默认标签颜色
                },
              },
              // 指上去时的样式
              emphasis: {
                itemStyle: {
                  areaColor: 'rgba(20,41,80,.6)', // 指上去时的区域背景色
                  borderWidth: 1,  // 指上去时的区域边框大小
                },
    ​
                label: {  
                  textStyle: {
                    color: '#fff', // 指上去时的标签颜色
                  },
                },
              },
            },
    

series 常用配置项

     series: [
              {
                // 如配置了 geo 时指定 geoIndex:0,就会和 geo 共用 geo 地图组件,当前 map 中的 label,itemStyle,emphasis等从 geo 中取,自身的则会失效,如果需要缩放,平移时适合设置它,否则缩放时会出现两个地图
                geoIndex: 0,
                type: 'map',
              },
    ​
              {
                type: 'scatter', // 2d散点(气泡)图
                coordinateSystem: 'geo', // 该系列使用的坐标系,可选:'cartesian2d'、'polar'、'geo'、'calendar'、
                // 标记的大小 如果需要每个数据的图形大小不一样,可以设置为如下格式的回调函数:
                symbolSize: (item) => {
                  const current = this.hospitalList.find(
                    (data) => data.id === item[2]
                  )
                  return current.size
                },
                // 图形样式
                itemStyle: {
                  // 图形的颜色。 默认从全局调色盘 option.color 获取颜色。支持使用回调函数。回调函数格式如下:
                  color: (item) => {
                    // console.log(item)
                    const current = this.hospitalList.find(
                      (data) => data.id === item.value[2]
                    )
                    if (current) {
                      return current.color
                    }
                  },
                },
                // 系列中的数据内容数组。数组项通常为具体的数据项。
                data: [
                  // 格式如下:
                  // {
                  //   name: '长沙市第一医院',
                  //   value: [
                  //     112.988817,
                  //     28.210389,
                  //     1,
                  //     [
                  //       {
                  //         label: '诊疗数',
                  //         value: 666,
                  //       },
                  //       {
                  //         label: '报告数',
                  //         value: 666,
                  //       },
                  //     ],
                  //   ],
                  // },
                  ...
                ],
              },
            ],

3 二维地图完整步骤

生成的地图效果:

hunan-map.png

3.1 获取地图坐标数据

通过下面的链接可以获取到中国 及 下属的省市县 Json 数据,可先用鼠标选取行政区域,然后右侧会展示对应的接口地址及Json数据下载地址。

datav.aliyun.com/portal/scho…

3.2 获取点坐标数据

通过下面的链接可以查询到对应详细地点的坐标:

api.map.baidu.com/lbsapi/getp…

3.3 生成完整配置项

       import * as echarts from 'echarts'
    // 通过 3.1节 方式获取到湖南省地图的 json 数据
    import hunanMapJson from '@/assets/map/hunan.json' 
    ...
    // 生成地图配置项的函数
    function getMapOptions() {
      // 注册名称为 hunan 的地图
      echarts.registerMap('hunan', hunanMapJson)    
      const option = {
          // 定义提示框
          tooltip: {
              trigger: 'item',
              formatter: function (params, ticket, callback) {
                  // 指到 scatter 2d散点(气泡)图时的表现 
                  if (params.seriesType == 'scatter') {
                      let desc = ''
                      if (params.data.value[3]) {
                          params.data.value[3].forEach((item) => {
                              desc += `</br>  ${item.label}: ${item.value}`
                          })
                      }
                      return params.marker + params.name + desc
                      // 指到地图地区的表现 
                  } else if (params.seriesType == 'map') {
                      return params.name
                  }
              },
              backgroundColor: 'rgba(50,50,50,0.7)',
              textStyle: {
                  color: '#fff',
              },
              borderWidth: 0,
          }
          
          geo: {...}, // 定义地图相关配置,参考 2.10.4
          series: {...}, // 定义 series 相关配置,参考 2.10.4
      }
    ​
        // 生成模拟数据
        const arr = this.hospitalList
        .map((item) => {
            item.list.forEach((data) => {
                data.value[3] = [
                    {
                        label: '诊疗数',
                        value: 666,
                    },
                    {
                        label: '报告数',
                        value: 666,
                    },
                ]
            })
            return item.list
        })
        .flat()
        
        // 添加模拟数据
        option.series[1].data = arr
        return option
    }
    ​
    const mapOptions = this.getMapOptions()
    ...

4 Vue 项目结合 Echarts

完整的 Vue 项目 demo 地址:github.com/wangjunjie0…

以下是我在 Vue 中渲染 Echarts 的大致思路,因为图形较少,没有封装成 Vue 组件,供大家参考:

      <template>
      <div class="home_wrapper">
        ...
      </div>
    </template>
    ​
    <script>
    export default {
      name: 'home',
      data() {
          return {
              bar1: {},
              bar2: {},
              line1: {},
              line2: {},
              pie1: {},
              pie2: {},
              hunanMap: {},
          }
      },
      methods: {
         initEcharts() {
               this.bar1 = config.bar1
               this.bar2 = config.bar2
               this.line1 = config.line1
               this.line2 = config.line2
               this.pie1 = config.pie1
               this.pie2 = config.pie2
               this.hunanMap = this.getMapOptions()
    ​
              // dom: 包含 echarts 实例的dom容器或 选择器值
              // options: 传入 echarts 实例的选项对象
              this.dataArr = [
                {
                  dom: '.employment_industry1',
                  options: this.bar1,
                },
                {
                  dom: '.employment_industry2',
                  options: this.bar2,
                },
                {
                  dom: '.people_change',
                  options: this.line1,
                },
                {
                  dom: '.play_amount',
                  options: this.line2,
                },
                {
                  dom: '.age_distribution',
                  options: this.pie1,
                },
                {
                  dom: '.district_distribution',
                  options: this.pie2,
                },
                {
                  dom: '.hunan_map',
                  options: this.hunanMap,
                },
              ]
    ​
              this.initEchartsInstance(this.dataArr)
        },
          
        // 初始化 echarts 实例
        initEchartsInstance(data) {
          data.forEach((item, index) => {
            let domContainer
            if (typeof item.dom === 'string') {
              domContainer = document.querySelector(item.dom)
            } else if (typeof item.dom === 'object') {
              domContainer = item.dom
            }
    ​
            // console.log(domContainer);
            this[`echartsInstance${index}`] = echarts.init(domContainer)
            this[`echartsInstance${index}`].setOption(item.options)
          })
        },
        
        // 改变浏览器窗口大小时触发
        resiseMethod() {
          this.dataArr.forEach((item, index) => {
            this[`echartsInstance${index}`].resize()
          })
        },
      },
      mounted() {
        this.initEcharts()
        window.addEventListener('resize', this.resiseMethod)
      },
      
      beforeDestroy() {
        window.removeEventListener('resize', this.resiseMethod)
      },
    }
    </script>

参考链接:

echarts.apache.org/zh/option.h…