从Sankey Diagram中的Legend中排除实体

时间:2016-11-03 17:27:35

标签: javascript angularjs d3.js

我有一个带有开始和结束节点的Sankey图表。 当我使用下面的功能创建图例时。

我想从图例中筛选出特定节点(第一个和第一个节点)。

节点名称总是相同,但随着节点数量的动态变化,它们的索引会有所不同。

这可能,还是非常复杂?

我可以将过滤器或排除功能应用于



svg.selectAll('.legendOrdinal .cell')
                    .attr('transform', function(d,i) {
                        // make 2 column legend
                        var row = Math.floor(i / items_in_row) * element[0].offsetWidth/2;
                        return 'translate(' + row +',' + (i % items_in_row) * 21 + ')';
                    })






           function render_legend(nodes) {
                var items_in_row = Math.ceil(nodes.length/2);

                d3.select(element[0]).select('#legend').remove();
                var svg = d3.select(element[0])
                    .append("svg")
                        .attr('width', '100%')
                        .attr('height', ((items_in_row+1) * 25) + 'px')
                        .attr('id', 'legend');

                var ordinal = d3.scale.ordinal()
                    .domain(nodes.map(function(d) {
                        return d.name;
                    }))
                    .range(color.range());

                // append legend text
                if (nodes.length != 0) {
                svg.append('text')
                    .attr('x', 15)
                    .attr('y', 15)
                    .text('Enabling infrastructure investments:');
                };

                svg.append("g")
                    .attr("class", "legendOrdinal")
                    .attr("transform", "translate(20, 40)");

                var legendOrdinal = d3.legend.color()
                    .shape("path", d3.svg.symbol().type("circle").size(200)())
                    .shapePadding(5)
                    .scale(ordinal);

                svg.select(".legendOrdinal")
                    .call(legendOrdinal);

                svg.selectAll('.legendOrdinal .cell')
                    .attr('transform', function(d,i) {
                        // make 2 column legend
                        var row = Math.floor(i / items_in_row) * element[0].offsetWidth/2;
                        return 'translate(' + row +',' + (i % items_in_row) * 21 + ')';
                    })
            };

 




1 个答案:

答案 0 :(得分:1)

您可以对domain来电进行过滤吗?

.domain(nodes.filter(function(d, i) {return i > 0 && i < N - 1; /*or anything else */})
             .map(function(d) {
                    return d.name;
                }))