ChartJS仅显示特定刻度的大字体

时间:2019-02-28 18:50:24

标签: javascript chart.js

如果满足特定条件,我会尝试在X轴上强调特定值。

例如,在我的codepen中,我只想更改“蓝色”栏的字体大小。 Chart.js甚至有可能吗?

var ctx = document.getElementById("myChart").getContext('2d');
var myChart = new Chart(ctx, {
    type: 'bar',
    data: {
        labels: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"],
        datasets: [{
            label: '# of Votes',
            data: [12, 19, 3, 5, 2, 3],
            backgroundColor: [
                'rgba(255, 99, 132, 0.2)',
                'rgba(54, 162, 235, 0.2)',
                'rgba(255, 206, 86, 0.2)',
                'rgba(75, 192, 192, 0.2)',
                'rgba(153, 102, 255, 0.2)',
                'rgba(255, 159, 64, 0.2)'
            ],
            borderColor: [
                'rgba(255,99,132,1)',
                'rgba(54, 162, 235, 1)',
                'rgba(255, 206, 86, 1)',
                'rgba(75, 192, 192, 1)',
                'rgba(153, 102, 255, 1)',
                'rgba(255, 159, 64, 1)'
            ],
            borderWidth: 1
        }]
    },
    options: {
        scales: {
            yAxes: [{
                ticks: {
                    beginAtZero:true
                }
            }],
            xAxes: [{
                ticks: {
                    //only show large font size for 'Blue'
                    fontSize: 16
                }
            }]
        }
    }
});

3 个答案:

答案 0 :(得分:1)

根据他们的文档,看来这是不可能的。您只能使用callback函数来做类似大写的所需标签的操作

xAxes: [{
  ticks: {
    fontSize: 16,
    callback: v => v === 'Blue' ? v.toUpperCase() : v
  }
}]

答案 1 :(得分:1)

Chartjs没有公开的API,但是您可以在beforeDraw上修改内部_ticks并将标签“ Blue”设置为major: true,然后将使用刻度配置选项中的major样式。

还要谨慎使用此方法,因为它依赖于内部实现,因此可能会在将来的发行版中中断(非常不可能发生,只是在说)。

var ctx = document.getElementById("myChart").getContext('2d');
var myChart = new Chart(ctx, {
    type: 'bar',
    data: {
        labels: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"],
        datasets: [{
            label: '# of Votes',
            data: [12, 19, 3, 5, 2, 3],
            backgroundColor: [
                'rgba(255, 99, 132, 0.2)',
                'rgba(54, 162, 235, 0.2)',
                'rgba(255, 206, 86, 0.2)',
                'rgba(75, 192, 192, 0.2)',
                'rgba(153, 102, 255, 0.2)',
                'rgba(255, 159, 64, 0.2)'
            ],
            borderColor: [
                'rgba(255,99,132,1)',
                'rgba(54, 162, 235, 1)',
                'rgba(255, 206, 86, 1)',
                'rgba(75, 192, 192, 1)',
                'rgba(153, 102, 255, 1)',
                'rgba(255, 159, 64, 1)'
            ],
            borderWidth: 1
        }]
    },
    options: {
        scales: {
            yAxes: [{
                ticks: {
                    beginAtZero:true
                }
            }],
            xAxes: [{
                ticks: {
                    fontSize: 16,
                    major: {
                      fontSize: 20
                    }
                }
            }]
        }
    }, 
    plugins: [{
        beforeDraw: function({ chart }, options) {
            chart.boxes
            .find(box => box.id === "x-axis-0")
            ._ticks
            .find(tick => tick.label === "Blue")
            .major = true;
        }
    }]
});
<canvas id="myChart"></canvas>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.3/Chart.min.js"></script>

PS:以防万一有人想知道我如何知道这个内部实现,我在chartjs github源代码和fillText xD中搜索了console.log(myChart)

答案 2 :(得分:0)

对于 chartjs 3.0 及更高版本,可以使用 scriptable-options 来完成。像这样将它包含在您的刻度选项中:

options: {
    scales: {
             x: {
                  ticks: {

font: {
       size: (c) => {
         if (c.index==1){
             return 20 // at tick label with idx one set fontsize 20
          }
          else {
            return 12 // for all other tick labels set fontsize 12
          }
}, 
},
},
},
},
},