Me gustaría preguntar si es posible usar Chart.js mostrar valores de datos? Quiero imprimir el gráfico.
Gracias por cualquier consejo.
Me gustaría preguntar si es posible usar Chart.js mostrar valores de datos? Quiero imprimir el gráfico.
Gracias por cualquier consejo.
Respuestas:
Edición tardía: hay un complemento oficial para Chart.js 2.7.0+
para hacer esto: https://github.com/chartjs/chartjs-plugin-datalabels
Respuesta original:
Puede recorrer los puntos / barras enAnimationComplete y mostrar los valores
Avance
HTML
<canvas id="myChart1" height="300" width="500"></canvas>
<canvas id="myChart2" height="300" width="500"></canvas>
Guión
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);
});
})
}
});
Fiddle - http://jsfiddle.net/uh9vw0ao/
onComplete
devolución de llamada aquí, pero también se activa cuando el mouse se encuentra en la barra del gráfico, lo que hace que el número parpadee debido a que se vuelve a dibujar. ¿Sería igual si onAnimationComplete
? No puedo usar esta devolución de llamada con mi código de gráfico existente (ver var chartBar
en la parte inferior pastebin.com/tT7yTkGh )
Aquí hay una versión actualizada para Chart.js 2.3
23 de septiembre de 2016: Edité mi código para que funcione con v2.3 tanto para el tipo de línea como de barra.
Importante: incluso si no necesita la animación, no cambie la opción de duración a 0, de lo contrario obtendrá chartInstance.controller es un error indefinido .
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>
Esta opción de animación funciona para 2.1.3 en un gráfico de barras.
Respuesta de @Ross ligeramente modificada
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}
para detener la animación de las etiquetas al pasar el
.filter(dataset => !dataset._meta[0].hidden)
Creo que la mejor opción para hacer esto en chartJS v2.x es usar un complemento, por lo que no tiene un gran bloque de código en las opciones. Además, evita que los datos desaparezcan al pasar el cursor sobre una barra.
Es decir, simplemente use este código, que registra un complemento que agrega el texto después de que se dibuja el gráfico.
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;
. El problema con esa solución es que la afterDraw
función se llama cientos de veces, probablemente generando una sobrecarga de CPU. Aún así, es la única respuesta por ahora sin parpadeos. Si necesita una mejor representación para horizontalBar
gráficos, use ctx.textAlign = 'left'; ctx.textBaseline = 'middle';
y ctx.fillText(dataset.data[i], model.x+5, model.y);
.
Según la respuesta de @ Ross para Chart.js 2.0 y superior, tuve que incluir un pequeño ajuste para protegerme contra el caso en que las alturas de la barra también se eligieron en el límite de la escala.
El animation
atributo de la opción del gráfico de barras:
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()
al final, pero no ayudó
onComplete
devolución de llamada se ejecuta cuando coloqué el cursor sobre la barra, lo que hace que el redibujo y el texto parezca parpadear. ¿Sería lo mismo con esto onAnimationComplete
también? No puedo usar la onAnimationComplete
devolución de llamada con mi código existente (ver var chartBar
en la parte inferior de pastebin. com / tT7yTkGh
Si está utilizando el complemento chartjs-plugin-datalabels , el siguiente objeto de opciones de código le ayudará
Asegúrese de importar import 'chartjs-plugin-datalabels';
en su archivo mecanografiado o agregar una referencia <script src="chartjs-plugin-datalabels.js"></script>
en su archivo javascript.
options: {
maintainAspectRatio: false,
responsive: true,
scales: {
yAxes: [{
ticks: {
beginAtZero: true,
}
}]
},
plugins: {
datalabels: {
anchor: 'end',
align: 'top',
formatter: Math.round,
font: {
weight: 'bold'
}
}
}
}
Siguiendo esta buena respuesta , usaría estas opciones para un gráfico de barras:
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);
Esto todavía utiliza el sistema de información sobre herramientas y sus ventajas (posicionamiento automático, plantillas, ...) pero ocultando las decoraciones (color de fondo, símbolo de intercalación, ...)
this.datasets[0].points
lugar de .bars
. Prefiero esta solución porque utiliza el sistema de información sobre herramientas.
onComplete
devolución de llamada de las animaciones, pero se activa incluso cuando se pasa sobre las barras del gráfico, lo que hace que el texto se vuelva a dibujar y dé un efecto de parpadeo no deseado. También lo intenté afterDraw
y es todo lo mismo. no sucede en el violín proporcionado por peladuras de papa. ¿Alguna idea por favor?
De las muestras de chart.js (archivo Chart.js-2.4.0 / samples / data_labelling.html):
`` `// Defina un complemento para proporcionar etiquetas de datos
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);
});
}
});
}
});
''
Recomendaría usar este complemento: https://github.com/chartjs/chartjs-plugin-datalabels
Las etiquetas se pueden agregar a sus gráficos simplemente importando el complemento al archivo js, por ejemplo:
import 'chartjs-plugin-datalabels'
Y se puede ajustar con estos documentos: https://chartjs-plugin-datalabels.netlify.com/options.html
Editado un poco la respuesta de @ ajhuddy. Solo para gráficos de barras . Mi versión agrega:
Desventaja: al pasar el cursor sobre una barra que tiene un valor en su interior, el valor puede verse un poco irregular. No he encontrado una solución para desactivar los efectos de desplazamiento. También podría necesitar ajustes dependiendo de su propia configuración.
Configuración:
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);
}
}
}
Ayudantes:
// 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
, está dentro de la función Scale. Yo lo analizaré.
Según mi experiencia, una vez que incluye el complemento chartjs-plugin-datalabels (asegúrese de colocar la <script>
etiqueta después de la etiqueta chart.js en su página), sus gráficos comienzan a mostrar valores.
Si elige, puede personalizarlo para que se ajuste a sus necesidades. La personalización está claramente documentada aquí, pero básicamente, el formato es como este ejemplo hipotético:
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);
}
}
}
}
});