web-dev-qa-db-ja.com

ハイチャートシリーズ-選択したシリーズ以外のすべてを表示/非表示にする(デフォルトロジックの反転)

デフォルトでは、Highchartsはデータシリーズセットをクリックして非表示/再表示することができます。

より有用なアプローチは、逆のロジックを実行することです。つまり、選択されたシリーズのみを表示し、選択されていないシリーズを非表示/再表示します。

ここの例( http://jsfiddle.net/t2MxW/14/ )を見ると、「legendItemClick」イベントを「インターセプト」できることは明らかです。実装方法はわかりません。 requireロジック

以下のスクリプトを置き換えると、3つのデータセットを取得できます。

望ましいシナリオ:「りんご」をクリックして、「梨」や「オレンジ」などを表示/非表示にできるようにします。

=================貼り付け開始=============================== ========

var chart = new Highcharts.Chart({
    chart: {
        renderTo: 'container'
    },
    xAxis: {
        categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
    },

    plotOptions: {
        series: {
            events: {
                legendItemClick: function(event) {
                    var visibility = this.visible ? 'visible' : 'hidden';
                    if (!confirm('The series is currently '+ 
                                 visibility +'. Do you want to change that?')) {
                        return false;
                    }
                }
            }
        }
    },

    series:[{name: 'apples',
            data: [29.9, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1, 95.6, 54.4]},
    {name:'pears',
    data: [19.9, 81.5, 96.4, 119.2, 124.0, 166.0, 155.6, 138.5, 116.4, 144.1, 95.6, 54.4]},

           {name:'oranges',
    data: [119.9, 181.5, 46.4, 219.2, 24.0, 66.0, 255.6, 238.5, 16.4, 44.1, 95.6, 54.4]}
           ]   

});
28
Ian

HighChartsのすべてのイベントには、現在の要素(この場合は系列)を含むthis値が含まれています。 this.chart.seriesを使用してすべてのシリーズを選択し、好きな方法で処理できます。この機能を試してください。

legendItemClick: function(event) {
    if (!this.visible)
        return false;

    var seriesIndex = this.index;
    var series = this.chart.series;

    for (var i = 0; i < series.length; i++)
    {
        if (series[i].index != seriesIndex)
        {
            series[i].visible ?
            series[i].hide() :
            series[i].show();
        } 
    }
    return false;
}

フィドル: https://jsfiddle.net/t2MxW/21971/

46
Igor Dymov

同様のことをしたかった...凡例のアイテムをコントロールクリック(またはcmd-クリック)すると、他のすべてのアイテムが非表示になるようにしたかった。 (ただし、通常のクリックはデフォルトの動作のままにします)。

plotOptions: {
    series: {
        events: {
            legendItemClick: function(e) {
                // Upon cmd-click of a legend item, rather than toggling visibility, we want to hide all other items.
                var hideAllOthers = e.browserEvent.metaKey;
                if (hideAllOthers) {
                    var seriesIndex = this.index;
                    var series = this.chart.series;

                    for (var i = 0; i < series.length; i++) {
                        // rather than calling 'show()' and 'hide()' on the series', we use setVisible and then
                        // call chart.redraw --- this is significantly faster since it involves fewer chart redraws
                        if (series[i].index === seriesIndex) {
                            if (!series[i].visible) series[i].setVisible(true, false);
                        } else {
                            if (series[i].visible) series[i].setVisible(false, false);
                        }
                    }
                    this.chart.redraw();
                    return false;
                }
            }
        }
    }
}
9
philfreo

@igorの答えを共有するだけではうまくいかないので、調整しました。ここにフィドルがあります(@igorの答えから分岐)。

http://jsfiddle.net/index/Nkeep/

2
index

通常の機能を維持しながら、すべてを表示/非表示にしたい場合は、show_all()/hide_all() javascriptメソッドのボタンまたはリンクを作成します。

このメソッドは、カウンターを初期化し、表示/非表示を開始します。

_counter = 0;
setTimeout(process_hide, 1);

function process_hide()
{
    your_chart.series[counter].hide();
    counter+=1;
    if (counter < read_chart.series.length) {
        setTimeout(process_hide, 1);
    }
}
_

$.each(your_chart, function(i,v){v.hide()})を実行する代わりにこれを行う理由は、UIをロックするためです-タイムアウトを使用すると、シリーズが1つずつ非表示になっていることがわかります-他の何かを変更したい場合-プロセスメーター、それは実際に動作します。

1
Bjorn

分岐したインデックスの回答と、シリーズごとに個別のトグルを持つ機能が追加されました。 http://jsfiddle.net/c4Zd8/1/

$.each(allSeries, function(index, series) {
    if (selected == index) {
        if (series.visible == true) {
            series.hide();
        }
        else {
            series.show();
        }
    }
});
1
IceWarrior353

振る舞いを変更したかったため、分岐しました。元々、ユーザーが2つのシリーズを選択してから1つのシリーズの選択を解除しようとすると、シリーズ全体が表示を入れ替えました。シリーズの表示を切り替える前に、他のすべてのシリーズが「他のすべてが表示されている」か「その他すべてが表示されていない」かどうかを最初に確認します。

http://jsfiddle.net/nd0dcdmz/3/

legendItemClick: function(e) {
    var seriesIndex = this.index;
    var series = this.chart.series;

    // test for if all other series besides one selected are visible or not visible
    var allElseVisible = series.every(
      s => (s.index == seriesIndex ? true : s.visible),
    );
    var allElseNotVisible = series.every(
      s => (s.index == seriesIndex ? true : !s.visible),
    );

    // if everything else is deselected or selected ... swap visibility
    // else swap the visibility of selected object.
    if (allElseVisible || allElseNotVisible) {
      series.map(s => {
        if (s.index != seriesIndex) {
          s.visible ? s.hide() : s.show();
        }
      });
    } else {
      return true;
    }

    return false; // overrides default behavior
},
0
Cyrus Dukart