Отображение /скрытие оси y на диаграмме Highchart с несколькими связанными рядами

#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]);
    });