คำตอบ:
การแก้ไขล่าช้า:มีปลั๊กอินอย่างเป็นทางการสำหรับ Chart.js 2.7.0+
เพื่อทำสิ่งนี้: https://github.com/chartjs/chartjs-plugin-datalabels
คำตอบเดิม:
คุณสามารถวนซ้ำจุด / แท่งบน AnimationComplete และแสดงค่า
ดูตัวอย่าง
HTML
<canvas id="myChart1" height="300" width="500"></canvas>
<canvas id="myChart2" height="300" width="500"></canvas>
สคริปต์
var chartData = {
labels: ["January", "February", "March", "April", "May", "June"],
datasets: [
{
fillColor: "#79D1CF",
strokeColor: "#79D1CF",
data: [60, 80, 81, 56, 55, 40]
}
]
};
var ctx = document.getElementById("myChart1").getContext("2d");
var myLine = new Chart(ctx).Line(chartData, {
showTooltips: false,
onAnimationComplete: function () {
var ctx = this.chart.ctx;
ctx.font = this.scale.font;
ctx.fillStyle = this.scale.textColor
ctx.textAlign = "center";
ctx.textBaseline = "bottom";
this.datasets.forEach(function (dataset) {
dataset.points.forEach(function (points) {
ctx.fillText(points.value, points.x, points.y - 10);
});
})
}
});
var ctx = document.getElementById("myChart2").getContext("2d");
var myBar = new Chart(ctx).Bar(chartData, {
showTooltips: false,
onAnimationComplete: function () {
var ctx = this.chart.ctx;
ctx.font = this.scale.font;
ctx.fillStyle = this.scale.textColor
ctx.textAlign = "center";
ctx.textBaseline = "bottom";
this.datasets.forEach(function (dataset) {
dataset.bars.forEach(function (bar) {
ctx.fillText(bar.value, bar.x, bar.y - 5);
});
})
}
});
onComplete
โทรกลับที่นี่ แต่มันก็เริ่มทำงานเมื่อเมาส์โอเวอร์อยู่บนแถบของแผนภูมิทำให้ตัวเลขกะพริบเนื่องจากการวาดใหม่จะเหมือนกันonAnimationComplete
หรือไม่ถ้า? ฉันไม่สามารถใช้การโทรกลับนี้กับรหัสแผนภูมิที่มีอยู่ (ดูvar chartBar
ที่ด้านล่างpastebin.com/tT7yTkGh )
นี่คือเวอร์ชันอัปเดตสำหรับ Chart.js 2.3
23 ก.ย. 2016: แก้ไขโค้ดของฉันให้ทำงานกับ v2.3 สำหรับทั้งประเภทบรรทัด / บาร์
สำคัญ:แม้ว่าคุณจะไม่ต้องการภาพเคลื่อนไหว แต่อย่าเปลี่ยนตัวเลือกระยะเวลาเป็น 0 มิฉะนั้นคุณจะได้รับchartInstance.controller เป็นข้อผิดพลาดที่ไม่ได้กำหนด
var chartData = {
labels: ["January", "February", "March", "April", "May", "June"],
datasets: [
{
fillColor: "#79D1CF",
strokeColor: "#79D1CF",
data: [60, 80, 81, 56, 55, 40]
}
]
};
var opt = {
events: false,
tooltips: {
enabled: false
},
hover: {
animationDuration: 0
},
animation: {
duration: 1,
onComplete: function () {
var chartInstance = this.chart,
ctx = chartInstance.ctx;
ctx.font = Chart.helpers.fontString(Chart.defaults.global.defaultFontSize, Chart.defaults.global.defaultFontStyle, Chart.defaults.global.defaultFontFamily);
ctx.textAlign = 'center';
ctx.textBaseline = 'bottom';
this.data.datasets.forEach(function (dataset, i) {
var meta = chartInstance.controller.getDatasetMeta(i);
meta.data.forEach(function (bar, index) {
var data = dataset.data[index];
ctx.fillText(data, bar._model.x, bar._model.y - 5);
});
});
}
}
};
var ctx = document.getElementById("Chart1"),
myLineChart = new Chart(ctx, {
type: 'bar',
data: chartData,
options: opt
});
<canvas id="myChart1" height="300" width="500"></canvas>
ตัวเลือกภาพเคลื่อนไหวนี้ใช้ได้กับ 2.1.3 บนแผนภูมิแท่ง
คำตอบ @Ross แก้ไขเล็กน้อย
animation: {
duration: 0,
onComplete: function () {
// render the value of the chart above the bar
var ctx = this.chart.ctx;
ctx.font = Chart.helpers.fontString(Chart.defaults.global.defaultFontSize, 'normal', Chart.defaults.global.defaultFontFamily);
ctx.fillStyle = this.chart.config.options.defaultFontColor;
ctx.textAlign = 'center';
ctx.textBaseline = 'bottom';
this.data.datasets.forEach(function (dataset) {
for (var i = 0; i < dataset.data.length; i++) {
var model = dataset._meta[Object.keys(dataset._meta)[0]].data[i]._model;
ctx.fillText(dataset.data[i], model.x, model.y - 5);
}
});
}}
hover: {animationDuration: 0}
ให้หยุดการเคลื่อนไหวของป้ายกำกับเมื่อวางเมาส์เหนือ
.filter(dataset => !dataset._meta[0].hidden)
ฉันคิดว่าตัวเลือกที่ดีที่สุดในการทำสิ่งนี้ใน chartJS v2.x คือการใช้ปลั๊กอินดังนั้นคุณจึงไม่มีโค้ดจำนวนมากในตัวเลือก นอกจากนี้ยังป้องกันไม่ให้ข้อมูลหายไปเมื่อวางเมาส์เหนือแถบ
กล่าวคือใช้รหัสนี้ซึ่งลงทะเบียนปลั๊กอินที่เพิ่มข้อความหลังจากวาดแผนภูมิ
Chart.pluginService.register({
afterDraw: function(chartInstance) {
var ctx = chartInstance.chart.ctx;
// render the value of the chart above the bar
ctx.font = Chart.helpers.fontString(Chart.defaults.global.defaultFontSize, 'normal', Chart.defaults.global.defaultFontFamily);
ctx.textAlign = 'center';
ctx.textBaseline = 'bottom';
chartInstance.data.datasets.forEach(function (dataset) {
for (var i = 0; i < dataset.data.length; i++) {
var model = dataset._meta[Object.keys(dataset._meta)[0]].data[i]._model;
ctx.fillText(dataset.data[i], model.x, model.y - 2);
}
});
}
});
Chart.defaults.global.tooltips.enabled = false;
. ปัญหาในการแก้ปัญหานั้นคือafterDraw
ฟังก์ชันถูกเรียกหลายร้อยครั้งซึ่งอาจสร้างโอเวอร์เฮดของ CPU ยังคงเป็นคำตอบเดียวสำหรับตอนนี้โดยไม่กระพริบตา หากคุณจำเป็นต้องมีการแสดงผลที่ดีกว่าสำหรับhorizontalBar
แผนภูมิการใช้งานและctx.textAlign = 'left'; ctx.textBaseline = 'middle';
ctx.fillText(dataset.data[i], model.x+5, model.y);
จากคำตอบคำตอบของ @ Ross สำหรับ Chart.js 2.0 ขึ้นไปฉันต้องปรับแต่งเล็กน้อยเพื่อป้องกันกรณีเมื่อความสูงของบาร์มาเลือกขอบเขตขนาดเกินไป
animation
แอตทริบิวต์ของตัวเลือกแถบแผนภูมิ:
animation: {
duration: 500,
easing: "easeOutQuart",
onComplete: function () {
var ctx = this.chart.ctx;
ctx.font = Chart.helpers.fontString(Chart.defaults.global.defaultFontFamily, 'normal', Chart.defaults.global.defaultFontFamily);
ctx.textAlign = 'center';
ctx.textBaseline = 'bottom';
this.data.datasets.forEach(function (dataset) {
for (var i = 0; i < dataset.data.length; i++) {
var model = dataset._meta[Object.keys(dataset._meta)[0]].data[i]._model,
scale_max = dataset._meta[Object.keys(dataset._meta)[0]].data[i]._yScale.maxHeight;
ctx.fillStyle = '#444';
var y_pos = model.y - 5;
// Make sure data value does not get overflown and hidden
// when the bar's value is too close to max value of scale
// Note: The y value is reverse, it counts from top down
if ((scale_max - model.y) / scale_max >= 0.93)
y_pos = model.y + 20;
ctx.fillText(dataset.data[i], model.x, y_pos);
}
});
}
}
ctx.save()
ในตอนท้าย แต่ก็ไม่ช่วย
onComplete
โทรกลับจะดำเนินการเมื่อฉันวางเมาส์บนแถบซึ่งทำให้การวาดใหม่ & ข้อความดูเหมือนจะกะพริบสิ่งนี้จะเหมือนonAnimationComplete
กันหรือไม่ฉันไม่สามารถใช้การonAnimationComplete
โทรกลับด้วยรหัสที่มีอยู่ของฉันได้ (ดูvar chartBar
ที่ด้านล่างของpastebin com / tT7yTkGh
หากคุณใช้ปลั๊กอินchartjs-plugin-datalabelsอ็อบเจ็กต์ตัวเลือกโค้ดต่อไปนี้จะช่วยได้
ตรวจสอบให้แน่ใจว่าคุณนำเข้าimport 'chartjs-plugin-datalabels';
ไฟล์ typescript ของคุณหรือเพิ่มการอ้างอิง<script src="chartjs-plugin-datalabels.js"></script>
ในไฟล์จาวาสคริปต์ของคุณ
options: {
maintainAspectRatio: false,
responsive: true,
scales: {
yAxes: [{
ticks: {
beginAtZero: true,
}
}]
},
plugins: {
datalabels: {
anchor: 'end',
align: 'top',
formatter: Math.round,
font: {
weight: 'bold'
}
}
}
}
ตามคำตอบที่ดีนี้ฉันจะใช้ตัวเลือกเหล่านี้สำหรับแผนภูมิแท่ง:
var chartOptions = {
animation: false,
responsive : true,
tooltipTemplate: "<%= value %>",
tooltipFillColor: "rgba(0,0,0,0)",
tooltipFontColor: "#444",
tooltipEvents: [],
tooltipCaretSize: 0,
onAnimationComplete: function()
{
this.showTooltip(this.datasets[0].bars, true);
}
};
window.myBar = new Chart(ctx1).Bar(chartData, chartOptions);
สิ่งนี้ยังคงใช้ระบบคำแนะนำเครื่องมือและข้อดีของเขา (การวางตำแหน่งอัตโนมัติ, เทมเพลต, ... ) แต่ซ่อนการตกแต่ง (สีพื้นหลัง, คาเร็ต, ... )
this.datasets[0].points
.bars
ฉันชอบโซลูชันนี้มากกว่าเพราะใช้ระบบคำแนะนำเครื่องมือ
onComplete
โทรกลับของแอนิเมชั่นแต่มันถูกเรียกใช้แม้ว่าจะวางเมาส์เหนือแถบของแผนภูมิซึ่งทำให้ข้อความวาดใหม่และให้เอฟเฟกต์กะพริบที่ไม่ต้องการฉันลองแล้วafterDraw
และมันก็เหมือนกันทั้งหมด ไม่ได้เกิดขึ้นในซอที่จัดทำโดย potatopeelings ความคิดใด ๆ โปรด?
จากตัวอย่าง chart.js (ไฟล์ Chart.js-2.4.0 / samples / data_labelling.html):
`` // กำหนดปลั๊กอินเพื่อจัดเตรียมป้ายกำกับข้อมูล
Chart.plugins.register({
afterDatasetsDraw: function(chartInstance, easing) {
// To only draw at the end of animation, check for easing === 1
var ctx = chartInstance.chart.ctx;
chartInstance.data.datasets.forEach(function (dataset, i) {
var meta = chartInstance.getDatasetMeta(i);
if (!meta.hidden) {
meta.data.forEach(function(element, index) {
// Draw the text in black, with the specified font
ctx.fillStyle = 'rgb(0, 0, 0)';
var fontSize = 16;
var fontStyle = 'normal';
var fontFamily = 'Helvetica Neue';
ctx.font = Chart.helpers.fontString(fontSize, fontStyle, fontFamily);
// Just naively convert to string for now
var dataString = dataset.data[index].toString();
// Make sure alignment settings are correct
ctx.textAlign = 'center';
ctx.textBaseline = 'middle';
var padding = 5;
var position = element.tooltipPosition();
ctx.fillText(dataString, position.x, position.y - (fontSize / 2) - padding);
});
}
});
}
});
``
ฉันขอแนะนำให้ใช้ปลั๊กอินนี้: https://github.com/chartjs/chartjs-plugin-datalabels
สามารถเพิ่มป้ายกำกับในแผนภูมิของคุณได้ง่ายๆโดยการนำเข้าปลั๊กอินไปยังไฟล์ js เช่น:
import 'chartjs-plugin-datalabels'
และสามารถปรับแต่งได้โดยใช้เอกสารเหล่านี้: https://chartjs-plugin-datalabels.netlify.com/options.html
แก้ไขคำตอบของ @ ajhuddy นิดหน่อย สำหรับแผนภูมิแท่งเท่านั้น เวอร์ชันของฉันเพิ่ม:
ข้อเสีย: เมื่อวางเมาส์เหนือแถบที่มีค่าอยู่ข้างในค่าอาจดูเป็นรอยหยักเล็กน้อย ฉันไม่พบวิธีแก้ไขปิดใช้งานเอฟเฟกต์โฮเวอร์ นอกจากนี้ยังอาจต้องปรับแต่งขึ้นอยู่กับการตั้งค่าของคุณเอง
การกำหนดค่า:
bar: {
tooltips: {
enabled: false
},
hover: {
animationDuration: 0
},
animation: {
onComplete: function() {
this.chart.controller.draw();
drawValue(this, 1);
},
onProgress: function(state) {
var animation = state.animationObject;
drawValue(this, animation.currentStep / animation.numSteps);
}
}
}
ผู้ช่วยเหลือ:
// Font color for values inside the bar
var insideFontColor = '255,255,255';
// Font color for values above the bar
var outsideFontColor = '0,0,0';
// How close to the top edge bar can be before the value is put inside it
var topThreshold = 20;
var modifyCtx = function(ctx) {
ctx.font = Chart.helpers.fontString(Chart.defaults.global.defaultFontSize, 'normal', Chart.defaults.global.defaultFontFamily);
ctx.textAlign = 'center';
ctx.textBaseline = 'bottom';
return ctx;
};
var fadeIn = function(ctx, obj, x, y, black, step) {
var ctx = modifyCtx(ctx);
var alpha = 0;
ctx.fillStyle = black ? 'rgba(' + outsideFontColor + ',' + step + ')' : 'rgba(' + insideFontColor + ',' + step + ')';
ctx.fillText(obj, x, y);
};
var drawValue = function(context, step) {
var ctx = context.chart.ctx;
context.data.datasets.forEach(function (dataset) {
for (var i = 0; i < dataset.data.length; i++) {
var model = dataset._meta[Object.keys(dataset._meta)[0]].data[i]._model;
var textY = (model.y > topThreshold) ? model.y - 3 : model.y + 20;
fadeIn(ctx, dataset.data[i], model.x, textY, model.y > topThreshold, step);
}
});
};
calculateTickRotation
มันอยู่ในฟังก์ชันมาตราส่วน ฉันจะวิเคราะห์มัน
จากประสบการณ์ของฉันเมื่อคุณรวมปลั๊กอิน chartjs-plugin-datalabels แล้ว (อย่าลืมวาง<script>
แท็กไว้หลังแท็ก chart.js บนหน้าของคุณ) แผนภูมิของคุณจะเริ่มแสดงค่า
หากคุณเลือกแล้วคุณสามารถปรับแต่งให้เหมาะกับความต้องการของคุณได้ การปรับแต่งได้รับการบันทึกไว้อย่างชัดเจนที่นี่แต่โดยพื้นฐานแล้วรูปแบบจะเหมือนกับตัวอย่างสมมุติฐานนี้:
var myBarChart = new Chart(ctx, {
type: 'bar',
data: yourDataObject,
options: {
// other options
plugins: {
datalabels: {
anchor :'end',
align :'top',
// and if you need to format how the value is displayed...
formatter: function(value, context) {
return GetValueFormatted(value);
}
}
}
}
});