Giới hạn số nhãn trên biểu đồ đường Chart.js


95

Tôi muốn hiển thị tất cả các điểm trên biểu đồ của mình từ dữ liệu tôi nhận được, nhưng tôi không muốn hiển thị tất cả các nhãn cho chúng, vì khi đó biểu đồ không dễ đọc. Tôi đã tìm kiếm nó trong tài liệu, nhưng không thể tìm thấy bất kỳ thông số nào có thể giới hạn điều này.

Tôi không muốn chỉ lấy ba nhãn làm ví dụ, bởi vì khi đó biểu đồ cũng bị giới hạn ở ba điểm. Có khả thi không?

Tôi có một cái gì đó giống như ngay bây giờ:

nhập mô tả hình ảnh ở đây

Nếu tôi có thể chỉ để lại mỗi nhãn thứ ba phần tư thì thật tuyệt. Nhưng tôi hoàn toàn không tìm thấy gì về các tùy chọn nhãn.


bạn có thể cung cấp liên kết?
Dheeraj

vào trang web? không, tôi đang làm ứng dụng trên android và biểu đồ này nằm trên trang địa phương của tôi ..
mmmm

Vui lòng cho biết bạn sử dụng thư viện nào, ChartJS của DevExpress hay Chart.js?
Pavel Gruba

@mmmm bạn đã tìm ra điều gì đó? Tôi cố gắng trả lời của Nikita dưới đây nhưng nó để lại cho tôi với khoảng cách kỳ lạ này: jsfiddle.net/askhflajsf/xzk6sh1q
Đánh dấu Boulder

Câu trả lời của Nikita dường như là một trong những câu trả lời chính xác. @mmmm, hãy xem xét việc đánh dấu nó như là câu trả lời đúng stackoverflow.com/a/39326127/179138
Caio Cunha

Câu trả lời:


150

Hãy thử thêm options.scales.xAxes.ticks.maxTicksLimittùy chọn:

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

4
Câu trả lời ở trên cộng với câu trả lời này ở đây stackoverflow.com/a/37257056/558094 , là quả bom.
Vinayak Garg

3
Có vài điều sai sót ở đây. Tôi nhận được một khoảng cách rất lớn giữa hai ve lần cuối: jsfiddle.net/askhflajsf/xzk6sh1q
Đánh dấu Boulder

2
Bạn lấy thông tin này từ đâu? Rất nhiều câu trả lời mà tôi đang đọc cho Chart.js - tôi không thể tìm thấy trong tài liệu của họ chartjs.org/docs/latest , tôi có thiếu một số nơi mà tôi có thể thực sự tìm thấy tất cả các thuộc tính nhỏ đó và các lệnh gọi lại có thể ghi đè được ghi lại không?
Max Yari

1
thưa ông, bạn thật tuyệt vời!
Jay Geeth

1
Bạn cũng có thể thêm maxRotation: 0nếu bạn muốn nó không xoay trước khi bắt đầu thả các nhãn.
Caio Cunha

22

Để rõ ràng, giả sử danh sách nhãn ban đầu của bạn trông giống như sau:

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

Nếu bạn chỉ muốn hiển thị mỗi nhãn thứ 4, hãy lọc danh sách các nhãn của bạn để mỗi nhãn thứ 4 được điền và tất cả các nhãn khác là chuỗi trống (ví dụ ["0", "", "", "", "4", "", "", "", "8"]).


Đây là một hack tuyệt vời, cảm ơn! Tôi đã thêm nó ở đây .
Trufa

40
Lưu ý rằng việc vượt qua ""cũng loại bỏ các chú giải công cụ tương ứng trên biểu đồ!
Haywire

3
Trừ khi tôi sai này có thể dễ dàng thực hiện với một sự hiểu biết danh sách nếu bạn muốn ví dụ để hiển thị tất cả các nhãn thứ 10: my_labels = [my_labels[i] if i % 10 == 0 else "" for i in range(len(my_list))]. Tất nhiên, số 10 có thể được khai báo dưới dạng hằng số ở đầu tệp để quá trình tham số hóa dễ dàng hơn.
pkaramol

nó cũng có thể được thực hiện mà không cần "", như trong câu trả lời cho câu hỏi này về vấn đề đường thẳng đứng với chart.js trong đó OP gặp sự cố với đường màu đen xuất hiện trong lần xuất hiện đầu tiên của dấu ngoặc kép này, trong trường hợp đó, nó đã giúp ích, một lần nữa, chẳng hạn như @ haywire đề cập đến nó loại bỏ các nhãn từ tooltip
Mi-Sáng tạo

15

Đối với bất kỳ ai muốn đạt được điều này trên Biểu đồ JS V2, những điều sau sẽ hoạt động:

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


                    var xLabels = data.ticks;

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

Sau đó, chuyển biến tùy chọn như bình thường vào:

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

13

CẬP NHẬT:

Tôi đã cập nhật fork của mình với lần kéo mới nhất (kể từ ngày 27 tháng 1 năm 2014) từ chi nhánh chính Chart.js của NNick. https://github.com/hay-wire/Chart.js/tree/showXLabels

CÂU TRẢ LỜI GỐC:

Đối với những người vẫn gặp phải vấn đề này, tôi đã tạm dừng Chart.js để giải quyết vấn đề tương tự. Bạn có thể kiểm tra trên: https://github.com/hay-wire/Chart.js/tree/skip-xlabels => Chi nhánh cũ hơn! Kiểm tra nhánh showXLabels để biết lần kéo mới nhất.

Cách sử dụng:

Áp dụng cho biểu đồ thanh và biểu đồ đường.

Người dùng hiện có thể chuyển a { showXLabels: 10 }để chỉ hiển thị 10 nhãn (số lượng nhãn được hiển thị thực tế có thể hơi khác một chút tùy thuộc vào tổng số nhãn có trên trục x, tuy nhiên, nó vẫn sẽ gần bằng 10)

Giúp ích rất nhiều khi có một lượng dữ liệu rất lớn. Trước đó, biểu đồ từng trông bị tàn phá do các nhãn trục x được vẽ đè lên nhau trong không gian chật chội. Với showXLabels, người dùng hiện có quyền kiểm soát để giảm số lượng nhãn xuống bất kỳ số lượng nhãn nào phù hợp với không gian có sẵn cho họ.

Xem các hình ảnh đính kèm để so sánh.

Không có showXLabelstùy chọn: nhập mô tả hình ảnh ở đây

Với { showXLabels: 10 }tùy chọn được chuyển vào: nhập mô tả hình ảnh ở đây

Đây là một số cuộc thảo luận về nó: https://github.com/nnnick/Chart.js/pull/521#issuecomment-60469304


Rất thích sử dụng cái này nhưng tôi phải làm gì đó sai. Tôi đã tham khảo github.com/hay-wire/Chart.js/blob/showXLabels/Chart.js nhưng (kể từ ngày 30 tháng 10 năm 2015) nó không hoạt động và thậm chí không chứa cụm từ "showXLabels". Cái cũ hơn, tại github.com/hay-wire/Chart.js/blob/skip-xlabels/Chart.js , hoạt động tốt. Rất thích nhận được phiên bản mới nhất đang hoạt động được gắn thẻ để tôi có thể liên kết CDN một cách an toàn từ RawGit. Đây Fiddle (trong khi không cất để chỉ các vấn đề) cho thấy những gì tôi có nghĩa là: jsfiddle.net/45cLcxdh/14
rkagerer

Đã thử sử dụng điều này nhưng có vẻ như 'Chart.Line.js' không được sử dụng, do đó không có gì thay đổi. Tôi đã sử dụng "Biểu đồ mới (ctx) .Line (dữ liệu, tùy chọn);" để tạo biểu đồ.
FlyingNimbus

Sử dụng Biểu đồ JS 2.6.0 và tùy chọn không hoạt động. Cuối cùng tôi đã phải sử dụng @ ben của câu trả lời stackoverflow.com/a/26183983/3319454
3bdalla

1
Tôi nghĩ đây là một phần của phiên bản trước
alexalejandroem

@alexalejandroem Có nó đã được trả lời vào năm 2014! ;-)
Haywire

3

để quay trục

dùng cái này:

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

2

Theo chart.js github, số 12 . Các giải pháp hiện tại bao gồm:

  1. Sử dụng 2.0 alpha (không phải sản xuất)
  2. Ẩn trục x hoàn toàn khi nó bắt đầu quá đông (không thể chấp nhận được)
  3. điều khiển thủ công nhãn bỏ qua trục x (không phải trong trang đáp ứng)

Tuy nhiên, sau một vài phút, tôi nghĩ có một giải pháp tốt hơn.

Đoạn mã sau sẽ tự động ẩn các nhãn . Bằng cách sửa đổi xLabelsvới chuỗi trống trước khi gọi draw()và khôi phục chúng sau đó. Thậm chí, có thể áp dụng các nhãn x xoay lại vì có nhiều khoảng trống hơn sau khi ẩn.

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

Xin lưu ý rằng đó clonelà một sự phụ thuộc bên ngoài.



0

Câu trả lời này hoạt động giống như một sự quyến rũ.

Nếu bạn đang thắc mắc về clonechức năng này, hãy thử chức năng này:

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

-1

Trong tệp Chart.js, bạn sẽ tìm thấy (trên dòng 884 cho tôi)

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

Nếu bạn chỉ kết thúc một cuộc gọi đến fillTextbằng một dòng if ( i % config.xFreq === 0){ ... } và sau đó chart.Line.defaultsthêm một dòng nào đó, xFreq : 1bạn sẽ có thể bắt đầu sử dụng xFreqtrong optionskhi gọi new Chart(ctx).Line(data, options).

Xin lưu ý rằng điều này khá là hacky.


3
không bao giờ thay đổi tệp thư viện gốc, tệp này sẽ bị hỏng sau khi cập nhật phiên bản.
Raptor
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.