简体   繁体   中英

Styling a Legend in D3

I obviously having a hard time understanding something fundamental about wrapping g elements in D3 for a legend I am trying to render here . Does anyone why or how I can get this legend to display in a horizontal line like this legend does at the top?

Consider:

var wrap = svg.selectAll('.legend').append('g').data(color.domain());
        var gEnter = wrap.enter().append('g').attr('class', 'legend')
            .append('g');
        var legend = wrap.select('g').style("width",1000)
            .attr("transform", function(d, i) { return "translate(" + i * 20 + ",0)"; });

        // draw legend colored circles
        legend.append("circle")
            .style("fill", color)
            .style('stroke', color)
            .attr('r', 5);

        // // draw legend text
        legend.append("text")
            .attr("x", width - 24)
            .attr("y", 9)
            .attr("dy", ".35em")
            .style("text-anchor", "end")
            .text(function(d) { return d;});

Thanks in advance.

You need to utilize transform and translate (transformation method) in order to get that effect. Also, another note, the circle and text for the legend really wont have any connection. In order to get that effect you must position them with the correct corresponding math. In my solution I am only using static numbers, but you will get the gist. In order to make it dynamic you will have to create some type of function that will dynamically calculate the positions.

Heres what I changed in order to get wanted behavior:

var legend = wrap.select('g').style("width",1000)
            .attr("transform", function(d, i) { return "translate(" + i * 80 + ",0)"; });

        // draw legend colored circles
        legend.append("circle")
            .style("fill", color)
            .style('stroke', color)
            .attr('r', 5)
            .attr('transform', 'translate(550,20)');

        // // draw legend text
        legend.append("text")
            .attr("dy", ".35em")
            .attr('transform', 'translate(560,20)')
            .text(function(d) { return d;})

and here is the fiddle: https://jsfiddle.net/yt2zhx63/

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM