d3.jslegendlinear-gradientscontinuous

How to create vertical continuous legend without rotating the legend


I have created the horizontal continous legend using linear gradient. But my legend can be either horizonatl or vertical based on the flag. How can i make same legend vertical but i do not want to rotate it as it takes too much space.

const svgLegend = select(divRef.current).append("svg")
const defs = svgLegend.append("defs")
const linearGradient = defs
.append("linearGradient")
.attr("id", "linear-gradient")
.attr("x1", "0%")
.attr("x2", "100%") //since it's a horizontal linear gradient
.attr("y2", "0%");

// other code to add color

svgLegend
.append("rect")
.attr("x", 25)
.attr("y", 30)
.attr("width", 250)
.attr("height", 25)
.style("fill", "url(#linear-gradient)");

const xLeg = scaleLinear().domain([min, max]).range([10, 258]);
const axisLeg = axisBottom(xLeg).tickValues(colorScale.domain());
svgLegend
.attr("class", "axis")
.append("g")
.attr("transform", "translate(15, 55)")
.style("font-size", "10px")
.style("font-weight", "700")
.call(axisLeg);

Fiddle link : https://jsfiddle.net/r1t60ges/3/

Desired Output : enter image description here


Solution

  • <div id="container">
      <svg class="axis" style="background-color: rgba(255, 255, 255, 0.8); border-radius: 5px;">
        <defs>
            <linearGradient id="linear-gradient" x1="0%" x2="0%" y1="0%" y2="100%">
                <stop offset="0%" stop-color="#ff0000"></stop>
                <stop offset="25%" stop-color="#ffff00"></stop><stop offset="50%" stop-color="#00ff00"></stop>
                <stop offset="75%" stop-color="#00ffff"></stop><stop offset="100%" stop-color="#0000ff"></stop>
            </linearGradient></defs>
            <text class="legendTitle" x="25" y="10">Legend</text>
            <rect x="25" y="20" width="25" height="150" style="fill: url(&quot;#linear-gradient&quot;);"></rect>
              <g transform="translate(15, 55)" fill="none" font-size="10" font-family="sans-serif" text-anchor="middle" style="font-size: 10px; font-weight: 700;">
    </svg>
    </div>