Hi I would like to format my XY Bar chart so that if a data value is 0, instead of showing the bulletLabel for that value in the center of the bar it will show it located at the front of the chart outside.
I would like to apply these properties to the bullet label:
labelBullet.label.horizontalCenter = 'left'; labelBullet.locationX = 0; labelBullet.label.truncate = false; labelBullet.label.hideOversized = false;
I would thought about using an adapter, but I am not sure how to write it. Here is my sad attempt:
labelBullet.label.adapter.add('label', function (value, target) { if (!target.dataItem) { return value; } var values = target.dataItem.values; if (values.valueY.value === 0) { labelBullet.label.horizontalCenter = 'left'; labelBullet.locationX = 0; labelBullet.label.truncate = false; labelBullet.label.hideOversized = false; } });
I am not sure how to check the data value or tell it that I want to apply those properties if the data point value is 0.
Here is my series creator:
let series = chart.series.push(new am4charts.ColumnSeries()); series.name = id[0].toUpperCase() + `${id}`.slice(1); series.dataFields.valueX = field; series.dataFields.categoryY = 'school'; series.sequencedInterpolation = true; series.columns.template.height = am4core.percent(30); series.columns.template.tooltipText = '{categoryY}n {name}: [bold]{valueX}[/]'; let labelBullet = series.bullets.push(new am4charts.LabelBullet()); labelBullet.locationX = 0.5; labelBullet.label.text = '{valueX}'; labelBullet.label.fill = am4core.color('#fff'); labelBullet.label.hideOversized = true;
Here is a sample of data:
[ { school: "Fort Lewis College", totalInBaseField: "33" }, { school: "Adams State University", totalInBaseField: "0" } { school: "University of Colorado Colorado Springs", totalInBaseField: "141" } ]
The result should like like this: Here is bar with value > 0
Here is bar with value === 0
This is the desired change:
I was trying to follow this post as an example: How to conditionally set colors and make gradient to pie chart slices in amCharts v4?
Advertisement
Answer
Adapters for LabelBullet (which extends
Bullet
)
To set these properties:
labelBullet.label.horizontalCenter = 'left'; labelBullet.locationX = 0; labelBullet.label.truncate = false; labelBullet.label.hideOversized = false;
you should try an adapter for each property.
Note that an adapter must return a value. So you should try something like that:
labelBullet.label.adapter.add('horizontalCenter', function(x, target) { if(!target.dataItem) { return x; } var values = target.dataItem.values; if(values.valueY.value === 0) { return 'left'; } else { return 'right'; } }); labelBullet.adapter.add('locationX', function(x, target) { if(!target.dataItem) { return x; } var values = target.dataItem.values; if(values.valueY.value === 0) { return 0; } else { return SomethingElse; } }); labelBullet.label.adapter.add('truncate', function(x, target) { if(!target.dataItem) { return x; } var values = target.dataItem.values; if(values.valueY.value === 0) { return false; } else { return true; } });
etc.