Ula*_*ach 1 javascript charts chart.js
这个问题建立在上一个问题的基础上:ChartJS place y-axis labels between ticks。
使用 BeforeDraw 插件绘制刻度时,每次重新绘制画布时,刻度/标签最终都会“跳跃”。如果您运行代码片段并在将鼠标悬停在条形上和上时查看 y 轴标签,您将能够看到这种“跳跃”。
有没有办法在使用 BeforeDraw 绘制刻度的同时防止这种“跳跃”?
var barChart = new Chart(ctx, {
type: 'bar',
data: {
labels: ['Jan', 'Feb', 'Mar'],
datasets: [{
label: 'BAR',
data: [10, 20, 30],
backgroundColor: 'rgba(0, 119, 204, 0.5)'
}]
},
options: {
responsive: false,
scales: {
yAxes: [{
ticks: {
beginAtZero: true,
"userCallback" : function(t, i){
var mapping_function = [ "", "Critical", "Needs Work", "Good", "Needs Work", "Getting There", "Great Choices"];
//return t;
return mapping_function[mapping_function.length - (i + 1)];
},
}
}]
}
},
plugins: [{
beforeDraw: function(chart) {
var ctx = chart.ctx;
var yAxis = chart.scales['y-axis-0'];
var tickGap = yAxis.getPixelForTick(1) - yAxis.getPixelForTick(0);
yAxis.options.ticks.fontColor = 'transparent'; // hide original tick
// loop through ticks array
Chart.helpers.each(yAxis.ticks, function(tick, index) {
if (index === yAxis.ticks.length - 1) return;
var xPos = yAxis.right;
var yPos = yAxis.getPixelForTick(index);
var xPadding = 10;
// draw tick
ctx.save();
ctx.textBaseline = 'middle';
ctx.textAlign = 'right';
ctx.fillStyle = 'rgba(0, 0, 0, 0.8)';
ctx.fillText(tick, xPos - xPadding, yPos + tickGap / 2);
ctx.restore();
});
}
}]
});Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.6.0/Chart.min.js"></script>
<canvas id="ctx" height="200"></canvas>Run Code Online (Sandbox Code Playgroud)
是的!有一种方法。使用以下插件:
plugins: [{
beforeDraw: function(chart) {
// hide original tick
chart.scales['y-axis-0'].options.ticks.fontColor = 'transparent';
},
afterDraw: function(chart) {
var ctx = chart.ctx;
var yAxis = chart.scales['y-axis-0'];
var tickGap = yAxis.getPixelForTick(1) - yAxis.getPixelForTick(0);
// loop through ticks array
Chart.helpers.each(yAxis.ticks, function(tick, index) {
if (index === yAxis.ticks.length - 1) return;
var xPos = yAxis.right;
var yPos = yAxis.getPixelForTick(index);
var xPadding = 10;
// draw tick
ctx.save();
ctx.textBaseline = 'middle';
ctx.textAlign = 'right';
ctx.fillStyle = 'rgba(0, 0, 0, 0.8)';
ctx.fillText(tick, xPos - xPadding, yPos + tickGap / 2);
ctx.restore();
});
}
}]
Run Code Online (Sandbox Code Playgroud)
演示?
plugins: [{
beforeDraw: function(chart) {
// hide original tick
chart.scales['y-axis-0'].options.ticks.fontColor = 'transparent';
},
afterDraw: function(chart) {
var ctx = chart.ctx;
var yAxis = chart.scales['y-axis-0'];
var tickGap = yAxis.getPixelForTick(1) - yAxis.getPixelForTick(0);
// loop through ticks array
Chart.helpers.each(yAxis.ticks, function(tick, index) {
if (index === yAxis.ticks.length - 1) return;
var xPos = yAxis.right;
var yPos = yAxis.getPixelForTick(index);
var xPadding = 10;
// draw tick
ctx.save();
ctx.textBaseline = 'middle';
ctx.textAlign = 'right';
ctx.fillStyle = 'rgba(0, 0, 0, 0.8)';
ctx.fillText(tick, xPos - xPadding, yPos + tickGap / 2);
ctx.restore();
});
}
}]
Run Code Online (Sandbox Code Playgroud)
var barChart = new Chart(ctx, {
type: 'bar',
data: {
labels: ['Jan', 'Feb', 'Mar'],
datasets: [{
label: 'BAR',
data: [10, 20, 30],
backgroundColor: 'rgba(0, 119, 204, 0.5)'
}]
},
options: {
responsive: false,
scales: {
yAxes: [{
ticks: {
beginAtZero: true,
"userCallback": function(t, i) {
var mapping_function = ["", "Critical", "Needs Work", "Good", "Needs Work", "Getting There", "Great Choices"];
//return t;
return mapping_function[mapping_function.length - (i + 1)];
},
}
}]
}
},
plugins: [{
beforeDraw: function(chart) {
// hide original tick
chart.scales['y-axis-0'].options.ticks.fontColor = 'transparent';
},
afterDraw: function(chart) {
var ctx = chart.ctx;
var yAxis = chart.scales['y-axis-0'];
var tickGap = yAxis.getPixelForTick(1) - yAxis.getPixelForTick(0);
// loop through ticks array
Chart.helpers.each(yAxis.ticks, function(tick, index) {
if (index === yAxis.ticks.length - 1) return;
var xPos = yAxis.right;
var yPos = yAxis.getPixelForTick(index);
var xPadding = 10;
// draw tick
ctx.save();
ctx.textBaseline = 'middle';
ctx.textAlign = 'right';
ctx.fillStyle = 'rgba(0, 0, 0, 0.8)';
ctx.fillText(tick, xPos - xPadding, yPos + tickGap / 2);
ctx.restore();
});
}
}]
});Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1183 次 |
| 最近记录: |