Ich bin ziemlich neu in D3 und habe versucht, alles herauszufinden. Ich versuche dieses Beispiel here zu konfigurieren, um mit neuen Daten zu aktualisieren und entsprechend zu wechseln. HierWie können Daten sauber entfernt werden, bevor d3.js chart aktualisiert wird?
ist der Code Stift I konfiguriert habe (klicken Sie auf das Absenden zu aktualisieren) http://codepen.io/anon/pen/pbjLRW?editors=1010
Von dem, was ich sammeln kann, indem ein gewisse Variation von .exit() ist für einen sauberen Datenübergang erforderlich, aber nach dem Lesen einige Tutorials Ich finde es immer noch schwierig zu wissen, wie es funktioniert. Ich habe Beispiele gesehen, bei denen das Entfernen der Container vor dem Aufrufen der Zeichenfunktion funktioniert, aber aufgrund meiner begrenzten Erfahrung kann es beim Datenwechsel zu einem Flimmern kommen, so dass ich nicht sicher bin, ob es die beste Vorgehensweise ist.
Jetzt bin ich nicht sicher, warum die Daten in meinem Codepen nicht korrekt aktualisiert werden, aber mein Hauptanliegen ist, den Übergang richtig zu machen. Idealerweise würde ich gerne wissen, wie ich die Nadel beim Datenwechsel einfach bewegen könnte, also würde es beispielsweise von 90> 40 anstelle von 90> 0> 40 gehen.
Allerdings werde ich mich definitiv damit begnügen herauszufinden warum Es wird nicht am selben Ort neu gezeichnet, wenn Sie im verknüpften CodePen auf "Senden" klicken.
Hier ist meine Update-Funktion;
function updateGuage() {
d3.selectAll("text").remove()
d3.selectAll('.needle').remove()
chart.remove()
name = "qwerty";
value = "25";
drawGuage();
}
initial zeichnen;
function drawGuage() {
percToDeg = function(perc) {
return perc * 360;
};
percToRad = function(perc) {
return degToRad(percToDeg(perc));
};
degToRad = function(deg) {
return deg * Math.PI/180;
};
// Create SVG element
svg = el.append('svg').attr('width', width + margin.left + margin.right).attr('height', height + margin.top + margin.bottom);
// Add layer for the panel
chart = svg.append('g').attr('transform', "translate(" + ((width + margin.left)/2) + ", " + ((height + margin.top)/2) + ")");
chart.append('path').attr('class', "arc chart-first");
chart.append('path').attr('class', "arc chart-second");
chart.append('path').attr('class', "arc chart-third");
arc3 = d3.svg.arc().outerRadius(radius - chartInset).innerRadius(radius - chartInset - barWidth)
arc2 = d3.svg.arc().outerRadius(radius - chartInset).innerRadius(radius - chartInset - barWidth)
arc1 = d3.svg.arc().outerRadius(radius - chartInset).innerRadius(radius - chartInset - barWidth)
repaintGauge = function() {
perc = 0.5;
var next_start = totalPercent;
arcStartRad = percToRad(next_start);
arcEndRad = arcStartRad + percToRad(perc/3);
next_start += perc/3;
arc1.startAngle(arcStartRad).endAngle(arcEndRad);
arcStartRad = percToRad(next_start);
arcEndRad = arcStartRad + percToRad(perc/3);
next_start += perc/3;
arc2.startAngle(arcStartRad + padRad).endAngle(arcEndRad);
arcStartRad = percToRad(next_start);
arcEndRad = arcStartRad + percToRad(perc/3);
arc3.startAngle(arcStartRad + padRad).endAngle(arcEndRad);
chart.select(".chart-first").attr('d', arc1);
chart.select(".chart-second").attr('d', arc2);
chart.select(".chart-third").attr('d', arc3);
}
/////////
var texts = svg.selectAll("text")
.data(dataset)
.enter();
texts.append("text")
.text(function() {
return dataset[0].metric;
})
.attr('id', "Name")
.attr('transform', "translate(" + ((width + margin.left)/6) + ", " + ((height + margin.top)/1.5) + ")")
.attr("font-size", 25)
.style("fill", "#000000");
var trX = 180 - 210 * Math.cos(percToRad(percent/2));
var trY = 195 - 210 * Math.sin(percToRad(percent/2));
// (180, 195) are the coordinates of the center of the gauge.
displayValue = function() {
texts.append("text")
.text(function() {
return dataset[0].value;
})
.attr('id', "Value")
.attr('transform', "translate(" + trX + ", " + trY + ")")
.attr("font-size", 18)
.style("fill", '#000000');
}
texts.append("text")
.text(function() {
return 0;
})
.attr('id', 'scale0')
.attr('transform', "translate(" + ((width + margin.left)/100) + ", " + ((height + margin.top)/2) + ")")
.attr("font-size", 15)
.style("fill", "#000000");
texts.append("text")
.text(function() {
return gaugeMaxValue/2;
})
.attr('id', 'scale10')
.attr('transform', "translate(" + ((width + margin.left)/2.15) + ", " + ((height + margin.top)/30) + ")")
.attr("font-size", 15)
.style("fill", "#000000");
texts.append("text")
.text(function() {
return gaugeMaxValue;
})
.attr('id', 'scale20')
.attr('transform', "translate(" + ((width + margin.left)/1.03) + ", " + ((height + margin.top)/2) + ")")
.attr("font-size", 15)
.style("fill", "#000000");
var Needle = (function() {
//Helper function that returns the `d` value for moving the needle
var recalcPointerPos = function(perc) {
var centerX, centerY, leftX, leftY, rightX, rightY, thetaRad, topX, topY;
thetaRad = percToRad(perc/2);
centerX = 0;
centerY = 0;
topX = centerX - this.len * Math.cos(thetaRad);
topY = centerY - this.len * Math.sin(thetaRad);
leftX = centerX - this.radius * Math.cos(thetaRad - Math.PI/2);
leftY = centerY - this.radius * Math.sin(thetaRad - Math.PI/2);
rightX = centerX - this.radius * Math.cos(thetaRad + Math.PI/2);
rightY = centerY - this.radius * Math.sin(thetaRad + Math.PI/2);
return "M " + leftX + " " + leftY + " L " + topX + " " + topY + " L " + rightX + " " + rightY;
};
function Needle(el) {
this.el = el;
this.len = width/2.5;
this.radius = this.len/8;
}
Needle.prototype.render = function() {
this.el.append('circle').attr('class', 'needle-center').attr('cx', 0).attr('cy', 0).attr('r', this.radius);
return this.el.append('path').attr('class', 'needle').attr('id', 'client-needle').attr('d', recalcPointerPos.call(this, 0));
};
Needle.prototype.moveTo = function(perc) {
var self,
oldValue = this.perc || 0;
this.perc = perc;
self = this;
// Reset pointer position
this.el.transition().delay(100).ease('quad').duration(200).select('.needle').tween('reset-progress', function() {
return function(percentOfPercent) {
var progress = (1 - percentOfPercent) * oldValue;
repaintGauge(progress);
return d3.select(this).attr('d', recalcPointerPos.call(self, progress));
};
});
this.el.transition().delay(300).ease('bounce').duration(1500).select('.needle').tween('progress', function() {
return function(percentOfPercent) {
var progress = percentOfPercent * perc;
repaintGauge(progress);
return d3.select(this).attr('d', recalcPointerPos.call(self, progress));
};
});
};
return Needle;
})();
needle = new Needle(chart);
needle.render();
needle.moveTo(percent);
setTimeout(displayValue, 1350);
}
Jede Hilfe/Beratung sehr geschätzt wird,
Dank
Ich verstehe nicht, wie/warum Sie aufrufen. Exit(). Remove(); in der gleichen Funktion wie für die Eingabe der Daten? – since095