Chart Bubble Series
BubbleSeries are a type of CategoricalSeries that present categorical data with bubble shapes plot on cartesian coordinates based on the values that they represent. The bubble chart usually shows comparisons among discrete categories but can also be used to visualize a trend in data over intervals of time. They differ from BarSeries not only by the shape used, but also that they can visualize a third value (on top of category and value) through the size of the bubbles. If you want to show bubbles for data which is not categorical, you can use ScatterBubbleSeries.
Setup
To display a Bubble Chart, you will need to:
- Add RadCartesianChart to your page.
- Set the chart's horizontalAxis to a category axis (CategoricalAxis, DateTimeCategoricalAxis or DateTimeContinuousAxis).
- Set the chart's verticalAxis to a value axis (LinearAxis or LogarithmicAxis).
- Add at least one instance of BubbleSeries to the chart's series property and set its items property to a collection of data items, its categoryProperty set to the name of the property of the data items that will be used to determine their category, its valueProperty to the name of the property used to determine their value and its bubbleSizeProperty to the name of the property used to determine the size of the bubble.
To illustrate this setup, let's create an example. First we will create a source with items:
Example 1: Define a source with data
export class BubbleDataModel {
constructor() {
}
get highDataModel() {
return [
{ Year: 2000, Amount: 15, Impact: 1 },
{ Year: 1456, Amount: 13, Impact: 7 },
{ Year: 1866, Amount: 25, Impact: 10 },
{ Year: 1900, Amount: 5, Impact: 3 },
{ Year: 1700, Amount: 17, Impact: 4 },
{ Year: 1600, Amount: 20, Impact: 1 },
];
}
get middleDataModel() {
return [
{ Year: 1200, Amount: 15, Impact: 1 },
{ Year: 1156, Amount: 13, Impact: 7 },
{ Year: 1000, Amount: 25, Impact: 10 },
{ Year: 900, Amount: 5, Impact: 3 },
{ Year: 700, Amount: 17, Impact: 4 },
{ Year: 600, Amount: 20, Impact: 1 },
];
}
get lowDataModel() {
return [
{ Year: 200, Amount: 15, Impact: 1 },
{ Year: 456, Amount: 13, Impact: 7 },
{ Year: 366, Amount: 25, Impact: 10 },
{ Year: 100, Amount: 5, Impact: 3 },
{ Year: 340, Amount: 17, Impact: 4 },
{ Year: 135, Amount: 20, Impact: 1 },
];
}
}
We use an instance of this model to assign it as the bindingContext of the page we have put our Bubble series on:
Example 2: Update bindingContext
import { BubbleDataModel } from "../../data-models/bubble-data-model";
export function onPageLoaded(args) {
const page = args.object;
page.bindingContext = new BubbleDataModel();
}
And finally, in the XML definition of the page we put a RadCartesianChart
, add a BubbleSeries
instance to it and bind the series to the source of data:
Example 3: Add chart to page's markup
<navigation:ExamplePage xmlns:navigation="navigation/example-page" loaded="onPageLoaded" xmlns:chart="nativescript-ui-chart" xmlns="http://www.nativescript.org/tns.xsd">
<chart:RadCartesianChart id="bubbleChart">
<chart:RadCartesianChart.verticalAxis>
<chart:LinearAxis />
</chart:RadCartesianChart.verticalAxis>
<chart:RadCartesianChart.horizontalAxis>
<chart:CategoricalAxis verticalLocation="Bottom" labelFitMode="Rotate" labelRotationAngle="1.2"/>
</chart:RadCartesianChart.horizontalAxis>
<chart:RadCartesianChart.series>
<chart:BubbleSeries items="{{ highDataModel }}" bubbleScale="5" categoryProperty="Year" valueProperty="Amount" bubbleSizeProperty="Impact" />
<chart:BubbleSeries items="{{ middleDataModel }}" bubbleScale="5" categoryProperty="Year" valueProperty="Amount" bubbleSizeProperty="Impact" />
<chart:BubbleSeries items="{{ lowDataModel }}" bubbleScale="5" categoryProperty="Year" valueProperty="Amount" bubbleSizeProperty="Impact" />
</chart:RadCartesianChart.series>
</chart:RadCartesianChart>
</navigation:ExamplePage>
Figure 1: Chart with BubbleSeries on Android (left) and iOS (right)
Bubble Scale
Additionally, BubbleSeries
expose a bubbleScale
property which can be used to fine-tune the size of the bubbles according to specific application requirements. The way the bubbleScale
property works is by multiplying its value to the radius calculated for each data-point's bubble to determine the bubble's final size.
References
Want to see this scenario in action? Check our SDK examples repo on GitHub. You will find this and many other practical examples with NativeScript UI.
Examples used in this article:
Related articles you might find useful: