Home

Awesome

<div align="center"> <a href="https://xieziyu.github.io/ngx-echarts"> <img src="./src/assets/img/logo.svg" alt="Logo" width="80"> </a> <h3 align="center">NGX-ECHARTS</h3> <p align="center"> Angular directive for <a href="https://github.com/apache/incubator-echarts">Apache ECharts</a> </p> <p align="center"> <a href="https://xieziyu.github.io/ngx-echarts">Online Demo</a> | <a href="https://github.com/xieziyu/ngx-echarts-starter">Starter</a> </p> <p align="center"> <a href="https://www.npmjs.com/package/ngx-echarts"><img src="https://img.shields.io/npm/v/ngx-echarts.svg"></a> <a href="https://www.npmjs.com/package/ngx-echarts"><img src="https://img.shields.io/npm/dm/ngx-echarts.svg"></a> <a href="https://github.com/xieziyu/ngx-echarts/actions/workflows/ci.yaml"><img src="https://github.com/xieziyu/ngx-echarts/actions/workflows/ci.yaml/badge.svg"></a> </p> </div>

Table of contents

Getting Started

ngx-echarts is an Angular (ver >= 2.x) directive for ECharts (ver >= 3.x).

Latest version @npm:

A starter project on Github: https://github.com/xieziyu/ngx-echarts-starter

Latest Update

CHANGELOG.md

Installation

Upgrade from v4.x

  1. import echarts and provide it in NgxEchartsModule.forRoot({ echarts }).
  2. NgxEchartsCoreModule is removed.

Usage

Please refer to the demo page.

Standalone

import NgxEchartsDirective and provideEchartsCore. Or you can use provideEchartsCore to do treeshaking custom build.

import { NgxEchartsDirective, provideEchartsCore } from 'ngx-echarts';
// import echarts core
import * as echarts from 'echarts/core';
// import necessary echarts components
import { BarChart } from 'echarts/charts';
import { GridComponent } from 'echarts/components';
import { CanvasRenderer } from 'echarts/renderers';
echarts.use([BarChart, GridComponent, CanvasRenderer]);

@Component({
  selector: 'app-root',
  standalone: true,
  imports: [CommonModule, NgxEchartsDirective],
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss'],
  providers: [
    provideEchartsCore({ echarts }),
  ]
})
export class AppComponent {}

NgModule

import NgxEchartsModule:

import { NgxEchartsModule } from 'ngx-echarts';
// import echarts core
import * as echarts from 'echarts/core';
// import necessary echarts components
import { BarChart } from 'echarts/charts';
import { GridComponent } from 'echarts/components';
import { CanvasRenderer } from 'echarts/renderers';
echarts.use([BarChart, GridComponent, CanvasRenderer]);

@NgModule({
  imports: [
    NgxEchartsModule.forRoot({ echarts }),
  ],
})
export class AppModule {}

Directive

use echarts directive in a div which has pre-defined height. (From v2.0, it has default height: 400px)

<div echarts [options]="chartOption" class="demo-chart"></div>
.demo-chart {
  height: 400px;
}
import { EChartsCoreOption } from 'echarts/core';

// ...

chartOption: EChartsCoreOption = {
  xAxis: {
    type: 'category',
    data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
  },
  yAxis: {
    type: 'value',
  },
  series: [
    {
      data: [820, 932, 901, 934, 1290, 1330, 1320],
      type: 'line',
    },
  ],
};

API

Directive

echarts directive support following input properties:

InputTypeDefaultDescription
[options]objectnullThe same as the options on the official demo site.
[merge]objectnullUsed to update a part of the options, especially helpful when you need to update the chart data. In fact, the value of merge will be used in echartsInstance.setOption() with notMerge = false. Refer to ECharts documentation for details.
[loading]booleanfalseUsed to toggle the echarts loading animation when your data is not ready.
[autoResize]booleantrueIf set to true, the chart will be automatically resized when the window's width is changed.
[initOpts]objectnullThe value of [initOpts] will be used in echarts.init(). It may contain devicePixelRatio, renderer, width or height properties. Refer to ECharts documentation for details.
[theme]stringnullUsed it to initialize echarts with theme. The theme file must also be imported in main.ts.
[loadingOpts]objectnullInput an object to customize the loading style. Refer to ECharts documentation for details.

By default, loadingOpts is:

{
  text: 'loading',
  color: '#c23531',
  textColor: '#000',
  maskColor: 'rgba(255, 255, 255, 0.8)',
  zlevel: 0
}

ECharts API

If you need to access parts of the ECharts API such as echarts.graphic, please import it from echarts. For example:

import { graphic } from 'echarts/core';

new graphic.LinearGradient(/* ... */);

ECharts Instance

echartsInstance is exposed (since v1.1.6) in the (chartInit) event, enabling you to directly call functions like: resize(), showLoading(), etc. For example:

<div echarts class="demo-chart" [options]="chartOptions" (chartInit)="onChartInit($event)"></div>
onChartInit(ec) {
  this.echartsInstance = ec;
}

resizeChart() {
  if (this.echartsInstance) {
    this.echartsInstance.resize();
  }
}

ECharts Extensions

Import echarts theme files or other extension files after you have imported echarts core. For example:

import * as echarts from 'echarts/core';

/** echarts extensions: */
import { Bar3DChart } from 'echarts-gl/charts';
import { Grid3DComponent } from 'echarts-gl/components';
import 'echarts/theme/macarons.js';
import 'echarts/dist/extension/bmap.min.js';

Service

NgxEchartsService has been obsolete since v4.0

Events

As ECharts supports the 'click', 'dblclick', 'mousedown', 'mouseup', 'mouseover', 'mouseout', and 'globalout' mouse events, our ngx-echarts directive also supports the same mouse events but with an additional chart prefix. For example:

<div echarts class="demo-chart" [options]="chartOptions" (chartClick)="onChartClick($event)"></div>

It supports following event outputs:

@OutputEvent
chartInitEmitted when the chart is initialized
chartClickecharts event: 'click'
chartDblClickecharts event: 'dblclick'
chartMouseDownecharts event: 'mousedown'
chartMouseMoveecharts event: 'mousemove'
chartMouseUpecharts event: 'mouseup'
chartMouseOverecharts event: 'mouseover'
chartMouseOutecharts event: 'mouseout'
chartGlobalOutecharts event: 'globalout'
chartContextMenuecharts event: 'contextmenu'
chartHighlightecharts event: 'highlight'
chartDownplayecharts event: 'downplay'
chartSelectChangedecharts event: 'selectchanged'
chartLegendSelectChangedecharts event: 'legendselectchanged'
chartLegendSelectedecharts event: 'legendselected'
chartLegendUnselectedecharts event: 'legendunselected'
chartLegendLegendSelectAllecharts event: 'legendselectall'
chartLegendLegendInverseSelectecharts event: 'legendinverseselect'
chartLegendScrollecharts event: 'legendscroll'
chartDataZoomecharts event: 'datazoom'
chartDataRangeSelectedecharts event: 'datarangeselected'
chartGraphRoamecharts event: 'graphroam'
chartGeoRoamecharts event: 'georoam'
chartTreeRoamecharts event: 'treeroam'
chartTimelineChangedecharts event: 'timelinechanged'
chartTimelinePlayChangedecharts event: 'timelineplaychanged'
chartRestoreecharts event: 'restore'
chartDataViewChangedecharts event: 'dataviewchanged'
chartMagicTypeChangedecharts event: 'magictypechanged'
chartGeoSelectChangedecharts event: 'geoselectchanged'
chartGeoSelectedecharts event: 'geoselected'
chartGeoUnselectedecharts event: 'geounselected'
chartAxisAreaSelectedecharts event: 'axisareaselected'
chartBrushecharts event: 'brush'
chartBrushEndecharts event: 'brushend'
chartBrushSelectedecharts event: 'brushselected'
chartGlobalCursorTakenecharts event: 'globalcursortaken'
chartRenderedecharts event: 'rendered'
chartFinishedecharts event: 'finished'

You can refer to the ECharts tutorial: Events and Actions in ECharts for more details of the event params. You can also refer to the demo page for a detailed example.

Custom Build

Treeshaking Custom Build

Since version 5.0.1 ECharts supports Treeshaking with NPM.

The app.modules.ts should look like this:

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { HttpClientModule } from '@angular/common/http';

import { NgxEchartsDirective, provideEchartsCore } from 'ngx-echarts';

import { AppComponent } from './app.component';

// Import the echarts core module, which provides the necessary interfaces for using echarts.
import * as echarts from 'echarts/core';

// Import bar charts, all suffixed with Chart
import { BarChart } from 'echarts/charts';

// Import the tooltip, title, rectangular coordinate system, dataset and transform components
import {
  TitleComponent,
  TooltipComponent,
  GridComponent,
  DatasetComponent,
  TransformComponent
} from 'echarts/components';

// Features like Universal Transition and Label Layout
import { LabelLayout, UniversalTransition } from 'echarts/features';

// Import the Canvas renderer
// Note that including the CanvasRenderer or SVGRenderer is a required step
import { CanvasRenderer } from 'echarts/renderers';

// Import the theme
import 'echarts/theme/macarons.js';

// Register the required components
echarts.use([
  BarChart,
  TitleComponent,
  TooltipComponent,
  GridComponent,
  DatasetComponent,
  TransformComponent,
  LabelLayout,
  UniversalTransition,
  CanvasRenderer
]);

@NgModule({
  declarations: [AppComponent],
  imports: [
    BrowserModule,
    HttpClientModule,
    // import standalone directive:
    NgxEchartsDirective,
  ],
  providers: [{ 
    // Provide custom builded ECharts core:
    provideEchartsCore({ echarts })
  }],
  bootstrap: [AppComponent],
})
export class AppModule {}

Legacy Custom Build

Please refer to ECharts Documentation for more details.

If you want to produce a custom build of ECharts, prepare a file like custom-echarts.ts:

// custom-echarts.ts
export * from 'echarts/src/echarts';

import 'echarts/src/chart/line';
import 'echarts/src/chart/bar';
// component examples:
import 'echarts/src/component/tooltip';
import 'echarts/src/component/title';
import 'echarts/src/component/toolbox';

And then inject it in your NgxEchartsModule:

import { NgxEchartsModule } from 'ngx-echarts';
import * as echarts from './custom-echarts';

@NgModule({
  imports: [
    NgxEchartsModule.forRoot({
      echarts,
    }),
  ],
})
export class AppModule {}

And if you want to use the global echarts object, please import it from lib or src instead:

import * as echarts from 'echarts/lib/echarts';

If you need to import theme files, remember to change the 'echarts' path to 'echarts/lib/echarts', for example:

// ... part of echarts/theme/dark.js:
function (root, factory) {
    if (typeof define === 'function' && define.amd) {
        // AMD. Register as an anonymous module.
        define(['exports', 'echarts/lib/echarts'], factory);
    } else if (typeof exports === 'object' && typeof exports.nodeName !== 'string') {
        // CommonJS
        factory(exports, require('echarts/lib/echarts'));
    } else {
        // Browser globals
        factory({}, root.echarts);
    }
}

Custom Locale

You can change the chart locale registering a built-in locale (located in node_modules/echarts/lib/i18n/) or a custom locale object. To register a locale, you will need to change the module that echart is being imported (usually app.module.ts).

import {NgxEchartsModule} from "ngx-echarts";
import * as echarts from 'echarts/core';
import langCZ from 'echarts/lib/i18n/langCZ';

echarts.registerLocale("CZ", langCZ)

@NgModule({
  imports: [NgxEchartsModule.forRoot({echarts})],
  declarations: [],
  providers: [],
  bootstrap: [AppComponent]
})

and in your HTML file use:

<div echarts [initOpts]="{ locale: 'CZ' }" [options]="options" class="demo-chart"></div>

Demo

You can clone this repo to your working copy and then launch the demo page in your local machine:

npm install
npm run demo

# or
yarn install
yarn demo

The demo page server is listening on: http://localhost:4202