Как я могу показывать тексты, только если они вписываются в дугу в Chart.Js 2.8.0?

#javascript #chart.js

#javascript #chart.js

Вопрос:

У меня есть диаграмма пончика в диаграмме.Js с включенным chartjs-plugin-datalabels. Как я могу записать строку в сегменты, только если они помещаются в сегмент диаграммы?

На данный момент мой код выглядит так:

 let ctx = document.getElementById("myChart");
let myChart = new Chart(ctx, {
  plugins: [ChartDataLabels],
  type: 'doughnut',
  data: {
    labels: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"],
    datasets: [{
      label: '# of Votes',
      data: [12, 19, 3, 5, 0.3, 3],
      backgroundColor: [
        'rgba(255, 99, 132, 0.2)',
        'rgba(54, 162, 235, 0.2)',
        'rgba(255, 206, 86, 0.2)',
        'rgba(75, 192, 192, 0.2)',
        'rgba(153, 102, 255, 0.2)',
        'rgba(255, 159, 64, 0.2)'
      ],
      borderColor: [
        'rgba(255,99,132,1)',
        'rgba(54, 162, 235, 1)',
        'rgba(255, 206, 86, 1)',
        'rgba(75, 192, 192, 1)',
        'rgba(153, 102, 255, 1)',
        'rgba(255, 159, 64, 1)'
      ],
      borderWidth: 1
    }]
  },
  options: {
    plugins: {
      datalabels: {
        formatter: function(value) {
          return value   " kWh";
        }
      }
    },
    rotation: 1 * Math.PI,
    circumference: 1 * Math.PI
  }
});  
 <body>
  <canvas id="myChart" width="400" height="400"></canvas>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/chartjs-plugin-datalabels@0.6.0"></script>
</body>  

На следующем рисунке показана моя проблема:
введите описание изображения здесь

Комментарии:

1. @Adnan Sharif: Спасибо за редактирование, я не знал, как добавить этот пример бегуна фрагмента 🙂

Ответ №1:

Может быть, это может сработать? Метка добавляется только тогда, когда значение превышает определенный порог?

 let data = [12, 19, 3, 5, 0.3, 3];
let sum = 0;

for (var i = 0; i < data.length; i  ) {
  sum  = data[i]
}

let ctx = document.getElementById("myChart");
let myChart = new Chart(ctx, {
  plugins: [ChartDataLabels],
  type: 'doughnut',
  data: {
    labels: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"],
    datasets: [{
      label: '# of Votes',
      data: data, 
      backgroundColor: [
        'rgba(255, 99, 132, 0.2)',
        'rgba(54, 162, 235, 0.2)',
        'rgba(255, 206, 86, 0.2)',
        'rgba(75, 192, 192, 0.2)',
        'rgba(153, 102, 255, 0.2)',
        'rgba(255, 159, 64, 0.2)'
      ],
      borderColor: [
        'rgba(255,99,132,1)',
        'rgba(54, 162, 235, 1)',
        'rgba(255, 206, 86, 1)',
        'rgba(75, 192, 192, 1)',
        'rgba(153, 102, 255, 1)',
        'rgba(255, 159, 64, 1)'
      ],
      borderWidth: 1
    }]
  },
  options: {
    plugins: {
      datalabels: {
        formatter: function(value) {
          percentage = (value / sum) * 100;
          if (percentage < 1) {
             return "";
          }
          return value   " kWh";
        }
      }
    },
    rotation: 1 * Math.PI,
    circumference: 1 * Math.PI
  }
});  
 <body>
  <canvas id="myChart" width="400" height="400"></canvas>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/chartjs-plugin-datalabels@0.6.0"></script>
</body>  

Комментарии:

1. Это работает в зависимости от размера самой диаграммы. Если диаграмма действительно маленькая, пороговое значение необходимо будет динамически корректировать в соответствии с размером дуги. Но на данный момент я буду использовать это решение.

2. ДА. позвольте мне посмотреть, есть ли способ сделать это умнее.

3. Это работает лучше? Пока я просто использовал прямой процент. Но вы также должны уметь вычислять угол дуги

4. Рад, что смог помочь!

5. В моем случае мне пришлось суммировать данные следующим образом: let sum = dataSets.reduce((t, d) => t d.data.reduce((a, b) => a b), 0).toFixed(2); где dataSets находится весь объект dataset (это единственное, что мне пришлось повторить).