Нарисовать горизонтальную линию на диаграмме в chart.js на v2
Я нарисовал линейную диаграмму, используя chart.js. Для меток и наборов данных я получаю значения из базы данных. Я новичок в chart.js и его очень мощной библиотеке, но я не могу ее полностью понять. Я хочу рисовать кратные горизонтальные линии. Как и где, если среднее значение набора данных, стандартное отклонение и мин. И макс. Я попробовал этот вопрос здесь, в stackoverflow, но они дают ошибки или, может быть, я не могу понять работу. Это мой код chart.js
function display_graph(id, label, data) {
var ctx = document.getElementById(id);
var data = {
labels: data.labels,
datasets: [
{
label: label,
fill: false,
lineTension: 0.1,
backgroundColor: "rgba(75,192,192,0.4)",
borderColor: "rgba(75,192,192,1)",
borderCapStyle: 'butt',
borderDash: [],
borderDashOffset: 0.0,
borderWidth: 1,
borderJoinStyle: 'miter',
pointBorderColor: "rgba(75,192,192,1)",
pointBackgroundColor: "#fff",
pointBorderWidth: 1,
pointHoverRadius: 5,
pointHoverBackgroundColor: "rgba(75,192,192,1)",
pointHoverBorderColor: "rgba(220,220,220,1)",
pointHoverBorderWidth: 2,
pointRadius: 1,
pointHitRadius: 10,
data: data.assay_value,
spanGaps: false
}
]
};
//options
var options = {
responsive: true,
title: {
display: true,
position: "top",
text: label,
fontSize: 18,
fontColor: "#111"
},
legend: {
display: true,
position: "bottom",
labels: {
fontColor: "#333",
fontSize: 16
}
}
};
var Blanks_Chart=null;
Blanks_Chart = new Chart(ctx, {
type: 'line',
data: data,
options: options
});}
Ответы
Ответ 1
Вы можете использовать плагин аннотации chart.js, чтобы легко рисовать линии на вашем графике, не заставляя вручную рушить пиксели рендеринга в своем холсте (старый подход, который дает вам ошибки). Обратите внимание: плагин создается/поддерживается той же командой, что и chart.js, и упоминается в документации chart.js.
Вот пример codepen, демонстрирующий создание строки на диаграмме.
Когда вы добавите плагин, вы просто просто установите свойства annotation
в конфигурацию диаграммы. Вот пример.
var myChart = new Chart(ctx, {
type: 'line',
data: {
labels: ["January", "February"],
datasets: [{
label: 'Dataset 1',
borderColor: window.chartColors.blue,
borderWidth: 2,
fill: false,
data: [2, 10]
}]
},
options: {
responsive: true,
title: {
display: true,
text: 'Chart.js Draw Line On Chart'
},
tooltips: {
mode: 'index',
intersect: true
},
annotation: {
annotations: [{
type: 'line',
mode: 'horizontal',
scaleID: 'y-axis-0',
value: 5,
borderColor: 'rgb(75, 192, 192)',
borderWidth: 4,
label: {
enabled: false,
content: 'Test label'
}
}]
}
}
});
Ответ 2
Вот пример того, как это работает в представлении Rails, если вы используете его с гемом Chartkick:
<%=
line_chart profit_per_day_chart_path(staff), xtitle: 'Day', ytitle: 'Profit',
library: {
annotation: {
annotations: [
{
type: 'line',
mode: 'horizontal',
scaleID: 'y-axis-0',
value: 20,
label: {
content: 'My Horizontal Line',
enabled: true
}
}
]
}
}
%>
Убедитесь, что вы сначала зарегистрировали плагин chartjs-plugin-annotation.js в Chart.js:
import ChartAnnotationsPlugin from 'chartjs-plugin-annotation';
Chart.plugins.register(ChartAnnotationsPlugin);
Ответ 3
если вы хотите нарисовать пороговую линию, проще всего использовать смешанную линейную диаграмму.
Примечание. Создайте массив, заполненный пороговым значением, и длина должна быть такой же, как у вашего набора данных.
var datasets = [1, 2, 3];
var ctx = document.getElementById('chart').getContext('2d');
var thresholdValue = 2;
var thresholdHighArray = new Array(datasets.length).fill(thresholdValue);
var myChart = new Chart(ctx, {
type: 'line',
data: {
labels: [],
datasets: [
{datasets}, thresholdHighArray]
},
options: {
responsive: true,
legend: {
position: 'bottom',
},
scales: {
xAxes: [{
display: true,
scaleLabel: {
display: true,
labelString: 'Readings'
}
}],
yAxes: [{
display: true,
scaleLabel: {
display: true,
labelString: 'Reading ( °C )'
}
}]
},
annotation: {
annotations: [
{
type: "line",
mode: "vertical",
scaleID: "x-axis-0",
borderColor: "red",
label: {
content: "",
enabled: true,
position: "top"
}
}
]
}
});
};