Limita il numero di etichette sul grafico a linee Chart.js


95

Voglio visualizzare tutti i punti sul mio grafico dai dati che ottengo, ma non voglio visualizzare tutte le etichette per loro, perché in tal caso il grafico non è molto leggibile. Lo stavo cercando nei documenti, ma non sono riuscito a trovare alcun parametro che lo limitasse.

Ad esempio, non voglio prendere solo tre etichette, perché anche il grafico è limitato a tre punti. È possibile?

Ho qualcosa del genere in questo momento:

inserisci qui la descrizione dell'immagine

Se potessi lasciare ogni terza-quarta etichetta, sarebbe fantastico. Ma non ho trovato assolutamente nulla sulle opzioni delle etichette.


puoi fornire link?
Dheeraj

al sito web? no, sto facendo app su Android e questo grafico è sulla mia pagina locale ..
mmmm

Si prega di specificare quale libreria si utilizza, ChartJS di DevExpress o Chart.js?
Pavel Gruba

@mmmm hai capito qualcosa? Ho provato la risposta di Nikita qui sotto ma mi ha lasciato questo strano divario: jsfiddle.net/askhflajsf/xzk6sh1q
Mark Boulder,

La risposta di Nikita sembra essere quella corretta. @mmmm, considera di contrassegnarla come risposta corretta stackoverflow.com/a/39326127/179138
Caio Cunha

Risposte:


151

Prova ad aggiungere l' options.scales.xAxes.ticks.maxTicksLimitopzione:

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

4
La risposta sopra più questa risposta qui stackoverflow.com/a/37257056/558094 , è la bomba.
Vinayak Garg

3
Qualcosa non va, qui. Sto ottenendo un enorme divario tra gli ultimi due tick: jsfiddle.net/askhflajsf/xzk6sh1q
Mark Boulder,

2
Da dove prendi queste informazioni? Sto leggendo un sacco di risposte per Chart.js - non riesco a trovare nei loro documenti chartjs.org/docs/latest , mi manca qualche posto dove posso effettivamente trovare tutte quelle piccole proprietà e callback sostituibili documentati?
Max Yari

1
signore, sei fantastico!
Jay Geeth

1
Puoi anche aggiungere maxRotation: 0se vuoi che non ruoti prima di iniziare a rilasciare le etichette.
Caio Cunha

22

Per concretezza, supponiamo che il tuo elenco originale di etichette sia simile a:

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

Se vuoi visualizzare solo ogni quarta etichetta, filtra la tua lista di etichette in modo che ogni quarta etichetta sia riempita e tutte le altre siano una stringa vuota (es ["0", "", "", "", "4", "", "", "", "8"].).


Questo è un ottimo trucco, grazie! L'ho aggiunto qui .
Trufa

40
Tieni presente che il passaggio ""rimuove anche i suggerimenti corrispondenti sul grafico!
Haywire

3
A meno che non mi sbaglio questo può essere fatto facilmente con una lista di comprensione, se si desidera ad esempio, per mostrare ogni 10 etichette: my_labels = [my_labels[i] if i % 10 == 0 else "" for i in range(len(my_list))]. Il numero 10 può ovviamente essere dichiarato come costante all'inizio del file per una più facile parametrizzazione del processo.
pkaramol

potrebbe anche essere fatto senza "", come nella risposta a questa domanda problema della linea di cintura verticale con chart.js in cui l'OP aveva un problema con la linea nera che appare alla prima occorrenza di questa virgoletta doppia, in tal caso ha aiutato, di nuovo come @ ha detto in tilt che rimuove l'etichetta dal tooltip
Mi-Creativity

15

Per chiunque desideri ottenere questo risultato su Chart JS V2, funzionerà quanto segue:

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


                    var xLabels = data.ticks;

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

Quindi passare la variabile delle opzioni come al solito in un:

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

13

AGGIORNARE:

Ho aggiornato il mio fork con l'ultimo pull (a partire dal 27 gennaio 2014) dal ramo principale di NNick's Chart.js. https://github.com/hay-wire/Chart.js/tree/showXLabels

RISPOSTA ORIGINALE:

Per coloro che devono ancora affrontare questo problema, ho biforcato Chart.js qualche tempo fa per risolvere lo stesso problema. Puoi verificarlo su: https://github.com/hay-wire/Chart.js/tree/skip-xlabels => Ramo più vecchio! Controlla il ramo showXLabels per l'ultimo pull.

Come usare:

Applicabile al grafico a barre e al grafico a linee.

L'utente può ora passare a { showXLabels: 10 }per visualizzare solo 10 etichette (il conteggio effettivo delle etichette visualizzate potrebbe essere leggermente diverso a seconda del numero di etichette totali presenti sull'asse x, ma rimarrà comunque vicino a 10)

Aiuta molto quando c'è una grande quantità di dati. In precedenza, il grafico sembrava devastato a causa delle etichette dell'asse x disegnate l'una sull'altra nello spazio angusto. Con showXLabels, l'utente ora ha il controllo per ridurre il numero di etichette a qualunque numero di etichette si adatti bene allo spazio a sua disposizione.

Vedere le immagini allegate per un confronto.

Senza showXLabelsopzione: inserisci qui la descrizione dell'immagine

Con { showXLabels: 10 }passato in opzione: inserisci qui la descrizione dell'immagine

Ecco alcune discussioni su di esso: https://github.com/nnnick/Chart.js/pull/521#issuecomment-60469304


Mi piacerebbe usarlo ma devo fare qualcosa di sbagliato. Ho fatto riferimento a github.com/hay-wire/Chart.js/blob/showXLabels/Chart.js ma (al 30 ottobre 2015) non funziona e non contiene nemmeno la frase "showXLabels". Quello più vecchio, su github.com/hay-wire/Chart.js/blob/skip-xlabels/Chart.js , funziona perfettamente. Mi piacerebbe avere una versione funzionante e contrassegnata dell'ultima in modo da poterla collegare in sicurezza a CDN da RawGit. Questo violino (sebbene non distillato solo per il problema) mostra cosa intendo: jsfiddle.net/45cLcxdh/14
rkagerer

Ho provato a usarlo ma sembra che "Chart.Line.js" non venga utilizzato, quindi non cambia nulla. Ho usato "new Chart (ctx) .Line (data, options);" per creare un grafico.
FlyingNimbus

Utilizzando Chart JS 2.6.0 e l'opzione non funziona. Alla fine ho dovuto usare @ di Ben risposta stackoverflow.com/a/26183983/3319454
3bdalla

1
Penso che questa sia parte di una versione precedente
alexalejandroem

@alexalejandroem Sì, è stato risposto nel 2014! ;-)
Haywire

3

per la rotazione degli assi

Usa questo:

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

2

Secondo il numero 12 di github di chart.js . Le soluzioni attuali includono:

  1. Usa 2.0 alpha (non di produzione)
  2. Nascondi del tutto l'asse x quando diventa troppo affollato (non può accettare affatto)
  3. controllare manualmente il salto dell'etichetta dell'asse x (non nella pagina reattiva)

Tuttavia, dopo pochi minuti, penso che ci sia una soluzione migliore.

Il seguente frammento nasconderà automaticamente le etichette . Modificandoli xLabelscon una stringa vuota prima di richiamarli draw()e ripristinarli dopo. Inoltre, è possibile applicare nuovamente le etichette x poiché c'è più spazio dopo l'oscuramento.

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

Si prega di notare che cloneè una dipendenza esterna.



0

Questa risposta funziona come un incantesimo.

Se ti stai chiedendo quale sia la clonefunzione, prova questa:

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

-1

Nel file Chart.js, dovresti trovare (sulla riga 884 per me)

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

Se hai appena avvolgere quella chiamata una linea fillTextcon if ( i % config.xFreq === 0){ ... } e poi a chart.Line.defaultsaggiungere qualcosa linea xFreq : 1si dovrebbe essere in grado di iniziare a utilizzarexFreq nel vostro optionsquando si chiamanew Chart(ctx).Line(data, options) .

Intendiamoci, questo è piuttosto hacky.


3
non modificare mai il file della libreria originale, che si interromperà dopo un aggiornamento della versione.
Raptor
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.