Как нарисовать проценты на гистограмме с помощью JavaScript

У меня есть очень полезная диаграмма, но моя проблема в том, что клиент хочет отображать процентную метку.
Ниже я прикрепил изображение того, что я хочу:

<html>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.4/Chart.js"></script>
<body>

<canvas id = "myChart" style = "width:100%;max-width:600px"></canvas>

<script>
const xValues = ["Italy", "France", "Spain", "USA", "Argentina"];
const yValues = [55, 49, 44, 24, 15];
const barColors = ["red", "green","blue","orange","brown"];

new Chart("myChart", {
  type: "bar",
  data: {
    labels: xValues,
    datasets: [{
      backgroundColor: barColors,
      data: yValues
    }]
  },
  options: {
    legend: {display: false},
    title: {
      display: true,
      text: "World Wine Production 2018"
    }
  }
});
</script>

</body>
</html>
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
0
99
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Чтобы показать процент в верхней части каждого столбца, вы можете использовать плагин datalabel со своими диаграммами. Это помогает добавить фактический счетчик по оси Y вверху каждого столбца. Даже вы можете изменить его поведение.

Даю ссылку на пример, откуда вы также сможете лучше понять это.[Ссылка на видео]

Ответ принят как подходящий

Вы можете использовать крючок onComplete для рисования/записи этих значений после полной визуализации анимации диаграммы. А затем используйте ctx.fillText(), чтобы настроить так, как вы предпочитаете.

const xValues = ["Italy", "France", "Spain", "USA", "Argentina"];
const yValues = [55, 49, 44, 24, 15];
const barColors = ["red", "green","blue","orange","brown"];
const total = yValues.reduce((acc, val) => acc + val, 0);
new Chart("myChart", {
  type: "bar",
  data: {
    labels: xValues,
    datasets: [{
      backgroundColor: barColors,
      data: yValues
    }]
  },
options: {
    legend: {display: false},
    title: {
      display: true,
      text: "World Wine Production 2018"
    },
    animation: {
      onComplete: function () {
        const ctx = this.chart.ctx;
        ctx.font = Chart.helpers.fontString(Chart.defaults.global.defaultFontSize, 'normal', Chart.defaults.global.defaultFontFamily);
        ctx.fillStyle = "red";
        ctx.textAlign = 'center';
        ctx.textBaseline = 'bottom';
        this.data.datasets.forEach(function (dataset) {
          for (let i = 0; i < dataset.data.length; i++) {
const model = dataset._meta[Object.keys(dataset._meta)[0]].data[i]._model;
            ctx.fillText(dataset.data[i], model.x, model.y - 5);
            ctx.fillText("%", model.x + 15, model.y - 5);
          }
        });
      }
    }
  }
});

ОБНОВЛЯТЬ

Не знаю, правильно ли я вас понимаю. Я предполагаю, что вы хотите добавить новые данные в диаграмму... Если да, то вам необходимо обновить массивы. Сопоставьте данные со значениями столбцов и цветов. Я предполагаю, что именно это вы имеете в виду, когда клиент хочет что-то добавить. А затем обновите массив dataset.

const xValues = ["Italy", "France", "Spain", "USA", "Argentina", "New1", "New2"];
const yValues = [55, 49, 44, 24, 15, 12, 99];
const barColors = ["red", "green","blue","orange","brown", "bronze", "purple"];
const total = yValues.reduce((acc, val) => acc + val, 0);
new Chart("myChart", {
  type: "bar",
  data: {
    labels: xValues,
    datasets: [{
      backgroundColor: barColors,
      data: yValues
    }]
  },
  options: {
    legend: {display: false},
    title: {
      display: true,
      text: "World Wine Production 2018"
    },
    animation: {
      onComplete: function () {
        const ctx = this.chart.ctx;
        ctx.font = Chart.helpers.fontString(Chart.defaults.global.defaultFontSize, 'normal', Chart.defaults.global.defaultFontFamily);
        ctx.fillStyle = "red";
        ctx.textAlign = 'center';
        ctx.textBaseline = 'bottom';
    this.data.datasets.forEach(function (dataset) {
          for (let i = 0; i < dataset.data.length; i++) {
            const model = dataset._meta[Object.keys(dataset._meta)[0]].data[i]._model;
            ctx.fillText(dataset.data[i], model.x, model.y - 5);
            ctx.fillText("%", model.x + 15, model.y - 5);
          }
        });
      }
    }
  }
});

https://cdpn.io/pen/debug/QWRKMNX?authentication_hash=xnMabpeVanRr

почему не работает, если я попытаюсь добавить еще один набор графиков

jhunlio 25.05.2024 09:38

@jhunlio Отредактируйте свой первый пост с помощью кода, пожалуйста. Потому что этому может быть несколько причин, например. область действия, идентификатор и т. д.

Łukasz D. Mastalerz 25.05.2024 09:51

Могу ли я как-нибудь это продублировать?

jhunlio 25.05.2024 09:54

@jhunlio просто «отредактируйте» свой первый пост, просто замените старый код на код с проблемой…

Łukasz D. Mastalerz 25.05.2024 10:09

Я редактирую эту часть new Chart("myChart", { в эту новую Chart("tvq", { но она не работает

jhunlio 25.05.2024 10:23

Можете ли вы дать мне пример кода, пожалуйста, о том, как дублировать график, пожалуйста

jhunlio 25.05.2024 10:30

@jhunlio Посмотрите обновление, я предполагаю, что вы говорите о…

Łukasz D. Mastalerz 25.05.2024 11:20

на самом деле я хочу продублировать всю диаграмму или другой набор диаграмм, но вы уже ответили на мой заданный вопрос, большое спасибо.

jhunlio 27.05.2024 08:24

я имею в виду, что несколько диаграмм на одной странице - это возможно\

jhunlio 27.05.2024 09:10

Другие вопросы по теме