[英]creating a legend with d3.js
我覺得我在這里效率低下。 我試圖從一個數組創建一個圖例,似乎我寫太多了。 有人可以告訴我是否可以優化?
http://jsbin.com/foqesivice/edit?js,控制台,輸出
var data = [
{name: "AnotherLong"},
{name: "BigData"},
{name: "What"},
{name: "Something"},
{name: "Smalls"}
];
var margin = {top: 10, right: 10, bottom: 10, left: 10};
var color = d3.scale.category20c();
var svg = d3.select("body").append("svg")
.attr("width", 400 - margin.left - margin.right)
.attr("height", 1000 - margin.top - margin.bottom)
var g = svg.selectAll(".row")
.data(data)
.enter().append("svg:g")
var rectangles = g.selectAll(".cell")
.data(data)
.enter().append("svg:rect")
.attr("width", 19)
.attr("height", 19)
.attr("transform", function(d, i) { return "translate(0," + i * 20 + ")"; })
.style("fill", function(d, i){return color(i);})
var text = g.selectAll(".text")
.data(data)
.enter().append("svg:text")
.attr("x", 24)
.attr("y", 9)
.attr("dy", ".35em")
.attr("transform", function(d, i) { return "translate(0," + i * 20 + ")"; })
.text(function(d){return d.name;})
編輯:
另一件事困擾着我。 出於某種原因,看來我的樣式全部為粗體。 我還沒有定義任何樣式。 那是默認行為嗎?
首先,將所有測量值和值移至文件頂部並引用它們(這只會使內容更具可讀性)
var legend_row_height = 50;
您無需創建g
元素。 只需使用x,y
屬性而不是平移放置矩形和文本即可:
.attr("y", function(d,i){return legend_row_height * i;})
並將樣式移入CSS。 這可以通過在對象上設置類來輕松實現:
.classed("squares", 1)
然后添加CSS:
.squares {
stroke: white;
}
@MatthewWilcoxson的答案很好,但是這里有一個更特定於d3
的重寫。 本質上,不要重復綁定數據,保留g
,在其上綁定,定位並在其中添加rect
和text
:
<!DOCTYPE html> <html> <head> <script data-require="d3@4.0.0" data-semver="3.5.3" src="//cdnjs.cloudflare.com/ajax/libs/d3/3.5.3/d3.js"></script> </head> <body> <script> var data = [{ name: "AnotherLong" }, { name: "BigData" }, { name: "What" }, { name: "Something" }, { name: "Smalls" }]; var margin = { top: 10, right: 10, bottom: 10, left: 10 }; var color = d3.scale.category20c(), cellDim = 19; var svg = d3.select("body").append("svg") .attr("width", 400 - margin.left - margin.right) .attr("height", 1000 - margin.top - margin.bottom); var g = svg.selectAll(".row") .data(data) .enter().append("svg:g") .attr("transform", function(d, i) { return "translate(" + (0) + "," + ((cellDim + 1) * i) + ")" }); g.append("svg:rect") .attr("width", cellDim) .attr("height", cellDim) .style("fill", function(d, i) { return color(i); }); g.append("text") .attr("dy", "1em") .attr("dx", cellDim + 2) .text(function(d) { return d.name; }); </script> </body> </html>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.