Chart.js 선 차트의 레이블 수 제한


95

내가 얻은 데이터에서 차트의 모든 포인트를 표시하고 싶지만 모든 레이블을 표시하고 싶지는 않습니다. 왜냐하면 차트를 잘 읽을 수 없기 때문입니다. 나는 문서에서 그것을 찾고 있었지만 이것을 제한하는 매개 변수를 찾을 수 없었습니다.

예를 들어 3 개의 레이블 만 사용하고 싶지는 않습니다. 차트도 3 점으로 제한되기 때문입니다. 가능할까요?

나는 지금 그와 같은 것을 가지고 있습니다.

여기에 이미지 설명 입력

3/4 레이블을 모두 떠날 수 있다면 좋을 것입니다. 그러나 레이블 옵션에 대해서는 전혀 찾지 못했습니다.


링크를 제공 할 수 있습니까?
Dheeraj는

웹 사이트에? 아니, 안드로이드에서 앱을하고 있는데이 차트는 내 로컬 페이지에 있습니다.
mmmm

사용하는 라이브러리, DevExpress의 ChartJS 또는 Chart.js를 지정하십시오.
Pavel Gruba 2014 년

@mmmm 뭔가 알아 냈어? 나는 아래 니키타의 답변을 시도했지만이 이상 차이 날 왼쪽 : jsfiddle.net/askhflajsf/xzk6sh1q
마크 볼더

Nikita의 대답이 올바른 것 같습니다. @mmmm, 정답으로 표시 고려하시기 바랍니다 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
여기에 뭔가 잘못되었습니다. 나는 지난 2 틱 사이에 큰 격차를 받고 있어요 : jsfiddle.net/askhflajsf/xzk6sh1q
마크 볼더

2
이 정보는 어디서 얻습니까? Chart.js에 대해 읽고있는 많은 unswers-문서에서 찾을 수 없습니다. chartjs.org/docs/latest , 실제로 문서화 된 모든 작은 속성과 재정의 가능한 콜백을 찾을 수있는 곳이 누락 되었습니까?
Max Yari

1
선생님, 당신은 대단합니다!
Jay Geeth

1
maxRotation: 0라벨을 놓기 전에 회전하지 않으려면 추가 할 수도 있습니다 .
Caio Cunha

22

구체적으로, 원래 레이블 목록이 다음과 같다고 가정 해 보겠습니다.

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

네 번째 레이블 만 표시하려면 레이블 목록을 필터링하여 네 번째 레이블이 모두 채워지고 다른 모든 레이블은 빈 문자열이됩니다 (예 :) ["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 2011

그것도없이 할 수있는 ""이 질문에 대한 대답으로, chart.js 수직 조롱 라인의 문제 가 아니라 다시 도움이 같은 경우, 영업 이익이 큰 따옴표의 첫 번째 발생에 검은 줄이 나타납니다에 문제가 있었다 @ 엉망이는 툴팁에서 레이블 제거 언급 한
미 - 독창성

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] = '';
                        }
                    });
                } 
            }]   
        }
}

그런 다음 평소와 같이 옵션 변수를 다음과 같이 전달하십시오.

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 링크 할 수 있도록 최신 버전의 작동하고 태그가 지정된 버전을 얻고 싶습니다. 이 Fiddle은 (단지 문제로 요약
rkagerer

이것을 사용해 보았지만 'Chart.Line.js'가 사용되지 않는 것처럼 보이므로 아무것도 변경되지 않습니다. "new Chart (ctx) .Line (data, options);"을 사용했습니다. 차트를 만듭니다.
FlyingNimbus 2016 년

Chart JS 2.6.0을 사용하면 옵션이 작동하지 않습니다. 결국 나는
@ben

1
나는이 이전 버전의 일부라고 생각
alexalejandroem

@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

chart.js github 문제 # 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 파일에서 찾을 수 있습니다.

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

당신은 단지 해당 한 줄 호출을 래핑하는 경우 fillTextif ( i % config.xFreq === 0){ ... } 에 다음과 chart.Line.defaults추가 뭔가 라인 xFreq : 1당신이 사용하기 시작할 수있을 것입니다 xFreq당신에 options전화 할 때 new Chart(ctx).Line(data, options).

이것은 꽤 해키입니다.


3
버전 업데이트 후 중단되는 원본 라이브러리 파일을 변경하지 마십시오.
Raptor
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.