Обмежте кількість міток на лінійній діаграмі Chart.js


95

Я хочу відображати всі точки на своїй діаграмі з отриманих даних, але не хочу відображати всі мітки для них, оскільки тоді діаграма не дуже читається. Я шукав це в документації, але не міг знайти жодного параметра, який би обмежував це.

Наприклад, я не хочу брати лише три мітки, оскільки тоді діаграма також обмежується трьома точками. Це можливо?

У мене зараз є щось подібне:

введіть тут опис зображення

Якби я міг просто залишити кожен третій-четвертий ярлик, це було б чудово. Але я не знайшов абсолютно нічого про варіанти етикеток.


Ви можете надати посилання?
Dheeraj

на веб-сайт? ні, я роблю додаток на android, і ця діаграма знаходиться на моїй локальній сторінці ..
мммм

Будь ласка, вкажіть, яку бібліотеку ви використовуєте, ChartJS від DevExpress або Chart.js?
Павло Груба

@ мммм ти щось розгадав? Я спробував відповідь Микити нижче, але це залишило мене з цим дивним розривом: jsfiddle.net/askhflajsf/xzk6sh1q
Марк Боулдер

Відповідь Микити здається правильною. @ мммм, будь ласка, розгляньте це як правильну відповідь stackoverflow.com/a/39326127/179138
Кайо Кунья,

Відповіді:


150

Спробуйте додати options.scales.xAxes.ticks.maxTicksLimitопцію:

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

4
Відповідь вище плюс ця відповідь тут stackoverflow.com/a/37257056/558094 - це бомба.
Vinayak Garg

3
Тут щось не так. Я отримую величезний розрив між двома останніми галочками: jsfiddle.net/askhflajsf/xzk6sh1q
Марк Боулдер,

2
Звідки ви берете цю інформацію? Багато невідповідачів, які я читаю для Chart.js - я не можу знайти у своїх документах chartjs.org/docs/latest , мені не вистачає місця, де я дійсно можу знайти всі ці маленькі властивості та переоцінювані зворотні виклики, задокументовані?
Max Yari

1
сер, ви чудові!
Джей Гіт,

1
Ви також можете додати, maxRotation: 0якщо хочете, щоб він не обертався, перш ніж починати скидати мітки.
Кайо Кунья,

22

Для конкретності, скажімо, ваш оригінальний список ярликів виглядає так:

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

Якщо ви хочете відобразити лише кожну 4-ю мітку, відфільтруйте список міток так, щоб заповнилася кожна 4-а мітка, а всі інші - порожній рядок (наприклад ["0", "", "", "", "4", "", "", "", "8"]).


Це чудовий хак, дякую! Я додав його сюди .
Труфа

40
Майте на увазі, що передача ""також видаляє відповідні підказки на графіку!
Haywire

3
Якщо я не помиляюся , це можна легко зробити за допомогою списку розуміння , якщо ви хочете , наприклад , щоб показати всі мітки 10: my_labels = [my_labels[i] if i % 10 == 0 else "" for i in range(len(my_list))]. Звичайно, число 10 може бути оголошено константою на початку файлу для полегшення параметризації процесу.
pkaramol

це також можна було б зробити і без того "", як у відповіді на це запитання проблема з вертикальною поясною лінією з chart.js, де у OP виникла проблема з чорною лінією, з’являється при першій появі цієї подвійної лапки, в такому випадку це допомогло, знову ж таки як @ haywire згадав, що видаляє мітку з підказки
Mi-Creativity

15

Для тих, хто хоче досягти цього на діаграмі JS V2, працюватиме наступне:

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


                    var xLabels = data.ticks;

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

Потім передайте змінну параметрів, як зазвичай, у:

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

13

ОНОВЛЕННЯ:

Я оновив свій форк останнім витягом (станом на 27 січня 2014 р.) З головного відділення NNick's Chart.js. 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, однак)

Дуже допомагає, коли є дуже великий обсяг даних. Раніше графік раніше виглядав спустошеним через мітки осей х, накреслені одна над одною в тісному просторі. Тепер showXLabelsкористувач може контролювати зменшення кількості міток до будь-якої кількості міток, яка добре вписується у доступний для нього простір.

Див. Додані зображення для порівняння.

Без showXLabelsопції: введіть тут опис зображення

З { showXLabels: 10 }переданим варіантом: введіть тут опис зображення

Ось деякі обговорення щодо цього: https://github.com/nnnick/Chart.js/pull/521#issuecomment-60469304


Я хотів би використовувати це, але я, мабуть, роблю щось не так. Я посилався на github.com/hay-wire/Chart.js/blob/showXLabels/Chart.js, але (станом на 30 жовтня 2015 р.) Він не працює і навіть не містить фрази "showXLabels". Старіший, за адресою github.com/hay-wire/Chart.js/blob/skip-xlabels/Chart.js , чудово працює. Я хотів би отримати робочу, позначену тегами версію останньої, щоб я міг безпечно CDN-зв’язати її з RawGit. Ця скрипка (хоча не переганяється лише до випуску) показує, що я маю на увазі: jsfiddle.net/45cLcxdh/14
rkagerer

Спробував використовувати це, але схоже, що "Chart.Line.js" не звикає, тому нічого не змінюється. Я використовував "нову діаграму (ctx). Line (дані, параметри);" для створення діаграми.
FlyingNimbus

Використання діаграми JS 2.6.0 і параметр не працює. В кінці кінців , я повинен був використовувати @ Бен відповідь stackoverflow.com/a/26183983/3319454
3bdalla

1
Думаю, це частина попередньої версії
алексалехандроем

@alexalejandroem Так, на нього відповіли у 2014 році! ;-)
Haywire

3

для обертання осі

використовуй це:

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

2

Відповідно до випуску github chart.js №12 . Сучасні рішення включають:

  1. Використовуйте 2.0 альфа (не виробництво)
  2. Приховати вісь x взагалі, коли вона стає занадто натовпливою (не може прийняти взагалі)
  3. вручну керувати пропуском мітки по осі х (не на адаптивній сторінці)

Однак через кілька хвилин я думаю, що є краще рішення.

Наступний фрагмент коду буде приховувати мітки автоматично . Змінивши 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це зовнішня залежність.




-1

У файлі Chart.js ви повинні знайти (у рядку 884 для мене)

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

Якщо ви просто обернути цей виклик на один рядок , щоб fillTextз , if ( i % config.xFreq === 0){ ... } а потім в chart.Line.defaultsдодати що - то лінії , xFreq : 1ви повинні бути в змозі почати використовувати xFreqв вашому optionsколи ви телефонуєте new Chart(ctx).Line(data, options).

Майте на увазі, це досить хакі.


3
ніколи не змінюйте оригінальний файл бібліотеки, який зламається після оновлення версії.
Raptor
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.