จำกัด จำนวนป้ายกำกับบนแผนภูมิเส้น Chart.js


96

ฉันต้องการแสดงจุดทั้งหมดในแผนภูมิของฉันจากข้อมูลที่ฉันได้รับ แต่ฉันไม่ต้องการแสดงป้ายกำกับทั้งหมดสำหรับพวกเขาเนื่องจากแผนภูมินั้นอ่านไม่ได้มากนัก ฉันกำลังมองหาในเอกสาร แต่ไม่พบพารามิเตอร์ใด ๆ ที่จะ จำกัด สิ่งนี้

ฉันไม่ต้องการใช้เพียงสามป้ายเนื่องจากแผนภูมิถูก จำกัด ไว้ที่สามจุด เป็นไปได้ไหม?

ฉันมีบางอย่างในขณะนี้:

ป้อนคำอธิบายภาพที่นี่

ถ้าฉันสามารถออกทุกๆสามในสี่ป้ายก็จะดีมาก แต่ฉันไม่พบอะไรเลยเกี่ยวกับตัวเลือกป้ายกำกับ


คุณสามารถให้ลิงค์?
Dheeraj

ไปยังเว็บไซต์? ไม่ฉันกำลังทำแอปบน Android และแผนภูมินี้อยู่ในเพจท้องถิ่นของฉัน ..
mmmm

โปรดระบุว่าคุณใช้ไลบรารีใด ChartJS by DevExpress หรือ Chart.js?
Pavel Gruba

@mmmm คิดอะไรออกรึเปล่า? ฉันลองคำตอบของ Nikita ด้านล่าง แต่มันทำให้ฉันมีช่องว่างแปลก ๆ นี้: jsfiddle.net/askhflajsf/xzk6sh1q
Mark Boulder

คำตอบของ Nikita ดูเหมือนจะถูกต้อง @mmmm โปรดพิจารณาทำเครื่องหมายว่าเป็นคำตอบที่ถูกต้องstackoverflow.com/a/39326127/179138
Caio Cunha

คำตอบ:


156

ลองเพิ่ม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
Mark Boulder

2
คุณเอาข้อมูลนี้มาจากไหน ฉันไม่ได้อ่าน Chart.js จำนวนมาก - ฉันไม่พบใน docs chartjs.org/docs/ ล่าสุดฉันขาดสถานที่บางแห่งที่ฉันอาจพบคุณสมบัติเล็ก ๆ น้อย ๆ เหล่านั้นและเอกสารการเรียกกลับที่เขียนทับได้ทั้งหมดหรือไม่
Max Yari

1
คุณชายคุณสุดยอดมาก!
Jay Geeth

2
คุณยังสามารถเพิ่มได้maxRotation: 0หากต้องการไม่ให้หมุนก่อนที่จะเริ่มวางป้ายกำกับ
Caio Cunha

23

เพื่อความเป็นรูปธรรมสมมติว่ารายการป้ายกำกับเดิมของคุณมีลักษณะดังนี้:

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

หากคุณต้องการแสดงทุกป้ายกำกับที่ 4 เท่านั้นให้กรองรายการป้ายกำกับของคุณเพื่อให้ทุกป้ายกำกับที่ 4 ถูกเติมและอื่น ๆ ทั้งหมดเป็นสตริงว่าง (เช่น["0", "", "", "", "4", "", "", "", "8"])


นี่เป็นการแฮ็คที่ยอดเยี่ยมขอบคุณ! ฉันเพิ่มมันนี่
Trufa

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) จากสาขาหลัก Chart.js ของ NNick https://github.com/hay-wire/Chart.js/tree/showXLabels

คำตอบเดิม:

สำหรับผู้ที่ยังคงประสบปัญหานี้ฉันก็แยก Chart.js สักพักเพื่อแก้ปัญหาเดิม สามารถตรวจสอบได้ที่: https://github.com/hay-wire/Chart.js/tree/skip-xlabels => สาขาเก่า! ตรวจสอบสาขา showXLabels เพื่อดึงล่าสุด

วิธีใช้:

ใช้ได้กับแผนภูมิแท่งและแผนภูมิเส้น

ผู้ใช้สามารถส่งไฟล์ { 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แต่ (ณ วันที่ 30 ต.ค. 2015) ใช้ไม่ได้และไม่มีแม้แต่วลี "showXLabels" อันเก่ากว่าที่github.com/hay-wire/Chart.js/blob/skip-xlabels/Chart.jsก็ใช้ได้ดี ชอบที่จะได้รับเวอร์ชันล่าสุดที่ใช้งานได้และติดแท็กดังนั้นฉันจึงสามารถเชื่อมโยง CDN จาก RawGit ได้อย่างปลอดภัย Fiddle นี้ (ในขณะที่ไม่ได้กลั่นเฉพาะประเด็น) แสดงให้เห็นว่าฉันหมายถึงอะไร: jsfiddle.net/45cLcxdh/14
rkagerer

พยายามใช้สิ่งนี้ แต่ดูเหมือนว่าจะไม่ได้ใช้ 'Chart.Line.js' จึงไม่มีอะไรเปลี่ยนแปลง ฉันใช้ "new Chart (ctx) .Line (data, options);" เพื่อสร้างแผนภูมิ
FlyingNimbus

ใช้แผนภูมิ JS 2.6.0 และตัวเลือกไม่ทำงาน ในที่สุดฉันก็ต้องใช้คำตอบของ @ ben stackoverflow.com/a/26183983/3319454
3bdalla

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 ปัญหา # โซลูชันปัจจุบัน ได้แก่ :

  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

ฉันมีประเภทของปัญหาที่คล้ายกันและได้รับการแก้ปัญหาที่ดีที่จะเฉพาะปัญหาของฉันฉลากแสดงในเคล็ดลับ แต่ไม่ได้อยู่ในแกน x สำหรับแผนภูมิ ดูว่าสิ่งนี้ช่วยคุณได้หรือไม่


0

คำตอบนี้งานได้เหมือนมีเสน่ห์

หากคุณสงสัยเกี่ยวกับcloneฟังก์ชันนี้ให้ลองใช้ฟังก์ชันนี้:

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

-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ในของคุณเมื่อคุณโทรoptionsnew Chart(ctx).Line(data, options)

โปรดทราบว่านี่เป็นเรื่องที่น่าสนใจทีเดียว


3
อย่าเปลี่ยนไฟล์ไลบรารีดั้งเดิมซึ่งจะพังหลังจากการอัปเดตเวอร์ชัน
Raptor
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.