Vorrei chiedere se è possibile utilizzare Chart.js visualizzare i valori dei dati? Voglio stampare il grafico.
Grazie per qualsiasi consiglio.
Vorrei chiedere se è possibile utilizzare Chart.js visualizzare i valori dei dati? Voglio stampare il grafico.
Grazie per qualsiasi consiglio.
Risposte:
Modifica tardiva: esiste un plugin ufficiale per Chart.js 2.7.0+per farlo: https://github.com/chartjs/chartjs-plugin-datalabels
Risposta originale:
È possibile scorrere i punti / le barre suAnimationComplete e visualizzare i valori
Anteprima
HTML
<canvas id="myChart1" height="300" width="500"></canvas>
<canvas id="myChart2" height="300" width="500"></canvas>
copione
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/
onCompleterichiamata qui ma si attiva anche quando il passaggio del mouse si trova sulla barra del grafico facendo lampeggiare il numero a causa del ridisegno. Sarebbe lo stesso se onAnimationComplete? Non sono in grado di utilizzare questa richiamata con il mio codice grafico esistente (vedere var chartBarin fondo pastebin.com/tT7yTkGh )
Ecco una versione aggiornata per Chart.js 2.3
23 settembre 2016: modificato il mio codice in modo che funzioni con la v2.3 per entrambi i tipi di riga / barra.
Importante: anche se non hai bisogno dell'animazione, non modificare l'opzione di durata su 0, altrimenti otterrai un errore chartInstance.controller non definito .
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>
Questa opzione di animazione funziona per 2.1.3 su un grafico a barre.
Risposta @Ross leggermente modificata
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}l'interruzione dell'animazione delle etichette al passaggio del mouse
.filter(dataset => !dataset._meta[0].hidden)
Penso che l'opzione più bella per farlo in chartJS v2.x sia usare un plugin, quindi non hai un grande blocco di codice nelle opzioni. Inoltre, impedisce ai dati di scomparire quando si passa con il mouse su una barra.
Ad esempio, usa semplicemente questo codice, che registra un plugin che aggiunge il testo dopo che il grafico è stato disegnato.
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;. Il problema con quella soluzione è che la afterDrawfunzione viene chiamata centinaia di volte, probabilmente generando un sovraccarico della CPU. Tuttavia, per ora è l'unica risposta senza batter ciglio. Se hai bisogno di un rendering migliore per i horizontalBargrafici, usa ctx.textAlign = 'left'; ctx.textBaseline = 'middle';e ctx.fillText(dataset.data[i], model.x+5, model.y);.
Sulla base della risposta di @ Ross per Chart.js 2.0 e versioni successive, ho dovuto includere un piccolo aggiustamento per proteggermi dal caso in cui anche le altezze della barra vengono scelte per il confine della scala.
L' animationattributo dell'opzione del grafico a barre:
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()alla fine ma non ha aiutato
onCompleterichiamata viene eseguita quando si passa con il mouse sulla barra, il che fa lampeggiare il ridisegno e il testo. Sarebbe lo stesso anche con onAnimationComplete? Non sono in grado di utilizzare la onAnimationCompleterichiamata con il mio codice esistente (vedere var chartBarin fondo a pastebin. com / tT7yTkGh
Se stai usando il plugin chartjs-plugin-datalabels, il seguente oggetto delle opzioni del codice ti aiuterà
Assicurati di importare import 'chartjs-plugin-datalabels';nel file dattiloscritto o di aggiungere un riferimento a <script src="chartjs-plugin-datalabels.js"></script>nel file javascript.
options: {
maintainAspectRatio: false,
responsive: true,
scales: {
yAxes: [{
ticks: {
beginAtZero: true,
}
}]
},
plugins: {
datalabels: {
anchor: 'end',
align: 'top',
formatter: Math.round,
font: {
weight: 'bold'
}
}
}
}
Seguendo questa buona risposta , utilizzerei queste opzioni per un grafico a barre:
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);
Questo utilizza ancora il sistema di tooltip ei suoi vantaggi (posizionamento automatico, modellazione, ...) ma nascondendo le decorazioni (colore di sfondo, cursore, ...)
this.datasets[0].pointsinvece di .bars. Preferisco questa soluzione perché utilizza il sistema dei suggerimenti.
onCompleterichiamata delle animazioni, ma viene attivato anche quando si passa con il mouse sulle barre del grafico, il che fa sì che il testo si ridisegni e dia un effetto lampeggiante indesiderato.Ho anche provato afterDrawed è tutto uguale. non succede nel violino fornito da potatopeelings.Any Ideas plz?
Dagli esempi di chart.js (file Chart.js-2.4.0 / samples / data_labelling.html):
`` `` // Definisci un plugin per fornire etichette dati
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);
});
}
});
}
});
`` `
Consiglierei di usare questo plugin: https://github.com/chartjs/chartjs-plugin-datalabels
Le etichette possono essere aggiunte ai grafici semplicemente importando il plugin nel file js, ad esempio:
import 'chartjs-plugin-datalabels'
E può essere ottimizzato utilizzando questi documenti: https://chartjs-plugin-datalabels.netlify.com/options.html
Ho modificato leggermente la risposta di @ ajhuddy. Solo per grafici a barre . La mia versione aggiunge:
Lato negativo: quando si passa con il mouse su una barra che ha un valore al suo interno, il valore potrebbe apparire un po 'frastagliato. Non ho trovato una soluzione per disabilitare gli effetti hover. Potrebbe anche essere necessario modificare a seconda delle tue impostazioni.
Configurazione:
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);
}
}
}
Helpers:
// 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, è all'interno della funzione Scale. Lo analizzerò.
Dalla mia esperienza, una volta incluso il plugin chartjs-plugin-datalabels (assicurati di posizionare il file<script> tag dopo il tag chart.js sulla tua pagina), i tuoi grafici iniziano a visualizzare i valori.
Se lo scegli, puoi personalizzarlo in base alle tue esigenze. La personalizzazione è chiaramente documentata qui ma fondamentalmente, il formato è come questo esempio ipotetico:
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);
}
}
}
}
});