Ich möchte ein Kreisdiagramm für jeden Punkt auf der Karte anstelle eines Kreises zeichnen. Die Karte und die Punkte werden gut angezeigt, aber das Kreisdiagramm wird nicht über die Kartenpunkte angezeigt. Es gibt auch keinen Fehler. Ich kann den hinzugefügten Kreisdiagrammcode auch innerhalb der Karte sehen.Kreisdiagramm über einen Kartenpunkt mit d3.js
Unten ist das Code-Snippet.
var w = 600;
var h = 600;
var bounds = [[78,30], [87, 8]]; // rough extents of India
var proj = d3.geo.mercator()
.scale(800)
.translate([w/2,h/2])
.rotate([(bounds[0][0] + bounds[1][0])/-2,
(bounds[0][1] + bounds[1][1])/-2]); // rotate the project to bring India into view.
var path = d3.geo.path().projection(proj);
var map = d3.select("#chart").append("svg:svg")
.attr("width", w)
.attr("height", h);
var india = map.append("svg:g")
.attr("id", "india");
var gDataPoints = map.append("g"); // appended second
d3.json("data/states.json", function(json) {
india.selectAll("path")
.data(json.features)
.enter().append("path")
.attr("d", path);
});
d3.csv("data/water.csv", function(csv) {
console.log(JSON.stringify(csv))
gDataPoints.selectAll("circle")
.data(csv)
.enter()
.append("circle")
.attr("id", function (d,i) {
return "chart"+i;
})
.attr("cx", function (d) {
return proj([d.lon, d.lat])[0];
})
.attr("cy", function (d) {
return proj([d.lon, d.lat])[1];
})
.attr("r", function (d) {
return 3;
})
.each(function (d,i) {
barchart("chart"+i);
})
.style("fill", "red")
//.style("opacity", 1);
});
function barchart(id){
var data=[15,30,35,20];
var radius=30;
var color=d3.scale.category10()
var svg1=d3.select("#"+id)
.append("svg").attr('width',100).attr('height',100);
var group=svg1.append('g').attr("transform","translate(" + radius + "," + radius + ")");
var arc=d3.svg.arc()
.innerRadius('0')
.outerRadius(radius);
var pie=d3.layout.pie()
.value(function(d){
return d;
});
var arcs=group.selectAll(".arc")
.data(pie(data))
.enter()
.append('g')
.attr('class','arc')
arcs.append('path')
.attr('d',arc)
.attr("fill",function(d,i){
return color(d.data);
//return colors[i]
});
}
water.csv:
lon,lat,quality,complaints
80.06,20.07,4,17
72.822,18.968,2,62
77.216,28.613,5,49
92.79,87.208,4,3
87.208,21.813,1,12
77.589,12.987,2,54
16.320,75.724,4,7
Auch können Sie einige Probleme mit den CSV-Werten haben: '16.320,75.724' ist nicht in Indien, wenn das ein Längengrad-Breiten-Paar ist. Es gibt auch: '92.79, 87.208' –
Und weil es Spaß gemacht hat, Kreisdiagramme auf Karten in d3 zu betrachten, habe ich einen sehr kurzen Blick auf eine mögliche Implementierung der Verwendung von Klickereignissen geworfen, um das Kreisdiagramm an einem Datenpunkt zu zeigen. Es wird sicherlich bessere Implementierungen geben, aber hier ist eine: https://bl.ocks.org/Andrew-Reid/6efd12c6bcfe9a044750e81dbc3497f4 –