javascript - 如何正确地将颜色渐变应用于圆弧?

标签 javascript css d3.js svg

我正在构建一个看起来像这样的视觉效果:enter image description here .

到目前为止,我已经设法创建了这个:enter image description here

我的想法是将一个值映射到一个 Angular ,以便我知道将箭头指向何处,然后我将箭头着色为与其指向的圆弧上的点相同的颜色。

我基本上有两个问题:

首先,我该怎么做才能使颜色排列得更好。我使用了这样的线性渐变:

 let defs = this.gaugeEl
                .append("defs")
                .classed("definitions",true);
        let gradient = defs
            .append("linearGradient")
            .classed("linearGradient",true);

        gradient
            .attr({
                id: 'gradient',
                x1: '0%',
                y1: '0%',
                x2: '100%',
                y2: '100%',
                spreadMethod: "pad"
            });

        gradient
            .append("stop")
            .classed('start',true)
            .attr({
                offset: '0%',
                'stop-color': 'lawngreen',
                'stop-opacity': 1
            });

        gradient.append("stop")
            .classed('end',true)
            .attr({
                offset: '100%',
                'stop-color': 'red',
                'stop-opacity': 1
            });

效果不是我想要的,怎么办?

下一个关于渐变如何工作的问题,我需要能够将 Angular 与颜色相关联,以便我可以正确地为箭头和刻度线着色,但在我当前的设置中我不知道该怎么做.有可能吗?

最佳答案

我不知道这对您有多大用处。但是我遵循了下面的实现

  1. 将圆弧分割成小圆弧
  2. 使用 scaleLinear 关联颜色和 Angular ,并将圆弧分成四段

忽略糟糕的数学和代码!

<!DOCTYPE html>
<meta charset="utf-8">
<style>
  
  #chart {
    width: 960px;
    height: 350px;
  }

</style>

<body>

  <svg id="chart">  
  </svg>



  <script src="http://d3js.org/d3.v5.min.js"></script>

  <script>
var vis = d3.select("#chart").append("g")
var pi = Math.PI;

var line = d3.line()
    .x(function (d) { return d.x; })
    .y(function (d) { return d.y; });

var lines = []



var breakPoints = 100;
var angleArr = [];
var arcArr = [];

//angleArr[0] = -pi/2; 

var colorScale = d3.scaleLinear()
    .domain([-pi/2, -pi/3,30*pi/180,pi/2])
    .range(['lightgreen', 'lightgreen', 'yellow','red']);
    
	
var angleScale = d3.scaleLinear()
    .range([-pi/2,pi/2])
    .domain([0,breakPoints - 1]);	
	

var prevAngle = -pi/2;	
for(var i = 0; i < breakPoints; i++) {
	angleArr[i] = angleScale(i);
	var singleArrow = [{"x":(150*Math.sin(angleArr[i])), "y":-(150*Math.cos(angleArr[i]))},{ "y":-(170*Math.cos(angleArr[i])), "x":(170*Math.sin(angleArr[i]))}];
	//var subArc = {"start": prev, "end":0};
	var subArc = {};
	lines.push(singleArrow);
	subArc["start"] = prevAngle;
	subArc["end"] = angleArr[i];
	prevAngle = angleArr[i];
	arcArr.push(subArc);
}

	
var arc = d3.arc()
    .innerRadius(160)
    .outerRadius(170)
    .startAngle(-(pi/2)) //converting from degs to radians
    .endAngle(pi/2) //just radians
    
vis.attr("width", "400").attr("height", "400") // Added height and width so arc is visible
    .append("g")
    .attr("transform", "translate(200,200)");

vis.selectAll("line")
   .data(lines)
   .enter()
   .append("path").attr("class","arrow").attr("d", line).attr("stroke",function(d,i) { 
	return colorScale(angleArr[i])}).attr("transform", "translate(200,200)");	

vis.selectAll("arcs")
   .data(arcArr)
   .enter()
   .append("path").attr("class","arc").attr("d", function(d,i) {
   return d3.arc()
    .innerRadius(160)
    .outerRadius(170)
    .startAngle(d.end)
    .endAngle(d.start)()}).attr("fill",function(d,i) { 
	return colorScale(angleArr[i])}).attr("transform", "translate(200,200)");	
	  
  </script>

</body>

关于javascript - 如何正确地将颜色渐变应用于圆弧?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52722200/

相关文章:

javascript - 替换旧内容 d3

javascript - 如何在 JavaScript 中将字符串的某些部分标记为代码

javascript - 使用 window.print() 打印边框

javascript - 无法从具有树布局的力图中调用force.tick()

javascript - 用于单个页面上单个音频元素的 jQuery 预加载器

css - 手写笔迭代字符串

javascript - 无法使用 d3 创建曼哈顿图

javascript - 带有回调和简化错误处理的 Coffeescript

javascript - 为什么不在 Node js csrf 中创建 token ?

html - 突出显示选项标签内的部分文本