Chart.js — Как настроить конкретную линию сетки в зависимости от значения тика

У меня есть лепестковая диаграмма, в которой "100" представляет глобальное среднее значение характеристики.

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

Есть ли способ сделать это?

Текущий код карты здесь: jsfiddle.

const config = {
            type: 'radar',
            data: data,
            options: {
                elements: {
                    line: {
                        borderWidth: 3
                    },
                    point: {
                        pointRadius: 5
                    }
                },
                scales: {

                    r: {
                        angleLines: {
                            lineWidth: 2
                        },
                        grid: {
                            circular: true,
                            lineWidth: 2
                        }
                    }
                }
            }
        };
Поведение ключевого слова "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) для оценки ваших знаний,...
1
0
32
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

На мой взгляд, логически правильный ответ состоит в том, чтобы определить grid.borderDash следующим образом:

grid: {
  ...
  borderDash: ctx => ctx.tick.value == 100 ? [8, 4] : []
},

Однако, чтобы заставить его работать, мне пришлось использовать ctx.tick.value == 95 (это может быть ошибка в Chart.js). Пожалуйста, взгляните на свой измененный код и посмотрите, как он работает.

let dataValues = [100, 120, 80, 100, 90, 110, 100, 100, 100]

const sum = dataValues.reduce((a, b) => a + b, 0);
const avg = sum / dataValues.length;
const sorted = [...dataValues].sort(function(a, b) {
  return a - b;
});
const data = {
  labels: dataValues.map((v, i) => 'Signal ' + (i + 1)),
  datasets: [{
      label: '9 signals',
      data: dataValues,
      fill: true,
      backgroundColor: 'rgba(210, 203, 203, 0.4)',
      borderColor: 'rgb(210, 203, 203, 0.6)',
      pointBackgroundColor: function(context) {
        var index = context.dataIndex;
        var value = context.dataset.data[index];
        return value < sorted[3] ? 'blue' :
          value < sorted[5] ? 'green' :
          value < sorted[7] ? 'orange' :
          'red';
      },
      pointBorderColor: '#fff',
      pointHoverBackgroundColor: '#fff',
      pointHoverBorderColor: 'rgb(255, 99, 132)'
    }
  ]
};

const config = {
  type: 'radar',
  data: data,
  options: {
    elements: {
      line: {
        borderWidth: 3
      },
      point: {
        pointRadius: 5
      }
    },
    scales: {
      r: {
        suggestedMin: 70,
        angleLines: {
          lineWidth: 2
        },
        grid: {
          circular: true,
          lineWidth: 2,
          borderDash: ctx => ctx.tick.value == 95 ? [8, 4] : []
        },
        ticks: {
          stepSize: 5
        }
      }
    }
  }
};

let myChart = new Chart('myChart',
  config
);
.chartBox {
  width: 400px;
}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.7.1/chart.min.js"></script>
<div class = "chartBox">
  <canvas id = "myChart"></canvas>
</div>

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