Skip to main content
Version: 5.2.1

Scatter

A commonly needed visualization feature is to display a set of X+Y points scattered around.

// Creation of a scatter series
const scatterSeries = chart.addPointLineAreaSeries({ dataPattern: null })
.setStrokeStyle(emptyLine)
.setAreaFillStyle(emptyFill)

Chart with scatter seriesChart with scatter series

Adding data

This section works the same as for Line, to avoid duplication of guides, please refer to the section under Line

Point color

scatterSeries.setPointFillStyle(new SolidFill({ color: ColorRGBA(255, 0, 0) }))

For more details about style API, please see Styles, colors and fonts.

Point shape

There are a handful of shape options to choose from, like Star, Circle, Square, Arrow, etc.

scatterSeries.setPointShape(PointShape.Star)

Point size

// 5 pixels point size
scatterSeries.setPointSize(5)

Point rotation

// Rotate points by 45 degrees
scatterSeries.setPointRotation(45)

Individual colors

const scatterSeries = chart.addPointLineAreaSeries({
dataPattern: null,
colors: true
})
.setAreaFillStyle(emptyFill)
.setStrokeStyle(emptyLine)
.setPointFillStyle(new IndividualPointFill())
.appendSamples({
xValues: [4, 2, 6],
yValues: [5, 2, 8],
colors: [0xff0000ff, 0xff00ff00, 0xff00ff00], // red, green, green
})

Individual color scatter seriesIndividual color scatter series

Colors can also be supplied as Color objects created using one of the many Color factories (ColorRGBA, ColorHEX, etc.). However, for performance reasons you should avoid creating a large number of individual Color objects.

const colorRed = new SolidFill({ color: ColorRGBA(255, 0, 0) })
const colorGreen = new SolidFill({ color: ColorRGBA(0, 255, 0) })
scatterSeries
.appendSamples({
xValues: [4, 2, 6],
yValues: [5, 2, 8],
// This is fine (reuse same color objects)
colors: [colorRed, colorGreen, colorGreen],
})

Individual rotations

const scatterSeries = chart.addPointLineAreaSeries({
dataPattern: null,
rotations: true
})
.setAreaFillStyle(emptyFill)
.setStrokeStyle(emptyLine)
.appendSamples({
xValues: [4, 2, 6],
yValues: [5, 2, 8],
rotations: [0, 45, 135]
})

Color by lookup table

Alternative approach to individual colors, you can give each data point a number value, and specify rules for getting a color from any number:

const scatterSeries = chart.addPointLineAreaSeries({
dataPattern: null,
lookupValues: true
})
.setAreaFillStyle(emptyFill)
.setStrokeStyle(emptyLine)
.setPointFillStyle(new PalettedFill({
lookUpProperty: 'value',
lut: new LUT({
interpolate: true,
steps: [
{ value: 0, color: ColorCSS('red') },
{ value: 100, color: ColorCSS('green') },
]
})
}))
.appendSamples({
xValues: [4, 2, 6],
yValues: [5, 2, 8],
lookupValues: [0, 100, 50]
})
const legend = chart.addLegendBox().add(chart)

Lookup color scatter seriesLookup color scatter series

LUT has also a percentageValues option, which you can use if you want to use % values of the present min-max lookup value range, rather than specific value steps:

new LUT({
percentageValues: true,
interpolate: true,
steps: [
// 0 = 0 %, 1 = 100%
{ value: 0, color: ColorCSS('red') },
{ value: 1, color: ColorCSS('green') },
]
})

Color by X or Y

Instead of using lookup values in data set, you can also use X or Y coordinates directly, by changing the lookUpProperty value in PalettedFill.

new PalettedFill({
lookUpProperty: 'x', // 'x' or 'y'
lut: new LUT({
interpolate: true,
steps: [
{ value: 0, color: ColorCSS('red') },
{ value: 100, color: ColorCSS('green') },
]
})
})

Color by gradient

More alternatives to dynamic coloring - you can also define a gradient (linear or radial), to color the points.

const scatterSeries = chart.addPointLineAreaSeries({ dataPattern: null })
.setAreaFillStyle(emptyFill)
.setStrokeStyle(emptyLine)
.setPointFillStyle(new LinearGradientFill({
// down -> up
angle: 0,
stops: [
{ offset: 0, color: ColorCSS('red') },
{ offset: 1, color: ColorCSS('green') },
],
}))

Gradient color scatter seriesGradient color scatter series

Using timestamps

This section works the same as for Line, to avoid duplication of guides, please refer to the section under Line

Data cleaning / maximum memory use

This section works the same as for Line, to avoid duplication of guides, please refer to the section under Line

Connecting to non-default axis

This section works the same as for Line, to avoid duplication of guides, please refer to the section under Line

Solve nearest from location

This section works the same as for Line, to avoid duplication of guides, please refer to the section under Line

Edit samples data

This section works the same as for Line, to avoid duplication of guides, please refer to the section under Line