Es ist mir gelungen, herauszufinden, wie ich die hier im Stackoverflow gefundenen Lösungen verbessern kann, um vertikale und horizontale Linien zu einem Liniendiagramm in ChartJS v2 + hinzuzufügen, um sie auf ein Blasendiagramm anzuwenden (Ich rate dazu, zu meinem Update zu wechseln Ende für einen besseren Ansatz)Wie schattiere ich einen Teil des Hintergrunds von ChartJS Bubble Chart?
var originalBubbleDraw = Chart.controllers.bubble.prototype.draw;
Chart.helpers.extend(Chart.controllers.bubble.prototype, {
draw: function() {
originalBubbleDraw.apply(this, arguments);
var chart = this.chart;
var ctx = chart.chart.ctx;
var xaxis = chart.scales['x-axis-0'];
var yaxis = chart.scales['y-axis-0'];
var xvalue = chart.config.data.queryLimits['x'];
var yvalue = chart.config.data.queryLimits['y'];
var xcolor = chart.config.data.queryLimits['xcolor'];
var ycolor = chart.config.data.queryLimits['ycolor'];
var lineThickness = 3;
function drawLine(x1,y1,x2,y2,color) {
console.log("color="+color+", x1="+x1+", x2="+x2+", y1="+y1+", y2="+y2);
ctx.save();
ctx.beginPath();
ctx.moveTo(x1, y1);
ctx.strokeStyle = color;
ctx.lineWidth=lineThickness;
ctx.lineTo(x2, y2);
ctx.stroke();
ctx.restore();
}
// draw vertical line
if (xvalue) {
x1 = xaxis.getPixelForValue(xvalue);
x2 = xaxis.getPixelForValue(xvalue);
y1 = yaxis.top;
y2 = yaxis.bottom;
drawLine(x1,y1,x2,y2,xcolor);
}
// draw horizontal line
if (yvalue) {
x1 = xaxis.left;
x2 = xaxis.right;
y1 = yaxis.getPixelForValue(yvalue);
y2 = yaxis.getPixelForValue(yvalue);
drawLine(x1,y1,x2,y2,ycolor);
}
}
});
var config = {
type: 'bubble',
data: {
queryLimits: {x: 42, y: 21, xcolor: '#00FF00', ycolor: '#0000ff'},
datasets: [
{
label: '',
data: [
{x: 20, y: 30, r: 15},
{x: 40, y: 10, r: 10},
{x: 100, y: 15, r: 10},
{x: 50, y: 22, r: 5},
{x: 80, y: 26, r: 3},
{x: 63, y: 28, r: 10},
{x: 71, y: 18, r: 12}
],
backgroundColor:"#FF6384",
hoverBackgroundColor: "#FF6384",
}]
}
};
var ctx = document.getElementById("myChart").getContext("2d");
new Chart(ctx, config);
I noch einen Schritt weiter gehen müssen und Schatten auf den Bereich/Hintergrund des Diagramms auf einer Seite der vertikalen Linie und oberhalb oder unterhalb der horizontalen Linie einer anderen Farbe (wie ein Licht grau oder etwas subtil).
Ich bin mir nicht sicher, ob der Ansatz versucht, einen Teil des Hintergrunds zu ändern oder Rechtecke hinzuzufügen, die so groß und positioniert sind, dass sie die Hintergrundschattierung simulieren.
Ideen?
Hier ist ein Beispiel Mockup des Ziel ist:
für diejenigen, sehen dies in der Zukunft
aktualisieren
Für was es wert ist, landete ich einen besseren Weg zu entdecken bis zu Nähern Sie sich sowohl dem Zeichnen von Linien als auch von Rechtecken, indem Sie das Annotations-Plugin für Chartjs verwenden, das Sie hier finden: https://github.com/chartjs/chartjs-plugin-annotation. Es ist viel einfacher zu arbeiten und hat nicht zur Folge, dass der Code zum Zeichnen der Linien und Rechtecke mehr als nötig abgefeuert wird. Außerdem konnte ich ein anderes Plugin https://github.com/compwright/chartjs-plugin-draggable zum Ziehen von Anmerkungen verwenden, die von diesem ersten Plugin erstellt wurden. Ich lasse die akzeptierte Antwort so, wie sie ist, weil sie die Frage beantwortet, die ich aus dem Kontext hatte, wie man den rechteckigen schattierten Bereich nach dem ursprünglichen Erweiterungs-Ansatz löst, aber ich empfehle den Plugin-Ansatz gegenüber dem, nachdem ich mehr darüber gelernt habe.
Excellent! Danke für die detaillierte Antwort und flexible Lösung. Befinden sich diese Rechtecke standardmäßig oberhalb der Punkte und Linien im Diagramm oder darunter? Gibt es eine Z-Dimension, die Objekte darunter blockiert? Ich frage, weil die nächste Aufgabe sein wird, eine Interaktionshandhabung zu erstellen, so dass die Linien verschoben werden können (die Schattierung würde der Linienbewegung folgen) und die Punkte können angeklickt werden, um anderswo zu navigieren. – Streamline
@Streamline Leider gibt es im Canvas keine eingebaute z-Eigenschaft. Das gleiche Problem gilt für Chart.js. Ich weiß nicht, wie du es schaffen würdest, ich wäre froh zu wissen, ob du es zufällig findest. – tektiv
Für was es wert ist, entdeckte ich einen besseren Weg, um sowohl das Zeichnen von Linien und Rechtecke zu erreichen, indem Sie das Annotation-Plugin für Chartjs hier https://github.com/chartjs/chartjs-plugin-annotation verwenden. Es ist viel einfacher zu arbeiten und hat nicht zur Folge, dass der Code zum Zeichnen der Linien und Rechtecke mehr als nötig abgefeuert wird. Außerdem konnte ich ein anderes Plugin zum Ziehen von Anmerkungen verwenden, die mit diesem ersten Plugin erstellt wurden. Ich werde den ursprünglichen Beitrag auch für zukünftige Leute aktualisieren. – Streamline