{T}

ECharts 图表类型

本文档介绍 ECharts 中常见的图表类型及其配置方式。

柱状图(Bar)

柱状图(或称条形图)是一种通过柱形的长度来表现数据大小的常用图表类型。设置柱状图的方式,是将 seriestype 设为 'bar'

最简单的柱状图

javascript
option = {
  xAxis: {
    data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
  },
  yAxis: {},
  series: [
    {
      type: 'bar',
      data: [23, 24, 18, 25, 27, 28, 25]
    }
  ]
}

多系列柱状图

javascript
option = {
  xAxis: {
    data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
  },
  yAxis: {},
  series: [
    {
      type: 'bar',
      data: [23, 24, 18, 25, 27, 28, 25]
    },
    {
      type: 'bar',
      data: [26, 24, 18, 22, 23, 20, 27]
    }
  ]
}

柱条样式设置

通过 series.itemStyle 设置柱条样式:

javascript
option = {
  xAxis: {
    data: ['A', 'B', 'C', 'D', 'E']
  },
  yAxis: {},
  series: [
    {
      type: 'bar',
      data: [10, 22, 28, 43, 49],
      itemStyle: {
        barBorderRadius: 5,
        borderWidth: 1,
        borderType: 'solid',
        borderColor: '#73c0de',
        shadowColor: '#5470c6',
        shadowBlur: 3
      }
    }
  ]
}

柱条宽度和间距

javascript
option = {
  xAxis: {
    data: ['A', 'B', 'C', 'D', 'E']
  },
  yAxis: {},
  series: [
    {
      type: 'bar',
      data: [23, 24, 18, 25, 18],
      barWidth: '20%',        // 柱条宽度
      barGap: '20%',          // 不同系列间距
      barCategoryGap: '40%'   // 类目间距
    },
    {
      type: 'bar',
      data: [12, 14, 9, 9, 11]
    }
  ]
}

柱条背景色

javascript
option = {
  xAxis: {
    type: 'category',
    data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
  },
  yAxis: {
    type: 'value'
  },
  series: [
    {
      data: [120, 200, 150, 80, 70, 110, 130],
      type: 'bar',
      showBackground: true,
      backgroundStyle: {
        color: 'rgba(220, 220, 220, 0.8)'
      }
    }
  ]
}

堆叠柱状图

javascript
option = {
  xAxis: {
    data: ['A', 'B', 'C', 'D', 'E']
  },
  yAxis: {},
  series: [
    {
      data: [10, 22, 28, 43, 49],
      type: 'bar',
      stack: 'x'
    },
    {
      data: [5, 4, 3, 5, 10],
      type: 'bar',
      stack: 'x'
    }
  ]
}

动态排序柱状图

从 ECharts 5 开始内置支持动态排序柱状图:

javascript
option = {
  xAxis: {
    max: 'dataMax'
  },
  yAxis: {
    type: 'category',
    data: ['A', 'B', 'C', 'D', 'E'],
    inverse: true,
    animationDuration: 300,
    animationDurationUpdate: 300,
    max: 2
  },
  series: [
    {
      realtimeSort: true,
      name: 'X',
      type: 'bar',
      data: [23, 24, 18, 25, 27],
      label: {
        show: true,
        position: 'right',
        valueAnimation: true
      }
    }
  ],
  animationDuration: 3000,
  animationDurationUpdate: 3000,
  animationEasing: 'linear',
  animationEasingUpdate: 'linear'
}

折线图(Line)

折线图主要用来展示数据项随着时间推移的趋势或变化。

最简单的折线图

javascript
option = {
  xAxis: {
    type: 'category',
    data: ['A', 'B', 'C']
  },
  yAxis: {
    type: 'value'
  },
  series: [
    {
      data: [120, 200, 150],
      type: 'line'
    }
  ]
}

笛卡尔坐标系中的折线图

javascript
option = {
  xAxis: {},
  yAxis: {},
  series: [
    {
      data: [
        [20, 120],
        [50, 200],
        [40, 50]
      ],
      type: 'line'
    }
  ]
}

折线样式设置

javascript
option = {
  xAxis: {
    data: ['A', 'B', 'C', 'D', 'E']
  },
  yAxis: {},
  series: [
    {
      data: [10, 22, 28, 23, 19],
      type: 'line',
      lineStyle: {
        color: 'green',
        width: 4,
        type: 'dashed'
      }
    }
  ]
}

数据点标签

javascript
option = {
  xAxis: {
    data: ['A', 'B', 'C', 'D', 'E']
  },
  yAxis: {},
  series: [
    {
      data: [10, 22, 28, 23, 19],
      type: 'line',
      label: {
        show: true,
        position: 'bottom',
        fontSize: 20
      }
    }
  ]
}

空数据处理

使用 '-' 表示空数据:

javascript
option = {
  xAxis: {
    data: ['A', 'B', 'C', 'D', 'E']
  },
  yAxis: {},
  series: [
    {
      data: [0, 22, '-', 23, 19],
      type: 'line'
    }
  ]
}

堆叠折线图

javascript
option = {
  xAxis: {
    data: ['A', 'B', 'C', 'D', 'E']
  },
  yAxis: {},
  series: [
    {
      data: [10, 22, 28, 43, 49],
      type: 'line',
      stack: 'x',
      areaStyle: {}
    },
    {
      data: [5, 4, 3, 5, 10],
      type: 'line',
      stack: 'x',
      areaStyle: {}
    }
  ]
}

区域面积图

javascript
option = {
  xAxis: {
    data: ['A', 'B', 'C', 'D', 'E']
  },
  yAxis: {},
  series: [
    {
      data: [10, 22, 28, 23, 19],
      type: 'line',
      areaStyle: {}
    }
  ]
}

平滑曲线图

javascript
option = {
  xAxis: {
    data: ['A', 'B', 'C', 'D', 'E']
  },
  yAxis: {},
  series: [
    {
      data: [10, 22, 28, 23, 19],
      type: 'line',
      smooth: true
    }
  ]
}

阶梯线图

javascript
option = {
  xAxis: {
    type: 'category',
    data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
  },
  yAxis: {
    type: 'value'
  },
  series: [
    {
      name: 'Step Start',
      type: 'line',
      step: 'start',
      data: [120, 132, 101, 134, 90, 230, 210]
    },
    {
      name: 'Step Middle',
      type: 'line',
      step: 'middle',
      data: [220, 282, 201, 234, 290, 430, 410]
    },
    {
      name: 'Step End',
      type: 'line',
      step: 'end',
      data: [450, 432, 401, 454, 590, 530, 510]
    }
  ]
}

饼图(Pie)

饼图主要用于表现不同类目的数据在总和中的占比。

基础饼图

javascript
option = {
  series: [
    {
      type: 'pie',
      data: [
        { value: 335, name: '直接访问' },
        { value: 310, name: '邮件营销' },
        { value: 234, name: '联盟广告' },
        { value: 135, name: '视频广告' },
        { value: 1548, name: '搜索引擎' }
      ]
    }
  ]
}

自定义饼图样式

javascript
option = {
  series: [
    {
      type: 'pie',
      radius: '50%',
      center: ['50%', '50%'],
      data: [
        { value: 335, name: '直接访问' },
        { value: 310, name: '邮件营销' },
        { value: 234, name: '联盟广告' },
        { value: 135, name: '视频广告' },
        { value: 1548, name: '搜索引擎' }
      ],
      emphasis: {
        itemStyle: {
          shadowBlur: 10,
          shadowOffsetX: 0,
          shadowColor: 'rgba(0, 0, 0, 0.5)'
        }
      }
    }
  ]
}

环形图

javascript
option = {
  series: [
    {
      type: 'pie',
      radius: ['40%', '70%'],
      data: [
        { value: 335, name: '直接访问' },
        { value: 310, name: '邮件营销' },
        { value: 234, name: '联盟广告' },
        { value: 135, name: '视频广告' },
        { value: 1548, name: '搜索引擎' }
      ]
    }
  ]
}

玫瑰图

javascript
option = {
  series: [
    {
      type: 'pie',
      radius: [30, 110],
      roseType: 'area',
      data: [
        { value: 335, name: '直接访问' },
        { value: 310, name: '邮件营销' },
        { value: 234, name: '联盟广告' },
        { value: 135, name: '视频广告' },
        { value: 1548, name: '搜索引擎' }
      ]
    }
  ]
}

散点图(Scatter)

散点图可以用来展现数据的分布情况。

基础散点图

javascript
option = {
  xAxis: {},
  yAxis: {},
  series: [
    {
      type: 'scatter',
      data: [
        [10.0, 8.04],
        [8.07, 6.95],
        [13.0, 7.58],
        [9.05, 8.81],
        [11.0, 8.33]
      ]
    }
  ]
}

气泡图

通过 symbolSize 映射第三个维度:

javascript
option = {
  xAxis: {},
  yAxis: {},
  series: [
    {
      type: 'scatter',
      symbolSize: function (data) {
        return data[2] / 10
      },
      data: [
        [10.0, 8.04, 100],
        [8.07, 6.95, 200],
        [13.0, 7.58, 150],
        [9.05, 8.81, 80],
        [11.0, 8.33, 120]
      ]
    }
  ]
}

雷达图(Radar)

雷达图主要用于表现多变量的数据对比。

javascript
option = {
  radar: {
    indicator: [
      { name: '销售', max: 6500 },
      { name: '管理', max: 16000 },
      { name: '信息技术', max: 30000 },
      { name: '客服', max: 38000 },
      { name: '研发', max: 52000 },
      { name: '市场', max: 25000 }
    ]
  },
  series: [
    {
      type: 'radar',
      data: [
        {
          value: [4200, 3000, 20000, 35000, 50000, 18000],
          name: '预算分配'
        }
      ]
    }
  ]
}

仪表盘(Gauge)

仪表盘适合用于展示单个数据指标的完成情况。

javascript
option = {
  series: [
    {
      type: 'gauge',
      detail: { formatter: '{value}%' },
      data: [
        { value: 50, name: '完成率' }
      ]
    }
  ]
}

漏斗图(Funnel)

漏斗图适用于展示数据的转化过程。

javascript
option = {
  series: [
    {
      type: 'funnel',
      data: [
        { value: 100, name: '展现' },
        { value: 80, name: '点击' },
        { value: 60, name: '访问' },
        { value: 40, name: '咨询' },
        { value: 20, name: '订单' }
      ]
    }
  ]
}

热力图(Heatmap)

热力图通过颜色来表现数据的大小。

javascript
option = {
  xAxis: {
    type: 'category',
    data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
  },
  yAxis: {
    type: 'category',
    data: ['Morning', 'Afternoon', 'Evening']
  },
  visualMap: {
    min: 0,
    max: 100,
    calculable: true
  },
  series: [
    {
      type: 'heatmap',
      data: [
        [0, 0, 10], [1, 0, 20], [2, 0, 30],
        [0, 1, 40], [1, 1, 50], [2, 1, 60]
      ]
    }
  ]
}

关系图(Graph)

关系图用于展示节点和边的关系数据。

javascript
option = {
  series: [
    {
      type: 'graph',
      layout: 'force',
      data: [
        { name: 'Node 1' },
        { name: 'Node 2' },
        { name: 'Node 3' }
      ],
      links: [
        { source: 'Node 1', target: 'Node 2' },
        { source: 'Node 2', target: 'Node 3' }
      ]
    }
  ]
}

K线图(Candlestick)

K线图主要用于展示股票、期货等金融数据。

基础 K 线图

javascript
option = {
  xAxis: {
    type: 'category',
    data: ['周一', '周二', '周三', '周四', '周五']
  },
  yAxis: {
    type: 'value',
    scale: true
  },
  series: [
    {
      type: 'candlestick',
      data: [
        // [开盘, 收盘, 最低, 最高]
        [2320.26, 2302.6, 2287.3, 2362.94],
        [2300, 2291.3, 2288.26, 2308.38],
        [2295.35, 2346.5, 2295.35, 2346.92],
        [2347.22, 2358.98, 2337.35, 2363.8],
        [2360.75, 2382.48, 2347.89, 2383.76]
      ]
    }
  ]
}

K 线图配色

javascript
option = {
  series: [{
    type: 'candlestick',
    itemStyle: {
      color: '#ef232a',        // 阳线填充色
      color0: '#14b143',       // 阴线填充色
      borderColor: '#ef232a',  // 阳线边框色
      borderColor0: '#14b143'  // 阴线边框色
    },
    data: [
      [2320.26, 2302.6, 2287.3, 2362.94],
      [2300, 2291.3, 2288.26, 2308.38]
    ]
  }]
}

K 线图配合移动平均线

javascript
option = {
  xAxis: {
    type: 'category',
    data: ['周一', '周二', '周三', '周四', '周五']
  },
  yAxis: {
    type: 'value',
    scale: true
  },
  series: [
    {
      name: 'K线',
      type: 'candlestick',
      data: [
        [2320.26, 2302.6, 2287.3, 2362.94],
        [2300, 2291.3, 2288.26, 2308.38],
        [2295.35, 2346.5, 2295.35, 2346.92],
        [2347.22, 2358.98, 2337.35, 2363.8],
        [2360.75, 2382.48, 2347.89, 2383.76]
      ]
    },
    {
      name: 'MA5',
      type: 'line',
      data: [2315, 2322, 2328, 2335, 2345],
      smooth: true,
      lineStyle: { width: 1 }
    }
  ]
}

地图(Map)

地图用于展示地理数据分布。

中国地图

javascript
// 首先注册地图数据
echarts.registerMap('china', chinaJson)
 
option = {
  geo: {
    map: 'china',
    roam: true,           // 开启缩放和平移
    zoom: 1.2,
    label: {
      show: true
    },
    itemStyle: {
      areaColor: '#f3f3f3',
      borderColor: '#999'
    },
    emphasis: {
      itemStyle: {
        areaColor: '#e0e0e0'
      }
    }
  },
  series: [
    {
      type: 'map',
      map: 'china',
      data: [
        { name: '北京', value: 35000 },
        { name: '上海', value: 42000 },
        { name: '广东', value: 58000 }
      ]
    }
  ]
}

地图 + 散点图

javascript
option = {
  geo: {
    map: 'china',
    roam: true
  },
  series: [
    {
      type: 'scatter',
      coordinateSystem: 'geo',
      data: [
        { name: '北京', value: [116.46, 39.92, 340] },
        { name: '上海', value: [121.48, 31.22, 420] }
      ],
      symbolSize: function(val) {
        return val[2] / 10
      }
    }
  ]
}

地图 + 热力图

javascript
option = {
  visualMap: {
    min: 0,
    max: 60000,
    calculable: true,
    inRange: {
      color: ['#50a3ba', '#eac736', '#d94e5d']
    }
  },
  geo: {
    map: 'china',
    roam: true
  },
  series: [{
    type: 'map',
    map: 'china',
    data: [
      { name: '北京', value: 35000 },
      { name: '上海', value: 42000 }
    ]
  }]
}

旭日图(Sunburst)

旭日图用于展示层级数据的占比关系。

基础旭日图

javascript
option = {
  series: {
    type: 'sunburst',
    data: [
      {
        name: '爷爷',
        children: [
          {
            name: '父亲',
            children: [
              { name: '儿子', value: 10 },
              { name: '女儿', value: 5 }
            ]
          },
          {
            name: '叔叔',
            children: [
              { name: '堂兄', value: 8 },
              { name: '堂弟', value: 6 }
            ]
          }
        ]
      }
    ],
    radius: [60, '90%'],
    label: {
      rotate: 'radial'
    }
  }
}

旭日图样式配置

javascript
option = {
  series: [{
    type: 'sunburst',
    data: data,
    radius: [0, '95%'],
    sort: null,
    emphasis: {
      focus: 'ancestor'
    },
    levels: [
      {},  // 第 0 层
      {
        // 第 1 层
        r0: '15%',
        r: '35%',
        itemStyle: { borderWidth: 2 },
        label: { rotate: 'tangential' }
      },
      {
        // 第 2 层
        r0: '35%',
        r: '70%',
        label: { align: 'right' }
      },
      {
        // 第 3 层
        r0: '70%',
        r: '72%',
        label: { position: 'outside', padding: 3, silent: false }
      }
    ]
  }]
}

桑基图(Sankey)

桑基图用于展示数据流向。

javascript
option = {
  series: {
    type: 'sankey',
    layout: 'none',
    emphasis: {
      focus: 'adjacency'
    },
    data: [
      { name: 'a' },
      { name: 'b' },
      { name: 'c' },
      { name: 'd' }
    ],
    links: [
      { source: 'a', target: 'b', value: 5 },
      { source: 'a', target: 'c', value: 3 },
      { source: 'b', target: 'd', value: 4 },
      { source: 'c', target: 'd', value: 3 }
    ]
  }
}

矩形树图(Treemap)

矩形树图用于展示层级数据的占比关系。

javascript
option = {
  series: [
    {
      type: 'treemap',
      data: [
        {
          name: '节点A',
          value: 10,
          children: [
            { name: '节点A-a', value: 4 },
            { name: '节点A-b', value: 6 }
          ]
        },
        {
          name: '节点B',
          value: 20,
          children: [
            { name: '节点B-a', value: 10 },
            { name: '节点B-b', value: 10 }
          ]
        }
      ]
    }
  ]
}

箱形图(Boxplot)

箱形图用于展示数据分布情况。

javascript
option = {
  xAxis: {
    type: 'category',
    data: ['expr1', 'expr2', 'expr3', 'expr4']
  },
  yAxis: {
    type: 'value'
  },
  series: [
    {
      type: 'boxplot',
      data: [
        // [最小值, Q1, 中位数, Q3, 最大值]
        [655, 850, 940, 980, 1075],
        [720, 855, 925, 965, 1010],
        [700, 875, 955, 985, 1100],
        [650, 790, 890, 960, 1100]
      ]
    }
  ]
}

主题河流图(ThemeRiver)

主题河流图用于展示事件或主题随时间变化。

javascript
option = {
  series: {
    type: 'themeRiver',
    data: [
      ['2015/11/08', 10, 'DQ'],
      ['2015/11/09', 15, 'DQ'],
      ['2015/11/08', 5, 'TY'],
      ['2015/11/09', 10, 'TY'],
      ['2015/11/08', 15, 'SS'],
      ['2015/11/09', 20, 'SS']
    ]
  }
}

图表选择指南

按数据类型选择

数据类型推荐图表
对比类柱状图、条形图、雷达图
趋势类折线图、面积图
占比类饼图、环形图、旭日图、矩形树图
分布类散点图、热力图、箱形图
关系类关系图、桑基图
地理类地图、热力地图
层级类旭日图、矩形树图、树图
流程类漏斗图、桑基图

按场景选择

场景推荐图表
数据仪表盘仪表盘、柱状图、折线图
销售分析柱状图、饼图、漏斗图
用户行为热力图、漏斗图、路径图
金融数据K线图、折线图、面积图
地理分布地图、散点地图
组织架构树图、关系图

相关链接