【发布时间】:2021-01-09 03:17:55
【问题描述】:
我的目标是创建一个展示数据驱动图例和单选按钮的网页。我希望用户选择单选按钮来更改图例。
复杂的因素是图例依赖于嵌套函数,我不知道如何使嵌套函数的“键”响应单选按钮。
以下是我目前采取的步骤:
- 创建图例(嵌套数据,然后将嵌套键附加到矩形)。
- 单击单选按钮,使 d3 选择 DOM 中的所有矩形。
- 将单选按钮的选择发送到名为
updateKey的函数,其中包含嵌套变量。用单选按钮选择替换嵌套的d.key部分。 - 将矩形的填充属性改为
color(d.key)。
我的问题是,嵌套变量在 updateKey 函数中似乎没有变化,尽管我对全局变量的研究表明它 should 发生了变化。
代码在这里:
var doc = URL.createObjectURL(new Blob([`Passed Category Owner Dup
yes msg Hailey yes
yes msg Hailey yes
yes doc Hailey yes
yes doc Robert yes
yes msg Laquila yes
no spreadsheet Hailey yes
`]));
d3.tsv(doc)
.row(function(d) {
return {
Passed: d.Passed,
Category: d.Category,
Owner: d.Owner,
Dup: d.Dup
};
})
.get(function(error, data) {
var svg = d3.select("#chart").append("svg")
.append("g");
//create a function for applying colours
var cat20 = d3.schemeCategory20
var colors = d3.scaleOrdinal()
.domain(function(d) {
return nest(d.key);
})
.range(cat20);
//pick one column of data and nest according to that column
nest = d3.nest()
.key(function(d) {
return d.Category
})
.sortKeys(d3.descending)
.entries(data)
var legend = d3.select("#legend")
//Make the legend
.append("svg")
.attr("class", "legend")
.selectAll("g")
.data(d3.range(20))
.enter()
.append("g")
.attr("transform", function(d, i) {
return "translate(0," + i * 25 + ")";
});
//make the legend squares
legend.append("rect")
.data(nest)
.attr("class", "rect")
.attr("width", 18)
.attr("height", 18)
.style("fill", function(d) {
return colors(d.key)
})
.style('stroke', "Grey");
//make the legend text
legend.append("text")
.data(nest)
.attr("x", 24)
.attr("y", 9)
.attr("dy", ".35em")
.text(function(d) {
return d.key;
});
function updateKey(h) {
var nest = d3.nest()
.key(function(d) {
return (h)
})
.sortKeys(d3.descending)
.entries(data)
}
d3.selectAll(("input[name='stack']")).on("change", function(d) {
var colVar = this.value;
if (colVar == 'Category') {
d3.selectAll(".rect").style("fill", function(d) {
updateKey("d['" + colVar + "']")
return colors(d.key)
})
}
})
})
更新:我已经确认该函数正在检索一个新的嵌套变量,因为当我在最后一段代码中输入console.log(nest) 时,它返回了正确的键值对象。但是,如果我在console.log(nest) 的正下方添加console log(d.key),它会返回在代码开头设置的嵌套变量的键。这表明d.key 在某种程度上没有改变,即使嵌套在改变。我想我需要明确设置 d.key。
更新 2:我的新策略是创建所有图例,然后使用按钮根据类别显示/消失图例。
【问题讨论】:
-
您可以添加一个活动类并使用 css 更改颜色吗? .active.legend .rect{fill:pink}
-
不确定。我还需要更改文本,我认为 css 不会这样做。
-
创建工作代码片段。
标签: javascript html d3.js