Chart.js折れ線グラフのラベル数を制限する


93

取得したデータからチャート上のすべてのポイントを表示したいのですが、それらのすべてのラベルを表示したくありません。チャートが読みにくいためです。ドキュメントで探していましたが、これを制限するパラメータが見つかりませんでした。

たとえば、グラフも3つのポイントに制限されているため、ラベルを3つだけ取りたくありません。出来ますか?

私は今そのようなものを持っています:

ここに画像の説明を入力してください

3/4のレーベルを残すだけでいいのであれば、それは素晴らしいことです。しかし、ラベルオプションについてはまったく何も見つかりませんでした。


リンクを提供できますか?
Dheeraj 2014

ウェブサイトへ?いや、私はAndroid上のアプリをやっているし、このチャートは、私の地元のページに..です
MMMM

使用するライブラリを指定してください。DevExpressのChartJSまたはChart.jsですか?
Pavel Gruba

@mmmm何か分かりましたか?以下のニキータの答えを試しましたが、この奇妙なギャップが残りました:jsfiddle.net/askhflajsf/xzk6sh1q
Mark Boulder

ニキータの答えは正しいようです。@mmmm、正解としてマークご検討くださいstackoverflow.com/a/39326127/179138
カイオ・クーニャ

回答:


148

options.scales.xAxes.ticks.maxTicksLimitオプションを追加してみてください:

xAxes: [{
    type: 'time',
    ticks: {
        autoSkip: true,
        maxTicksLimit: 20
    }
}]

4
上記の回答に加えて、ここでのスタックオーバーフロー.com / a / 37257056/558094が爆弾です。
Vinayak Garg

3
ここは何かがおかしい。最後の2つのティックの間で大きなギャップが生じています:jsfiddle.net/askhflajsf/xzk6sh1q
Mark Boulder

2
この情報はどこから入手しますか?私がChart.jsについて読んでいる多くのunswers-私はドキュメントで見つけることができませんchartjs.org/docs/latest、ドキュメント化されたこれらの小さなプロパティとオーバーライド可能なコールバックを実際に見つけることができる場所がありませんか?
Max Yari

1
サー、あなたは素晴らしいです!
ジェイギース

1
maxRotation: 0ラベルのドロップを開始する前に回転させたくない場合は、追加することもできます。
Caio Cunha

22

具体的には、元のラベルのリストが次のようになっているとします。

["0", "1", "2", "3", "4", "5", "6", "7", "8"]

4番目ごとのラベルのみを表示する場合は、ラベルのリストをフィルタリングして、4番目ごとのラベルが入力され、その他すべてのラベルが空の文字列になるようにします(例:)["0", "", "", "", "4", "", "", "", "8"]


これは素晴らしいハックです、ありがとう!ここに追加しました
Trufa 2014年

40
合格""すると、グラフ上の対応するツールチップも削除されます。
Haywire、2014年

3
私が間違っていない限り、たとえば10番目ごとのラベルを表示したい場合は、リスト内包でこれを簡単に行うことができます my_labels = [my_labels[i] if i % 10 == 0 else "" for i in range(len(my_list))]。もちろん、プロセスのパラメーター化を容易にするために、ファイルの先頭で10を定数として宣言できます。
pkaramol

それもせずに行うことができる""この質問への答えのように、chart.js垂直girdラインの問題、それはのように、再び、助けたような場合には、OPは、この二重引用符の最初に現れる黒い線が現れるとの問題を持っていました@ haywireは、ツールチップからラベルを削除すると述べています
Mi-Creativity

15

Chart JS V2でこれを達成したいと考えている人にとっては、以下が機能します:

 var options =  {  
         scales: {
            xAxes: [{
                afterTickToLabelConversion: function(data){


                    var xLabels = data.ticks;

                    xLabels.forEach(function (labels, i) {
                        if (i % 2 == 1){
                            xLabels[i] = '';
                        }
                    });
                } 
            }]   
        }
}

次に、オプション変数を通常どおりaに渡します。

myLineChart = new Chart(ctx, {
    type: 'line',
    data: data,
    options: options
});`

13

更新:

NNickのChart.jsマスターブランチからの最新のプル(2014年1月27日現在)でフォークを更新しました。 https://github.com/hay-wire/Chart.js/tree/showXLabels

元の回答:

まだこの問題に直面している人たちのために、私は同じ問題を解決するためにChart.jsをしばらくフォークしました。あなたはそれをチェックアウトすることができますhttps//github.com/hay-wire/Chart.js/tree/skip-xlabels =>古いブランチ!最新のプルについては、showXLabelsブランチを確認してください。

使い方:

棒グラフと折れ線グラフに適用できます。

ユーザーはa { showXLabels: 10 }を渡して10のラベルのみを表示できます(実際に表示されるラベルの数は、x軸に存在するラベルの総数によって多少異なる場合がありますが、10に近いままです)。

非常に大量のデータがある場合に役立ちます。以前は、窮屈な空間でx軸のラベルが重なり合っているため、グラフが荒々しく見えていました。を使用するとshowXLabels、ユーザーは、ラベルの数を、使用可能なスペースに収まるラベルの数まで減らすことができます。

比較については、添付の画像を参照してください。

showXLabelsオプションなし: ここに画像の説明を入力してください

では{ showXLabels: 10 }オプションに渡されます。 ここに画像の説明を入力してください

これについていくつかの議論があります:https : //github.com/nnnick/Chart.js/pull/521#issuecomment-60469304


これを使用したいのですが、何か間違ったことをしているに違いありません。github.com/hay-wire/Chart.js/blob/showXLabels/Chart.jsを参照しましたが、(2015年10月30日現在)機能せず、「showXLabels」というフレーズも含まれていません。github.com/hay-wire/Chart.js/blob/skip-xlabels/Chart.jsにある古いバージョンは問題なく動作します。RawGitから安全にCDNリンクできるように、最新のタグ付きバージョンが動作するようにしたいと思います。このフィドル(問題だけを抽出
45cLcxdh

これを使用してみましたが、 'Chart.Line.js'は使用されていないように見えるため、何も変更されません。「新しいChart(ctx).Line(data、options);」を使用しました。チャートを作成します。
FlyingNimbus 2016年

Chart JS 2.6.0とオプションの使用は機能しません。最終的には、@ benの回答を使用する必要がありましたstackoverflow.com/a/26183983/3319454
3bdalla

1
私は、これは、以前のバージョンの一部だと思う
alexalejandroem

@alexalejandroemはい、2014年に回答がありました。;-)
Haywire '13

3

軸回転用

これを使って:

          scales: {
        xAxes: [
          {
            // aqui controlas la cantidad de elementos en el eje horizontal con autoSkip
            ticks: {
              autoSkip: true,
              maxRotation: 0,
              minRotation: 0
            }
          }
        ]
      }

2

chart.js github issue#12によると。現在のソリューションは次のとおりです。

  1. 2.0アルファ版を使用する(製品版ではない)
  2. 混雑してくると、x軸をまったく非表示にします(まったく受け入れられません)。
  3. x軸のラベルスキップを手動で制御します(レスポンシブページではありません)

しかし、数分後、もっと良い解決策があると思います。

次のスニペットは、ラベルを自動的に非表示にしますxLabels呼び出す前に空の文字列で変更し、draw()後で復元します。さらに、非表示にした後のスペースが増えるため、xラベルの再回転を適用できます。

var axisFixedDrawFn = function() {
    var self = this
    var widthPerXLabel = (self.width - self.xScalePaddingLeft - self.xScalePaddingRight) / self.xLabels.length
    var xLabelPerFontSize = self.fontSize / widthPerXLabel
    var xLabelStep = Math.ceil(xLabelPerFontSize)
    var xLabelRotationOld = null
    var xLabelsOld = null
    if (xLabelStep > 1) {
        var widthPerSkipedXLabel = (self.width - self.xScalePaddingLeft - self.xScalePaddingRight) / (self.xLabels.length / xLabelStep)
        xLabelRotationOld = self.xLabelRotation
        xLabelsOld = clone(self.xLabels)
        self.xLabelRotation = Math.asin(self.fontSize / widthPerSkipedXLabel) / Math.PI * 180
        for (var i = 0; i < self.xLabels.length; ++i) {
            if (i % xLabelStep != 0) {
                self.xLabels[i] = ''
            }
        }
    }
    Chart.Scale.prototype.draw.apply(self, arguments);
    if (xLabelRotationOld != null) {
        self.xLabelRotation = xLabelRotationOld
    }
    if (xLabelsOld != null) {
        self.xLabels = xLabelsOld
    }
};

Chart.types.Bar.extend({
    name : "AxisFixedBar",
    initialize : function(data) {
        Chart.types.Bar.prototype.initialize.apply(this, arguments);
        this.scale.draw = axisFixedDrawFn;
    }
});

Chart.types.Line.extend({
    name : "AxisFixedLine",
    initialize : function(data) {
        Chart.types.Line.prototype.initialize.apply(this, arguments);
        this.scale.draw = axisFixedDrawFn;
    }
});

これcloneは外部依存関係であることに注意してください。



0

この答えは魅力のように機能します。

clone関数について疑問がある場合は、これを試してください:

var clone = function(el){ return el.slice(0); }

-1

Chart.jsファイルで(884行目)を見つけます。

var Line = function(...
    ...
    function drawScale(){
        ...
        ctx.fillText(data.labels[i], 0,0);
        ...

あなただけに、1つのラインの呼び出しをラップした場合fillTextif ( i % config.xFreq === 0){ ... } 、その後にchart.Line.defaults追加何かラインxFreq : 1あなたが使用を開始することができるはずですxFreq、あなたにoptionsあなたが呼び出すときnew Chart(ctx).Line(data, options)

これはかなりハッキーです。


3
元のライブラリファイルを変更しないでください。バージョンの更新後に破損します。
ラプター2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.