【发布时间】:2021-02-08 19:29:02
【问题描述】:
我有一个具有动态条形着色的条形图。我想确保每次初始化条形图时每个值都保持相同的颜色。
对于我正在使用的颜色缩放:
const color = d3.scaleOrdinal()
.domain(arr.map(d => d.key))
.range(d3.schemeSet2);
let bars = plot.selectAll("rect")
.data(arr)
bars.enter()
.append('rect')
.merge(bars)
.attr("x", d => xScale(d.key))
.attr('y', d => yScale(d.value))
.attr("width", xScale.bandwidth())
.attr('height', d => height - (margin.top + margin.bottom) - yScale(d.value))
.style("fill", d => color(d.key))
我的数据如下:
let arr = [{key: "Software Engineering", value: 68,
{key: "Biomedical Engineering", value: 63},
{key: "Mechanical Engineering", value: 52},
{key: "Other Engineering", value: 46}]
数据被动态地附加到这个数组中。如果数据以相同的顺序附加,则条形的颜色在此项目的不同组件中保持相同。但是,如果附加的数据不同,条形的颜色会发生变化。例如:
let arr = [{key: "Software Engineering", value: 68,
{key: "Mechanical Engineering", value: 52},
{key: "Biomedical Engineering", value: 63},
{key: "Other Engineering", value: 46}]
我无法将颜色硬编码为“软件工程”等,因为值可能会改变。但是,我希望“软件工程”具有相同的颜色,与它何时添加到数组无关。
另一个颜色变化的例子是如果从数组中删除一个值,一个例子是:
let arr = [{key: "Software Engineering", value: 68,
{key: "Mechanical Engineering", value: 52},
{key: "Other Engineering", value: 46}]
有什么建议吗?
【问题讨论】:
-
会根据键属性对数组进行排序有帮助吗?当然,您仍然可以通过当前元素之间的键来获取新元素,但至少您随时可以更确定顺序。例如,“Biomedical Engineering”将始终出现在“Mechanical Engineering”之前(如果您要按字母顺序排序)。
-
@Erik 这样做有问题,一个出现在另一个之前。如果列表更短,在一种情况下,最后一个元素将与之前的初始化不同。
标签: javascript d3.js