Наложение линии на графике.график js
Мне было интересно, можно ли наложить линию поверх диаграммы.график js, например, линейный график ? Например, на оси x горизонтальная линия будет нарисована со значением 20 поперек графика
3 ответов
Я создал что-то, называемое диаграммой наложения, которую я добавил в свою вилку диаграммы.js (https://github.com/leighquince/Chart.js), который может быть использован в этой ситуации. он работает так же, как линия или гистограмма, только разница в том, что вы объявляете дополнительное свойство под названием type
это может быть либо 'line'
или 'bar'
. Тогда просто позвоните new Chart(ctx).Overlay(data)
.
так что для вашего примера вы можете просто иметь свою гистограмму, а затем предоставить другой набор данных (с некоторыми лучше цвета, чем я использовал), чтобы показать линию.
var data = {
labels: ["January", "February", "March", "April", "May", "June", "July"],
datasets: [{
label: "My First dataset",
//new option, barline will default to bar as that what is used to create the scale
type: "line",
fillColor: "rgba(220,220,220,0.2)",
strokeColor: "rgba(0,0,0,0.6)",
pointColor: "rgba(0,0,0,0.6)",
pointStrokeColor: "#fff",
pointHighlightFill: "#fff",
pointHighlightStroke: "rgba(220,220,220,1)",
datasetFill:false,
data: [20, 20, 20, 20, 20, 20, 20]
}, {
label: "My First dataset",
//new option, barline will default to bar as that what is used to create the scale
type: "bar",
fillColor: "rgba(220,20,220,0.2)",
strokeColor: "rgba(220,20,220,1)",
pointColor: "rgba(220,20,220,1)",
pointStrokeColor: "#fff",
pointHighlightFill: "#fff",
pointHighlightStroke: "rgba(220,220,220,1)",
data: [32, 25, 33, 88, 12, 92, 33]
}]
};
var ctx = document.getElementById("canvas").getContext("2d");
var chart = new Chart(ctx).Overlay(data, {
responsive: false
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://raw.githack.com/leighquince/Chart.js/master/Chart.js"></script>
<canvas id="canvas" width="400"></canvas>
мне нужно было что-то подобное, но вместо строки графика мне нужна была настоящая линия наложения, которая была плоской.
просто расширил график так:
Chart.types.Bar.extend({
name: 'BarOverlay',
draw: function (ease) {
Chart.types.Bar.prototype.draw.apply(this);
ctx.beginPath();
ctx.lineWidth = 2;
ctx.strokeStyle = 'rgba(255, 0, 0, 1.0)';
ctx.moveTo(35, this.scale.calculateY(100));
ctx.lineTo(this.scale.calculateX(this.datasets[0].bars.length), this.scale.calculateY(100));
ctx.stroke();
}
});
Mine жестко закодирован, чтобы нарисовать линию на отметке " 100 " (в этом случае, когда мы смотрели на цель 100%).
и назовите это так:
new Chart(ctx).BarOverlay(data, options);
Я также обнаружил, что код айвы устарел и не совместим с диаграммой 1.0.2.код js как-то (рендеринг пошли все боком).
ответ StrangeWill был отличным в качестве основы, но мне нужны были управляемые данными вертикальные линии на гистограмме, поэтому изменили его следующим образом:
сначала я добавил свойство в массив опций (добавление другого набора данных, возможно, чище, но мне пришлось бы сказать ChartJS игнорировать его), где каждый параметр является индексом значения данных, который я хочу выделить, примерно следующим образом:
ChartDefaults.verticalOverlayAtBar = [itemOne, itemTwo]
...
var HistoryChart = new Chart(ctx).BarOverlay(ChartData, ChartDefaults);
затем я изменил код StrangeWill, расширяя его для итерации массива элементов из выше и нарисуйте вертикальные линии на указанной полосе.
Chart.types.Bar.extend({
name: 'BarOverlay',
draw: function (ease) {
// First draw the main chart
Chart.types.Bar.prototype.draw.apply(this);
var ctx = this.chart.ctx;
var barWidth = this.scale.calculateBarWidth(this.datasets.length);
for (var i = 0; i < this.options.verticalOverlayAtBar.length; ++i) {
var overlayBar = this.options.verticalOverlayAtBar[i];
// I'm hard-coding this to only work with the first dataset, and using a Y value that I know is maximum
var x = this.scale.calculateBarX(this.datasets.length, 0, overlayBar);
var y = this.scale.calculateY(2000);
var bar_base = this.scale.endPoint
ctx.beginPath();
ctx.lineWidth = 2;
ctx.strokeStyle = 'rgba(255, 0, 0, 1.0)';
ctx.moveTo(x, bar_base);
ctx.lineTo(x, y);
ctx.stroke();
}
ctx.closePath();
}
});
это не идеально, поскольку я не знаком с кодом internals ChartJs, в частности, мои строки были 2 барами, хотя я подозреваю, что это ошибка fencepost в массиве данных, а не вычисления диаграммы. Однако, надеюсь, это полезный шаг вперед для кого-то другого.