Chart.js çizgi grafiğinde etiket sayısını sınırlayın


98

Grafiğimdeki tüm noktaları aldığım verilerden görüntülemek istiyorum, ancak onlar için tüm etiketleri görüntülemek istemiyorum, çünkü o zaman grafik çok okunabilir değildir. Dokümanlarda arıyordum ama bunu sınırlayacak herhangi bir parametre bulamadım.

Örneğin sadece üç etiket almak istemiyorum çünkü o zaman grafik de üç nokta ile sınırlıdır. Mümkün mü?

Şu anda buna benzer bir şeyim var:

görüntü açıklamasını buraya girin

Her üçüncü-dördüncü etiketten bir ayrılabilseydim harika olurdu. Ancak etiket seçenekleri hakkında kesinlikle hiçbir şey bulamadım.


bağlantı sağlayabilir misin
Dheeraj

web sitesine? hayır, android üzerinde uygulama yapıyorum ve bu grafik yerel sayfamda ..
mmmm

Lütfen hangi kütüphaneyi kullandığınızı belirtin, ChartJS by DevExpress veya Chart.js?
Pavel Gruba

@mmmm bir şey çözdün mü? Aşağıda Nikita'nın cevabını denedim ama bu beni garip bir boşluk bıraktı: jsfiddle.net/askhflajsf/xzk6sh1q
Mark Boulder

Nikita'nın cevabı doğru gibi görünüyor. @mmmm, lütfen doğru yanıt olarak işaretlemeyi düşünün stackoverflow.com/a/39326127/179138
Caio Cunha

Yanıtlar:


158

options.scales.xAxes.ticks.maxTicksLimitSeçeneği eklemeyi deneyin :

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

4
Yukarıdaki cevap artı buradaki cevap stackoverflow.com/a/37257056/558094 , bombadır.
Vinayak Garg

3
Burada bir şeyler yanlış. Son iki tik arasında büyük bir boşluk görüyorum
Mark Boulder

2
Bu bilgiyi nereden alıyorsun? Chart.js için okuduğum bir çok unswers - belgelerinde chartjs.org/docs/latest bulamıyorum, tüm bu küçük özellikleri ve belgelenmiş geçersiz kılınabilen geri aramaları bulabileceğim bir yeri mi kaçırıyorum?
Max Yari

1
efendim, harikasınız!
Jay Geeth

2
maxRotation: 0Etiketleri düşürmeye başlamadan önce dönmemesini istiyorsanız da ekleyebilirsiniz .
Caio Cunha

23

Somutluk açısından, orijinal etiket listenizin şöyle göründüğünü varsayalım:

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

Yalnızca her 4. etiketi görüntülemek istiyorsanız, etiketler listenizi filtreleyin, böylece her 4. etiket doldurulur ve diğerlerinin tümü boş dizedir (örn. ["0", "", "", "", "4", "", "", "", "8"]).


Bu harika bir hack, teşekkürler! Bunu ekledi burada .
Trufa

40
Geçmenin ""aynı zamanda grafikteki karşılık gelen ipuçlarını da kaldıracağını unutmayın!
Haywire

3
Ben yanılmam sen mesela her 10 etiketi gösterin istiyorsanız bu kolay bir liste anlayışı ile yapılabilir: my_labels = [my_labels[i] if i % 10 == 0 else "" for i in range(len(my_list))]. İşlemin daha kolay parametrelendirilmesi için 10 sayısı elbette dosyanın başında bir sabit olarak belirtilebilir.
pkaramol

o da olmadan yapılabilir ""bu soru cevap gibi chart.js ile dikey gird hat sorunu o kadar daha, yardımcı böyle durumda OP bu çifte alıntının ilk geçtiği üzerinde siyah çizgi göründüğünü ile bir sorunu vardı @ haywire, etiketi ipucundan kaldırdığından bahsetti
Mi-Creativity

15

Bunu Chart JS V2'de başarmak isteyenler için aşağıdakiler işe yarayacaktır:

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


                    var xLabels = data.ticks;

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

Ardından seçenekler değişkenini her zamanki gibi a:

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

13

GÜNCELLEME:

Çatalımı NNick'in Chart.js ana şubesinden en son çekmeyle (27 Ocak 2014 itibarıyla) güncelledim. https://github.com/hay-wire/Chart.js/tree/showXLabels

ORİJİNAL CEVAP:

Hala bu sorunla karşılaşanlar için, aynı sorunu çözmek için Chart.js'yi bir süre önce çatalladım. Şuradan kontrol edebilirsiniz: https://github.com/hay-wire/Chart.js/tree/skip-xlabels => Eski şube! En son çekim için showXLabels şubesini kontrol edin.

Nasıl kullanılır:

Çubuk grafik ve çizgi grafik için geçerlidir.

Kullanıcı artık bir { showXLabels: 10 } yalnızca 10 etiket görüntülemek için (gerçek görüntülenen etiket sayısı, x ekseninde bulunan toplam etiket sayısına bağlı olarak biraz farklı olabilir, ancak yine de 10'a yakın kalacaktır)

Çok büyük miktarda veri olduğunda çok yardımcı olur. Daha önce, grafik sıkışık alanda birbiri üzerine çizilen x ekseni etiketleri nedeniyle harap görünüyordu. İle showXLabelskullanıcı artık etiket sayısını, kullanabileceği alana uygun etiket sayısına kadar düşürme kontrolüne sahip.

Karşılaştırma için ekteki resimlere bakın.

showXLabelsSeçenek olmadan : görüntü açıklamasını buraya girin

Seçeneğe { showXLabels: 10 }geçildi: görüntü açıklamasını buraya girin

İşte bununla ilgili bazı tartışmalar: https://github.com/nnnick/Chart.js/pull/521#issuecomment-60469304


Bunu kullanmayı çok isterdim ama yanlış bir şey yapmalıyım. Ben başvurulan github.com/hay-wire/Chart.js/blob/showXLabels/Chart.js o işi yapmaz ve hatta ifade "showXLabels" içermiyor (30 Eki 2015) ancak. Github.com/hay-wire/Chart.js/blob/skip-xlabels/Chart.js adresindeki eski olanı gayet iyi çalışıyor. En son sürümün çalışan, etiketli bir sürümünü almayı çok isterim, böylece RawGit'ten güvenle CDN bağlantısı kurabilirim. Bu Fiddle (sadece konuya sadık kalmasa da
rkagerer

Bunu kullanmayı denedim ancak 'Chart.Line.js' kullanılmıyor, dolayısıyla hiçbir şey değişmiyor gibi görünüyor. "New Chart (ctx) .Line (data, options);" bir grafik oluşturmak için.
FlyingNimbus

Chart JS 2.6.0'ı kullanmak ve bu seçenek çalışmıyor. Sonunda @
ben'in

1
Sanırım bu önceki bir sürümün parçası
alexalejandroem

@alexalejandroem Evet, 2014 yılında cevaplandı! ;-)
Haywire

3

eksen dönüşü için

bunu kullan:

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

2

Göre chart.js konu # 12 GitHub'dan . Mevcut çözümler şunları içerir:

  1. 2.0 alfa kullanın (üretim değil)
  2. Çok kalabalık olduğunda x eksenini hiç gizle (hiç kabul edemez)
  3. x ekseninin etiket atlamasını manuel olarak kontrol edin (duyarlı sayfada değil)

Ancak birkaç dakika sonra daha iyi bir çözüm olduğunu düşünüyorum.

Aşağıdaki ön bilgi, etiketleri otomatik olarak gizleyecektir . xLabelsÇağırmadan önce boş dizeyle değiştirerek draw()ve daha sonra onları geri yükleyerek . Dahası, yeniden dönen x etiketleri, gizlendikten sonra daha fazla alan olduğu için uygulanabilir.

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

Lütfen bunun cloneharici bir bağımlılık olduğuna dikkat edin .



0

Bu cevap çalışıyor.

cloneİşlevi merak ediyorsanız , şunu deneyin:

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

-1

Chart.js dosyasında şunu bulmalısınız (benim için 884 satırında)

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

Sadece bu tek hat çağrısını sarın Eğer fillTextile if ( i % config.xFreq === 0){ ... } ve sonra chart.Line.defaultseklenti şey hattı xFreq : 1kullanmaya başlamak gerekir xFreqGözlerinde farklı optionsAradığınızdanew Chart(ctx).Line(data, options) .

Unutmayın, bu oldukça karmaşık.


3
bir sürüm güncellemesinden sonra bozulacak orijinal kitaplık dosyasını asla değiştirmeyin.
Raptor
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.