In XYChart
we are used to plot series from the values that appear in data. This tutorial will show how we can plot from other auto-calculated values such as percent or change.
Intro
For an XYSeries
to work - be it LineSeries
, ColumnSeries
, or some other type - we need to bind it to data. We do that via "data fields".
For example, if we want to plot a horizontal LineSeries
from data which has "value" and "date" keys in its data points, we'll bind series' valueY
and dateX
data fields:
series.dataFields.dateX = "date"; series.dataFields.valueY = "value";
series.dataFields.dateX = "date"; series.dataFields.valueY = "value";
{ // ... "series": [{ "type": "LineSeries", "dataFields": { "valueX": "date", "valueY": "value" } }] }
Suppose our data contains three data points with values 10
, 15
, and 2
.
If we run such chart, we'll get a line that is plotted at exactly those values in the scale:
Let's see how we can change that to plot from other values.
Auto-calculated values
Using auto-calculated values
While informative of absolute values, the above chart does not convey the dynamic of changes as strongly as it might.
In some charts, especially ones that show stock data, a derivative "change" values are used to plot the data.
By default, series uses its dataFields
like valueY
to plot data.
However, each series supports also additional data fields, like valueYShow
, which as the name suggest, is a reference to some derivative value to be used instead of the absolute value when plotting the series.
In other words the valueYShow
data field means: "use this auto-calculated value instead of absolute values, when plotting chart".
If we want to show percent changes from the initial (first) value, we can use "changePercent"
:
series.dataFields.dateX = "date"; series.dataFields.valueY = "value"; series.dataFields.valueYShow = "changePercent";
series.dataFields.dateX = "date"; series.dataFields.valueY = "value"; series.dataFields.valueYShow = "changePercent";
{ // ... "series": [{ "type": "LineSeries", "dataFields": { "dateX": "date", "valueY": "value", "valueYShow": "changePercent" } }] }
If we ran the chart now, we'd get a chart plotted not bu absolute values, but by their percent change in comparison to the first value in series.
NOTE change
and changePercent
values are caculated from the first data item in selected range, not absolutely first data item in series. It means that values can change significantly when chart is zoomed.
Alternatively, if we would have used "previousChangePercent"
, the chart would be plotted showing percent change from previous value.
Available calculated values
Here's a complete list of available options:
Value | Comment |
---|---|
"value" | Absolute value. Using this does not make sense since series are plotted by their absolute values by default. |
"percent" | Percent of the value in stack. Calculated only if respective ValueAxis has calculateTotals = true set. |
"change" | Difference between this value and the value of the first data item in series within selected range (view). |
"changePercent" | Difference in percent between this value and the value of the first data item in series within selected range (view). |
"previousChange" | Difference between this value and the value of the previous data item in series |
"previousChangePercent" | Difference in percent between this value and the value of the previous data item in series |
startChange | Difference between this value and the value of the first data item in series. |
startChangePercent | Difference in percent between this value and the value of the first data item in series. |
"sum" | Sum of all values in stack. Calculated only if respective ValueAxis has calculateTotals = true set. |
"average" | Average of all values in stack. Calculated only if respective ValueAxis has calculateTotals = true set. |
"open" | Instructs to plot the series from its "openValueY" or "openValueX" data field. |
"close" | Instructs to plot the series from its "closeValueY" or "closeValueX" data field. |
"low" | Instructs to plot the series from its "lowValueY" or "lowValueX" data field. |
"high" | Instructs to plot the series from its "highValueY" or "highValueX" data field. |
"count" | Count of values in stack. Calculated only if respective ValueAxis has calculateTotals = true set. |
"total" | Sum of absolute values in stack. Calculated only if respective ValueAxis has calculateTotals = true set. |
"totalPercent" | Sum of percents of values in stack. Calculated only if respective ValueAxis has calculateTotals = true set. |
"stack" | A "start" value of the item when used series used in stack. |
Modifying related controls
Since our chart no longer uses absolute values but rather percent, we might need other chart elements to reflect that.
First, since our values are now percent, we need our ValueAxis
to show percent symbol next to values. We can do so via an adapter:
valueAxis.renderer.labels.template.adapter.add("text", function(text) { return text + "%"; });
valueAxis.renderer.labels.template.adapter.add("text", function(text) { return text + "%"; });
{ // ... "yAxes": [{ "type": "ValueAxis", // ... "renderer": { "labels": { "adapter": { "text": function(text) { return text + "%"; } } } } }] }
Next, we need the tooltip to show percent, instead of absolute value:
series.tooltipText = "{dateX}: [b]{valueY.changePercent}[/]%";
series.tooltipText = "{dateX}: [b]{valueY.changePercent}[/]%";
{ // ... "series": [{ "type": "LineSeries", // ... "tooltipText": "{dateX}: [b]{valueY.changePercent}[/]%" }] }
Example
See the Pen amCharts 4: Using calculated values for plotting series by amCharts team (@amcharts) on CodePen.