Skip to main content

Overview

Drawing tools allow users to add interactive annotations to stock charts. These include trend lines, shapes, Fibonacci retracements, and more. All drawing tools extend the DrawingSeries base class.

Base Class: DrawingSeries

import { DrawingSeries } from "@amcharts/amcharts5/stock";

Settings

xAxis
DateAxis<AxisRenderer>
required
X-axis for the drawing.
yAxis
ValueAxis<AxisRenderer>
required
Y-axis for the drawing.
series
XYSeries
XYSeries used as the basis for the drawing.
strokeColor
Color
Color of the lines/borders.
fillColor
Color
Color of the fills.
strokeOpacity
number
Opacity of the lines/borders (0-1).
fillOpacity
number
Opacity of the fills (0-1).
strokeWidth
number
Width of the lines/borders in pixels.
strokeDasharray
number[]
Dash pattern for lines/borders (e.g., [5, 5] for dashed lines).
snapToData
boolean
Whether drawings should snap to X and Y values.
field
string
default:"value"
Value field to use when snapping data or calculating averages/regressions.Options: "open", "value", "low", "high"
selectorPadding
number
default:"5"
Padding around the drawing when selected (in pixels).

Methods

enableDrawing()

Enables drawing mode for this series.
enableDrawing(): void

disableDrawing()

Disables drawing mode for this series.
disableDrawing(): void

toggleDrawing()

Toggles drawing mode on or off.
toggleDrawing(enabled?: boolean): void
enabled
boolean
Whether drawing mode should be enabled.

enableDrawingSelection()

Enables selection mode for drawings.
enableDrawingSelection(value: boolean): void
value
boolean
required
Whether selection should be enabled.

enableErasing()

Enables erasing mode - clicking drawings will delete them.
enableErasing(): void

disableErasing()

Disables erasing mode.
disableErasing(): void

selectDrawing()

Selects a drawing by its ID.
selectDrawing(id: string, keepSelection?: boolean): void
id
string
required
Drawing ID.
keepSelection
boolean
Whether to keep existing selections.
@since 5.9.0

unselectDrawing()

Unselects a drawing by its ID.
unselectDrawing(id: string): void
id
string
required
Drawing ID.
@since 5.9.0

unselectDrawings()

Unselects all drawings on this series.
unselectDrawings(): number
return
number
Number of drawings that were unselected.
@since 5.9.0

unselectAllDrawings()

Unselects all drawings on all series.
unselectAllDrawings(): number
return
number
Number of drawings that were unselected.
@since 5.9.0

deleteDrawing()

Deletes a drawing by its ID.
deleteDrawing(id: string): void
id
string
required
Drawing ID.
@since 5.9.0

deleteSelected()

Deletes all currently selected drawings on this series.
deleteSelected(): void
@since 5.9.0

cancelDrawing()

Cancels the current drawing operation.
cancelDrawing(): void
@since 5.9.0

disposeIndex()

Disposes a drawing at the specified index.
disposeIndex(index: number): void
index
number
required
Drawing index.
@since 5.7.7

getIndex()

Returns the index of a drawing with a specific ID.
getIndex(id: string): number | null
id
string
required
Drawing ID.
return
number | null
Index of the drawing, or null if not found.
@since 5.8.4

getContext()

Returns the data context for a drawing with a specific ID.
getContext(id: string): any
id
string
required
Drawing ID.
return
any
The drawing’s data context.

clearDrawings()

Clears all drawings from the series.
clearDrawings(): void

Drawing Types

SimpleLineSeries

Base class for line-based drawings.
import { SimpleLineSeries } from "@amcharts/amcharts5/stock";
showExtension
boolean
default:"true"
Show a dotted line extending from both ends of the drawn line.

addLine()

Programmatically adds a line drawing.
addLine(point: IPoint): void
point
IPoint
required
Point coordinates { x: number, y: number }.
@since 5.10.2

TrendLineSeries

Draws a trend line that snaps to data points.
import { TrendLineSeries } from "@amcharts/amcharts5/stock";

const trendLine = mainPanel.series.push(
  TrendLineSeries.new(root, {
    xAxis: dateAxis,
    yAxis: valueAxis,
    series: valueSeries,
    strokeColor: am5.color(0xff0000),
    strokeWidth: 2
  })
);

trendLine.enableDrawing();

Other Drawing Tools

amCharts 5 includes many built-in drawing tools:

Lines

  • SimpleLineSeries - Basic line
  • TrendLineSeries - Trend line snapped to data
  • HorizontalLineSeries - Horizontal line
  • VerticalLineSeries - Vertical line
  • HorizontalRaySeries - Horizontal ray extending infinitely
  • LineArrowSeries - Line with arrow
  • ParallelChannelSeries - Parallel channel
  • QuadrantLineSeries - Quadrant lines
  • RegressionSeries - Linear regression line

Shapes

  • RectangleSeries - Rectangle
  • EllipseSeries - Ellipse/circle
  • CalloutSeries - Callout with text
  • LabelSeries - Text label
  • IconSeries - Icon marker

Advanced

  • FibonacciSeries - Fibonacci retracement
  • FibonacciTimezoneSeries - Fibonacci timezone
  • AverageSeries - Average line
  • PolylineSeries - Multi-point polyline
  • DoodleSeries - Free-hand drawing
  • Measure - Measurement tool

Working with Drawings

Adding Drawings to a Chart

import { TrendLineSeries } from "@amcharts/amcharts5/stock";

const trendLine = mainPanel.series.push(
  TrendLineSeries.new(root, {
    xAxis: dateAxis,
    yAxis: valueAxis,
    series: valueSeries,
    strokeColor: am5.color(0xff0000),
    strokeWidth: 2
  })
);

Enabling Drawing Mode

// Enable drawing on the series
trendLine.enableDrawing();

// Or toggle on all drawing series
stockChart.toggleDrawing(true);

Enabling Selection

// Enable selection on the StockChart
stockChart.set("drawingSelectionEnabled", true);

// Or programmatically select a drawing
stockChart.selectDrawing("drawingId123");

Managing Drawings Programmatically

// Select a drawing
stockChart.selectDrawing("drawingId123", false);

// Unselect all drawings
stockChart.unselectDrawings();

// Delete a specific drawing
stockChart.deleteDrawing("drawingId123");

// Delete all selected drawings
stockChart.deleteSelectedDrawings();

// Cancel current drawing
stockChart.cancelDrawing();

// Clear all drawings from a series
trendLine.clearDrawings();

Listening to Drawing Events

stockChart.events.on("drawingadded", (ev) => {
  console.log("Drawing added:", ev.drawingId, ev.series, ev.index);
});

stockChart.events.on("drawingremoved", (ev) => {
  console.log("Drawing removed:", ev.drawingId);
});

stockChart.events.on("drawingselected", (ev) => {
  console.log("Drawing selected:", ev.drawingId);
});

stockChart.events.on("drawingunselected", (ev) => {
  console.log("Drawing unselected:", ev.drawingId);
});

Serialization

Drawings can be serialized and restored:
// Serialize drawings
const drawings = [];
stockChart.panels.each((panel) => {
  panel.series.each((series) => {
    if (series.isType("DrawingSeries")) {
      const data = series.data.values;
      drawings.push({
        type: series.className,
        data: data
      });
    }
  });
});

// Store drawings
localStorage.setItem("drawings", JSON.stringify(drawings));

// Restore drawings
const savedDrawings = JSON.parse(localStorage.getItem("drawings") || "[]");
savedDrawings.forEach((drawing) => {
  // Find the appropriate series and restore data
  const series = mainPanel.series.values.find(
    s => s.className === drawing.type
  );
  if (series) {
    series.data.setAll(drawing.data);
  }
});

Example

import * as am5 from "@amcharts/amcharts5";
import * as am5stock from "@amcharts/amcharts5/stock";
import * as am5xy from "@amcharts/amcharts5/xy";

const root = am5.Root.new("chartdiv");

// Create chart and series (see StockChart example)

// Add trend line drawing tool
const trendLine = mainPanel.series.push(
  am5stock.TrendLineSeries.new(root, {
    xAxis: dateAxis,
    yAxis: valueAxis,
    series: valueSeries,
    strokeColor: am5.color(0xff0000),
    strokeWidth: 2
  })
);

// Add Fibonacci retracement tool
const fibonacci = mainPanel.series.push(
  am5stock.FibonacciSeries.new(root, {
    xAxis: dateAxis,
    yAxis: valueAxis,
    series: valueSeries,
    strokeColor: am5.color(0x0000ff)
  })
);

// Add rectangle tool
const rectangle = mainPanel.series.push(
  am5stock.RectangleSeries.new(root, {
    xAxis: dateAxis,
    yAxis: valueAxis,
    series: valueSeries,
    fillColor: am5.color(0xffff00),
    fillOpacity: 0.3,
    strokeColor: am5.color(0xffff00),
    strokeWidth: 2
  })
);

// Enable drawing selection
stockChart.set("drawingSelectionEnabled", true);

// Listen to drawing events
stockChart.events.on("drawingadded", (ev) => {
  console.log("Drawing added:", ev.drawingId);
});

// Button to enable trend line drawing
document.getElementById("trendBtn").addEventListener("click", () => {
  // Disable all drawing
  stockChart.panels.each((panel) => {
    panel.series.each((series) => {
      if (series.isType("DrawingSeries")) {
        series.disableDrawing();
      }
    });
  });
  
  // Enable trend line drawing
  trendLine.enableDrawing();
});

// Button to delete selected drawings
document.getElementById("deleteBtn").addEventListener("click", () => {
  stockChart.deleteSelectedDrawings();
});

See Also

Build docs developers (and LLMs) love