Согласно документации , стиль сетки 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.
// 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
Ответ на этот вопрос относится к предыдущей версии Chartjs и больше не действителен.
Нет никакой разницы в определении осей между их ролями: 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). Посмотрим, смогу ли я адаптировать этот пример к линиям сетки.
Это было легко адаптировать. Работает как шарм. Ваше здоровье! Я добавлю дополнение к своему вопросу, чтобы обеспечить правильное форматирование.
Цвет линий сетки задается в строке кода Chart.defaults.scales[axisType].grid.color = 'rgba(0,0,0,0.3)'
Поскольку видна только одна из линий сетки, этот параметр может быть статическим. Если вы хотите, чтобы обе линии сетки по осям были видимыми, вы также можете установить эту опцию в качестве функции.
Если углубиться в ваш пересмотренный ответ, мне нравится, как вы справляетесь с любыми потенциальными экземплярами оси Y. Хороший.
В ответ на ответ кикон,
Я использую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 произошли изменения со времени предыдущего ответа, но надеюсь, что это будет кому-то полезно.
Я нашел этот вопрос -- который находится по соседству -- но он не доходит до решения моего конкретного вопроса.