#highcharts
#highcharts
Вопрос:
Я работаю с Highchart. У меня есть график с несколькими рядами, в котором несколько рядов могут быть связаны с одной и той же осью y. Связь основана на единице измерения, которая также является идентификатором оси y. Ряды добавляются динамически.
Каждая ось y имеет setExtremes(), отличную от null, и по этой причине я столкнулся с одной проблемой, которую, похоже, я не могу решить.
- При скрытии ряда. Я хочу, чтобы ассоциативная ось y была видимой до тех пор, пока все ряды, связанные с этой конкретной осью, также не будут скрыты. На данный момент я смог просто скрыть ось y, как только для одного из рядов установлено значение series.hide()
Используемый код представлен ниже. И может быть доступен в jsfiddle следующим образом: http://jsfiddle.net/39xBU/134 / .
$(function () {
//creates chart options
var options = {
chart: {
renderTo: 'container',
zoomType: 'xy'
},
title: {
text: 'Axis manipulation'
},
xAxis: [{
categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
}],
yAxis: [{ // Primary yAxis
id:'°C',
labels: {
formatter: function() {
return this.value '°C';
},
style: {
color: '#89A54E'
}
},
title:{
text:''
},
opposite: true,
showEmpty: false
}, { // Secondary yAxis
id:'mm',
gridLineWidth: 0,
labels: {
formatter: function() {
return this.value ' mm';
},
style: {
color: '#4572A7'
}
},
title:{
text:''
},
showEmpty: false
}],
tooltip: {
formatter: function() {
var unit = {
'Rainfall': 'mm',
'Temperature': '°C',
'Sea-Level Pressure': 'mb'
}[this.series.name];
return ''
this.x ': ' this.y ' ' unit;
}
},
legend: {
layout: 'vertical',
align: 'left',
x: 120,
verticalAlign: 'top',
y: 80,
floating: true,
backgroundColor: '#FFFFFF'
},
series: []
};
// Adds series to the chart. i do this because in the real application I add data dinamically
options.series.push({
name: 'Rainfall',
color: '#4572A7',
type: 'spline',
yAxis: getAssociativeYAxisIndex('mm', options.yAxis),
data: [149.9, 171.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1, 195.6, 154.4]
});
options.series.push({
name: 'Sea-Level Pressure',
type: 'spline',
color: '#4572A7',
yAxis: getAssociativeYAxisIndex('mm', options.yAxis),
data: [116, 116, 115.9, 115.5, 112.3, 109.5, 109.6, 110.2, 113.1, 116.9, 118.2, 116.7],
marker: {
enabled: false
},
dashStyle: 'shortdot'
});
options.series.push({
name: 'Temperature',
color: '#89A54E',
type: 'column', // date is not shown only if it is 'spline'
yAxis:getAssociativeYAxisIndex('°C', options.yAxis),
data: [7.0, 6.9, 9.5, 14.5, 18.2, 21.5, 25.2, 26.5, 23.3, 18.3, 13.9, 9.6]
});
var chart = new Highcharts.Chart(options);
//after rendering I set axis limits, based on their measurement unit.
var yAxis1 = chart.get('mm');
yAxis1.setExtremes(0, 200);
var yAxis2 = chart.get('°C');
yAxis2.setExtremes(0, 40);
// hide Rainfall button
$("#b1").click(function(){
chart.series[0].hide()
chart.yAxis[1].update({
labels: {
enabled: false
},
title: {
text: null
}
});
});
// hide sealevel button
$("#b").click(function(){
chart.series[1].hide()
chart.yAxis[1].update({
labels: {
enabled: false
},
title: {
text: null
}
});
});
// delete rainfall button
$("#b2").click(function(){
chart.series[0].remove();
chart.yAxis[1].setExtremes(null, null);
});
// delete sea-level button
$("#b3").click(function(){
chart.series[1].remove();
chart.yAxis[1].setExtremes(null, null);
});
//get's series associatie axis
function getAssociativeYAxisIndex(seriesMeasureUnit, yAxis) {
var axisIndex = -1;
$.each(yAxis, function (index, axes) {
if (seriesMeasureUnit == axes.id) {
axisIndex = index;
return false;
}
});
return axisIndex;
};
});
Любые предложения по этому вопросу были бы очень полезны.
Ответ №1:
Вы можете просто проверить, все ли ряды скрыты, следующим образом: http://jsfiddle.net/39xBU/135 /
И код:
-
новая функция, облегчающая чтение:
function hideShowAxis(series) { var axis = series.yAxis, show = false; $.each(axis.series, function (i, e) { if (e.visible) { show = true; } }); axis.update({ labels: { enabled: show } }); }
-
и выполнить:
// hide Rainfall button $("#b1").click(function () { chart.series[0].hide() hideShowAxis(chart.series[0]); }); // hide sealevel button $("#b").click(function () { chart.series[1].hide() hideShowAxis(chart.series[1]); });