如何创建水平图例? [英] How to create a horizontal legend?
问题描述
在D3.js中如何创建一个包含2行的水平图例?
In D3.js how can I create a horizontal legend with 2 rows?
这是创建图例的当前JavaScript代码:
This is current JavaScript code that creates a legend:
var legendGroup = svg.append("g")
.attr("transform", "translate("+(width-50)+",30)");
var legend = legendGroup.selectAll(".legend")
.data(nations.map(d=>d.name))
.enter()
.append("g")
.attr("transform", (d,i)=>"translate(0," + 20*i + ")")
var legendRects = legend.append("rect")
.attr("width", 10)
.attr("height", 10)
.attr("fill", d=> colorScale(d));
var legendText = legend.append("text")
.attr("x", 14)
.attr("y", 8)
.text(d=>d);
推荐答案
您发布的代码是一栏,如您所述,因为它将图例的每个部分翻译为最后一个20像素:translate(0,+ 20 * i +)
。通过操作translate语句,如果知道数组中有多少元素,就可以创建一个2行图例,但即使不知道,也可以指定每行中有多少元素。
The code you posted is a column, as you stated, because it translates each piece of the legend 20 pixels below the last: "translate(0," + 20*i + ")"
. By manipulating the translate statement you can create a 2 row legend if you know how many elements are in your array, though even if you don't, you can specify how many elements can be in each row.
在下面的代码块中, n
指的是一行中应该有多少项, itemWidth
每个图例条目宽度的像素值, itemHeight
高度。
In the following code block, n
refers to how many items should be in a row, itemWidth
a pixel value for the width of each legend entry, and itemHeight
the height.
我不知道你知道你有多少个传奇项目,但你可以这样设置:
I don't know how many legend items you have, but you could set it up as such:
.attr("transform", function(d,i) { return
"translate(" + i%n * itemWidth +
"," +
Math.floor(i/n) * itemHeight + ")"; })
这应该是这样的:
var data = ["Cat A","Cat B","Cat C", "Cat D", "Dog A", "Dog B", "Dog C", "Dog D"];
var n = data.length/2;
var itemWidth =80;
var itemHeight = 18;
var svg = d3.select("svg");
var color = d3.scale.category10();
var legend = svg.selectAll(".legend")
.data(data)
.enter()
.append("g")
.attr("transform", function(d,i) { return "translate(" + i%n * itemWidth + "," + Math.floor(i/n) * itemHeight + ")"; })
.attr("class","legend");
var rects = legend.append('rect')
.attr("width",15)
.attr("height",15)
.attr("fill", function(d,i) { return color(i); });
var text = legend.append('text')
.attr("x", 15)
.attr("y",12)
.text(function(d) { return d; });
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
<svg width="500" height="100"></svg>
编辑:
这是一个移动整个片段的片段根据以下评论,横向图例(使用四行向右侧更好地显示右侧的移动):
Here's a snippet moving the entire horizontal legend (using four rows to show the movement better to the right side better in this narrow view) based on the comment below:
var data = ["Cat A","Cat B","Cat C", "Cat D", "Dog A", "Dog B", "Dog C", "Dog D"];
var n = data.length/4;
var itemWidth =80;
var itemHeight = 18;
var width = 500;
var svg = d3.select("svg");
var color = d3.scale.category10();
var legendGroup = svg.append("g")
.attr("transform", "translate("+(width-150)+",10)");
var legend = legendGroup.selectAll(".legend")
.data(data)
.enter()
.append("g")
.attr("transform", function(d,i) { return "translate(" + i%n * itemWidth + "," + Math.floor(i/n) * itemHeight + ")"; })
.attr("class","legend");
var rects = legend.append('rect')
.attr("width",15)
.attr("height",15)
.attr("fill", function(d,i) { return color(i); });
var text = legend.append('text')
.attr("x", 15)
.attr("y",12)
.text(function(d) { return d; });
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
<svg width="500" height="200"> </svg>
这篇关于如何创建水平图例?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!