11 ответов:
поздняя правка: есть официальный плагин для диаграммы.js
2.7.0+для этого:https://github.com/chartjs/chartjs-plugin-datalabelsоригинальный ответ:
вы можете перебирать точки / бары onAnimationComplete и отображать значения
предварительный просмотр
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); }); }) } });
Скрипка -http://jsfiddle.net/uh9vw0ao/
вот обновленная версия для диаграммы.js 2.3
23 сентября 2016: отредактировал мой код для работы с v2.3 для обоих типов линий/баров.
важно: даже если вам не нужна анимация, не меняйте параметр длительности на 0, иначе вы получите chartInstance.контроллер не определен ошибка.
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 answer
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); } }); }}
Я думаю, что самый хороший вариант сделать это в 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); } }); } });
на основе ответа @Ross ответ для диаграммы.js 2.0 и выше, мне пришлось включить небольшую настройку, чтобы защититься от случая, когда высота бара слишком выбрана для границы шкалы.
The
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); } }); } }
после этого хороший ответ, Я бы использовал эти параметры для гистограммы:
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);при этом по-прежнему используется система подсказок и его преимущества (автоматическое позиционирование, шаблонизация, ...), но скрывая украшения (цвет фона, каре, ...)
из графика.образцы js (файловая диаграмма.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); } }); };
по моему опыту, как только вы включаете chartjs-plugin-datalabels плагин (обязательно разместите
<script>тег после диаграммы.JS tag на Вашей странице), ваши диаграммы начинают отображать значения.Если вы затем выберите вы можете настроить его в соответствии с вашими потребностями. настройка четко документирована здесь но в основном, формат похож на этот гипотетический пример:
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); } } } } });
Если вы используете плагин chartjs-plugin-datalabels тогда следующий объект параметров кода поможет
убедитесь, что вы импортировали
import 'chartjs-plugin-datalabels';в вашем файле typescript или добавьте ссылку на<script src="chartjs-plugin-datalabels.js"></script>в вашем файле javascript.options: { maintainAspectRatio: false, responsive: true, scales: { yAxes: [{ ticks: { beginAtZero: true, } }] }, plugins: { datalabels: { anchor: 'end', align: 'top', formatter: Math.round, font: { weight: 'bold' } } } }




Comments