Установка глобальных значений по умолчанию Chartjs для отдельных осей

Согласно документации , стиль сетки Chartjs (v4) контролируется с помощью пространства имен options.scales[scaleId].grid. Я могу глобально управлять стилем выбранных элементов, используя такие операторы, как:

Chart.defaults.scale.grid.display = true;
Chart.defaults.scale.grid.lineWidth = 5;

Однако я не могу найти синтаксис для управления значениями по умолчанию для отдельных осей, используя часть [scaleId] вышеуказанного пространства имен. Я пробовал следующее, но безрезультатно:

Chart.defaults.scales.x.grid.display = true;
Chart.defaults.scales['x'].grid.display = true;

Каков правильный синтаксис для индивидуальной установки значений по умолчанию для осей?

TLDR; Я устанавливаю глобальные свойства отображения в отдельном файле и импортирую эти настройки в каждую диаграмму (у меня более 20 диаграмм) в проекте Vue 3.

диаграммаDefaults.js

// Set project defaults

import Chart from "chart.js/auto"

// general
Chart.defaults.responsive = true;
Chart.defaults.maintainAspectRatio = false;

// animations
Chart.defaults.animation.duration = 2000;
Chart.defaults.animation.easing = 'easeInOutQuart';

...

Я проверил объект Chart.defaults, но не вижу ссылок на отдельные оси внутри объекта по умолчанию.


ОБНОВЛЕНИЕ: я нашел конструкцию, которую примет моя IDE, но, похоже, она не влияет на диаграммы.

Chart.defaults.scales.linear.axis.x = {
  grid: {
    borderColor: '#FF0000',
    display: true,
  }
};

Решение

Чтобы показать правильное отформатированное решение моего вопроса, я прикрепляю его сюда. Решение было предоставлено @kikon ниже.

if (!Chart.defaults.scales.category.grid){
   Chart.defaults.scales.category.grid = {};
}
Chart.defaults.scales.category.grid.color = 'red'; // x-axis

Я нашел этот вопрос -- который находится по соседству -- но он не доходит до решения моего конкретного вопроса.

DaveL17 06.05.2024 01:05

Ответ на этот вопрос относится к предыдущей версии Chartjs и больше не действителен.

DaveL17 06.05.2024 01:10
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
90
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Нет никакой разницы в определении осей между их ролями: x, y или r. Вы можете установить значения по умолчанию с помощью type, т. е. linear, category, time и т. д.

По умолчанию для большинства типов графиков ось x имеет тип "category", а ось y — типа "linear". Если это так для всех ваших диаграмм, вы можете использовать это для установки значений по умолчанию:

if (!Chart.defaults.scales.linear.border){
   Chart.defaults.scales.linear.border = {};
}
Chart.defaults.scales.linear.border.color = 'blue'; // y-axis

if (!Chart.defaults.scales.category.border){
   Chart.defaults.scales.category.border = {};
}
Chart.defaults.scales.category.border.color = 'red'; // x-axis

Однако, если вы собираетесь использовать типы осей, отличные от типов по умолчанию, например, использование линейных осей для x и y, вы можете использовать тот факт, что нужные вам параметры доступны для сценариев, поэтому вы можете установить значения по умолчанию для функций, которые запрашивают роль шкалы во время выполнения, через свойство .axis (его значение может быть x, y или r):

if (!Chart.defaults.scales.linear.border){
   Chart.defaults.scales.linear.border = {};
}
Chart.defaults.scales.linear.border.color = function({scale}){
   if (scale.axis === 'x'){
      return 'red'
   }
   if (scale.axis === 'y'){
      return 'blue'
   }
};

Вот более подробный пример:

for(axisType of ['linear', 'category']){
    Chart.defaults.scales[axisType].border = Chart.defaults.scales[axisType].border ?? {};
    Chart.defaults.scales[axisType].border.color = function({scale}){
        if (scale.axis === 'x'){
            return 'red'
        }
        if (scale.axis === 'y'){
            return 'blue'
        }
    }

    Chart.defaults.scales[axisType].grid = Chart.defaults.scales[axisType].grid ?? {};

    Chart.defaults.scales[axisType].grid.color = 'rgba(0,0,0,0.3)'
    Chart.defaults.scales[axisType].grid.display = function({scale}){
        if (scale.axis === 'x'){
            return true
        }
        if (scale.axis === 'y'){
            return false
        }
    }
    Chart.defaults.scales[axisType].grid.tickColor = function({scale}){
        if (scale.axis === 'x'){
            return 'red';
        }
        if (scale.axis === 'y'){
            return 'blue';
        }
    }

    Chart.defaults.scales[axisType].ticks = Chart.defaults.scales[axisType].ticks ?? {};
    Chart.defaults.scales[axisType].ticks.color = function({scale}){
        if (scale.axis === 'x'){
            return 'rgb(128, 0, 0)';
        }
        if (scale.axis === 'y'){
            return 'rgb(0, 0, 192)';
        }
    }
}
const data = {
    datasets: [
        {
            label: 'Some data',
            showLine: true,
            pointRadius: 2,
            data:
                [ {x: 8.25257, y: 8.25257}, {x: 9.30005, y: 12.30005}, {x: 9.90518, y: 9.90518} ],
        }
    ]
};

const config = {
    type: 'line',
    data: data,
    options: {
        responsive: true,
        maintainAspectRatio: false,
        scales:{
            x:{
                type: 'linear'
            },
        }
    },
};

new Chart(document.querySelector('#chart1'), config);
<div style = "min-height:400px">
    <canvas id = "chart1"></canvas>
</div>
<script src = "https://cdn.jsdelivr.net/npm/chart.js"></script>

Спасибо, что нашли время написать такой подробный и вдумчивый ответ. Этот подход меняет цвет осей X или Y, тогда как я хочу изменить цвет линий сетки (в моем случае вертикальных линий, исходящих из оси X). Посмотрим, смогу ли я адаптировать этот пример к линиям сетки.

DaveL17 07.05.2024 19:12

Это было легко адаптировать. Работает как шарм. Ваше здоровье! Я добавлю дополнение к своему вопросу, чтобы обеспечить правильное форматирование.

DaveL17 07.05.2024 19:14

Цвет линий сетки задается в строке кода Chart.defaults.scales[axisType].grid.color = 'rgba(0,0,0,0.3)' Поскольку видна только одна из линий сетки, этот параметр может быть статическим. Если вы хотите, чтобы обе линии сетки по осям были видимыми, вы также можете установить эту опцию в качестве функции.

kikon 07.05.2024 20:11

Если углубиться в ваш пересмотренный ответ, мне нравится, как вы справляетесь с любыми потенциальными экземплярами оси Y. Хороший.

DaveL17 07.05.2024 21:01

В ответ на ответ кикон,

Я используюchartJS с Laravel 11 и настраиваю некоторые глобальные настройки в файле app.js. Я обнаружил, что код в ответе kikon у меня не работает. Поигравшись, я получил следующий код, который, похоже, у меня работал.

/* resources\js\app.js */

Chart.defaults.scale.grid.color = '#fff3';
Chart.defaults.scale.grid.display = function ({ scale }) {
    if (scale.axis === 'x') {
        return false
    }
    if (scale.axis === 'y') {
        return true
    }
}

Chart.defaults.scale.border.color = function ({ scale }) {
    if (scale.axis === 'x') {
        return 'white'
    }
    if (scale.axis === 'y') {
        return 'transparent'
    }
}

Chart.defaults.scale.grid.tickColor = 'transparent';

Я не знаю, это Laravel или в самомchartJS произошли изменения со времени предыдущего ответа, но надеюсь, что это будет кому-то полезно.

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