I am using angular5
with angular-highcharts
library for showing charts. Following is my working chart except that y-axis is not hidden when there is no data to plot. Is there a property or a way i can hide y-axis and its labels when there is no data to plot on the graph ?
this.chartConfig = {
chart: {
type: 'column',
height: this.height,
style: {fontFamily: 'inherit'}
},
title: {
text: null
},
exporting: {
enabled: false
},
legend: {
enabled: false
},
credits: {
enabled: false
},
lang: {
noData: null
},
plotOptions: {
series: {
animation: true,
connectNulls: true,
marker: {
symbol: 'circle',
lineWidth: 1,
lineColor: '#fff'
}
},
column: {
states: {
hover: {
enabled: false
}
},
pointPadding: 0,
borderWidth: 0.1,
pointWidth: 20,
dataLabels: {
enabled: false
}
}
},
xAxis: {
type: 'datetime',
tickInterval: 24 * 3600 * 1000,
labels: {
rotation: -60
}
},
yAxis: {
min: 0,
max: 150,
ceiling: 150,
gridLineWidth: 0,
title: {
text: null
}
},
series: [],
};
//assign/bind the data here after the config is initialized
this.chartConfig.series = [{
data: [{
x: Date.UTC(2012, 0, 1),
y: 1
}, {
x: Date.UTC(2012, 0, 8),
y: 3
}, {
x: Date.UTC(2012, 0, 15),
y: 2
}, {
x: Date.UTC(2012, 0, 22),
y: 4
}],
pointRange: 24 * 3600 * 1000
}];
//finally create the Chart object here with the config
this.chart = new Chart(this.chartConfig);
});
}
I have tried adding show/hide events like this but its throwing errors even for the respective events.
plotOptions: {
series: {
events: {
hide: function (event) {
//custom code here
},
show: function (event) {
//custom code here
}
}
}
}
None of the options worked, as mentioned in the first comment of my question doing it manually worked. I don't know if it's definitely the cleanest way to do it or not.
//declare your flag to show/hide axis/labels globally
let showYAxisLabels:boolean;
this.chartConfig = {
chart: {
type: 'column',
height: this.height,
style: {fontFamily: 'inherit'}
},
title: {
text: null
},
exporting: {
enabled: false
},
legend: {
enabled: false
},
credits: {
enabled: false
},
lang: {
noData: null
},
plotOptions: {
series: {
animation: true,
connectNulls: true,
marker: {
symbol: 'circle',
lineWidth: 1,
lineColor: '#fff'
}
},
column: {
states: {
hover: {
enabled: false
}
},
pointPadding: 0,
borderWidth: 0.1,
pointWidth: 20,
dataLabels: {
enabled: false
}
}
},
xAxis: {
type: 'datetime',
tickInterval: 24 * 3600 * 1000,
labels: {
rotation: -60
}
},
yAxis: {
min: 0,
max: 150,
ceiling: 150,
gridLineWidth: 0,
title: {
text: null
},
//add labels here and check based on your flag to show/hide
labels: {
formatter: function () {
//check your flag here to show/hide labels
if (this.showYAxisLabels) {
return this.value;
}
}
}
},
series: [],
};
//assign/bind the data here after the config is initialized
this.chartConfig.series = [{
data: [{
x: Date.UTC(2012, 0, 1),
y: 1
}, {
x: Date.UTC(2012, 0, 8),
y: 3
}, {
x: Date.UTC(2012, 0, 15),
y: 2
}, {
x: Date.UTC(2012, 0, 22),
y: 4
}],
pointRange: 24 * 3600 * 1000
}];
//set your show/hide flag here based on your functionality
this.showYAxisLabels = this.showHideYAxisLabels(this.chartConfig.series[0].data);//pass the respective data set based on your requirement
//finally create the Chart object here with the config
this.chart = new Chart(this.chartConfig);
});
}
showHideYAxisLabels(data) {
//write your custom logic based on your requirement, following works
//for my requirement
if (_.filter(data, item => {
return (item as any).y !== null;
}).length > 0) {
//show labels and hence axis
return true;
} else {
//hide labels and hence axis
return false;
}
}
If there is a better/cleaner way to do this, please let me know !