限制Chart.js折线图上的标签数量


94

我想从获取的数据中显示图表上的所有点,但我不想显示它们的所有标签,因为那样的话,图表就不太可读了。我在文档中寻找它,但是找不到任何可以限制它的参数。

我不想仅以三个标签为例,因为那时图表也仅限于三个点。可能吗?

我现在有类似的东西:

在此处输入图片说明

如果我能留下每三分之四的标签,那就太好了。但是我对标签选项一无所获。


您可以提供链接吗?
Dheeraj 2014年

网站?不,我在Android上做应用,这图是我的本地网页..
MMMM

请指定使用哪个库,DevExpress的ChartJS还是Chart.js?
帕维尔·格鲁巴

@mmmm您发现了什么吗?我在下面尝试了Nikita的答案,但它给我留下了一个奇怪的空白:jsfiddle.net/askhflajsf/xzk6sh1q
Mark Boulder

Nikita的答案似乎是正确的。@mmmm,请考虑将其标记为正确答案stackoverflow.com/a/39326127/179138
Caio Cunha

Answers:


148

尝试添加options.scales.xAxes.ticks.maxTicksLimit选项:

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

4
上面的答案加上此处的答案stackoverflow.com/a/372​​57056/558094是炸弹。
Vinayak Garg,2013年

3
这里不对劲。我在最后两个刻度之间有一个巨大的差距:jsfiddle.net/askhflajsf/xzk6sh1q
Mark Boulder

2
您从哪里获得此信息?我正在为Chart.js阅读很多文章-我无法在他们的文档chartjs.org/docs/latest中找到我是否缺少一些地方,实际上我可能会发现所有这些小属性和可重写的回调记录在案?
Max Yari

1
先生,你太棒了!
杰伊·盖斯

1
maxRotation: 0如果您希望它在开始放置标签之前不旋转,也可以添加。
Caio Cunha

22

为了具体起见,假设您的原始标签列表如下所示:

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

如果您只想显示每个第4个标签,请过滤标签列表,以便每个第4个标签都被填充,所有其他标签都是空字符串(例如["0", "", "", "", "4", "", "", "", "8"])。


这是一个很棒的技巧,谢谢!我在这里
Trufa 2014年

40
请注意,通过""还会删除图形上的相应工具提示!
Haywire 2014年

3
除非我错了,否则如果要显示每个第十个标签,可以很容易地通过列表理解来完成 my_labels = [my_labels[i] if i % 10 == 0 else "" for i in range(len(my_list))]。当然,可以在文件的开头将数字10声明为常量,以便更轻松地对该过程进行参数化。
pkaramol '16

也可以不使用"",例如在chart.js的垂直网格线问题的答案中,其中在双引号的第一次出现时OP出现黑线问题,在这种情况下它有帮助,再次为@ haywire提到它从工具提示中删除了标签
Mi-Creativity

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

然后像往常一样将options变量传递给:

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

13

更新:

我已使用NNick的Chart.js master分支的最新拉力(截至2014年1月27日)更新了我的叉子。 https://github.com/hay-wire/Chart.js/tree/showXLabels

原始答案:

对于那些仍然面临此问题的人,我花了很长时间来解决这个问题。您可以在以下位置查看它: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链接。这个小提琴(虽然不是仅仅提炼出问题
rkagerer 2015年

尝试过使用它,但是看起来像'Chart.Line.js'没有被使用,因此没有任何变化。我使用了“新的Chart(ctx).Line(数据,选项);” 创建图表。
FlyingNimbus '16

使用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 Alpha(非正式版)
  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是一个外部依赖关系。




-1

在Chart.js文件中,您应该找到(对我来说是884行)

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

如果仅将一个线路呼叫包装到fillTextif ( i % config.xFreq === 0){ ... } 然后chart.Line.defaults添加一些线路xFreq : 1,则应该可以xFreqoptions呼叫时开始使用new Chart(ctx).Line(data, options)

提醒您,这很hacky。


3
永远不要更改原始库文件,该文件在版本更新后会中断。
猛禽
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.