Javascript D3.js v5-根据数组长度在圆周围附加线
我想制作一个显示顺序数据(评级)的视频。共有12个等级维度,每个等级都有自己的专用线附加到一个圆上。线的极性方向表示类别(即指向1点钟=类别1、2点钟=类别2的线,以此类推)。线的长度表示额定值(短=差,长=好)。结果应该类似于雪花或太阳爆发 名称存储在字符串中。每个公司的评级存储在一个数组中。以下是我的Javascript D3.js v5-根据数组长度在圆周围附加线,javascript,d3.js,Javascript,D3.js,我想制作一个显示顺序数据(评级)的视频。共有12个等级维度,每个等级都有自己的专用线附加到一个圆上。线的极性方向表示类别(即指向1点钟=类别1、2点钟=类别2的线,以此类推)。线的长度表示额定值(短=差,长=好)。结果应该类似于雪花或太阳爆发 名称存储在字符串中。每个公司的评级存储在一个数组中。以下是我的数据变量的两部分: {'fmc':'fmc1', 'ratings':[10,10,10,10,10,10,10,10,10,10,10,10]}, {'fmc':'fmc2', 'ra
数据变量的两部分:
{'fmc':'fmc1', 'ratings':[10,10,10,10,10,10,10,10,10,10,10,10]},
{'fmc':'fmc2', 'ratings':[8,10,10,5,10,10,10,10,10,7,10,5]},
我有公司运作的网格系统布局,但我在圆圈周围对齐线条的方式似乎有问题。相关代码:
var rotationDegree = d3.scalePoint().domain([0,12]).range([0, 2*Math.PI - Math.PI/6]);
fmcG.append('line')
.data([10,10,10,10,10,10,10,10,10,10,10,10])
.attr("x1", r)
.attr("y1", r)
.attr("x2", function(d,i) { return length(10) * Math.cos(rotationDegree(i) - Math.PI/2) + (width/2); })
.attr("y2", function(d,i) { return length(10) * Math.sin(rotationDegree(i) - Math.PI/2) + (height/2); })
.style("stroke", function(d) { return "#003366" });
看起来我已经正确地绘制了三角图,但在实现中我被证明是错误的:这些线并没有像雪花/太阳爆发/时钟那样附加在圆的周围
片段:
var-margins={top:20,bottom:300,left:30,right:100};
var高度=600;
var宽度=900;
var totalWidth=宽度+边距。左+边距。右;
var totalHeight=高度+边距。顶部+边距。底部;
var svg=d3.select('body')
.append('svg')
.attr('width',totalWidth)
.attr(“高度”,总高度);
var graphGroup=svg.append('g')
.attr('transform','translate(“+margins.left+”,“+margins.top+”);
风险值数据=[
//{'fmc':'fmc1','ratings':[{'r1':10,'r2':10,'r3':10,'r4':10,'r5':10}]}
{'fmc':'fmc1','ratings':[10,10,10,10,10,10,10,10,10]},
{'fmc':'fmc2','ratings':[8,10,10,5,10,10,10,10,10,7,10,5]},
{'fmc':'fmc3','ratings':[10,10,10,10,10,10,10,10,10]},
];
var r=30;
var length=d3.scaleLinear().domain([0,10]).range([0,50]);
var rotationDegree=d3.scalePoint().domain([0,12]).range([0,2*Math.PI-Math.PI/6]);
var列=5;
var间距=220;
var-vSpacing=250;
var fmcG=graphGroup.selectAll(“.fmc”)
.数据(数据)
.输入()
.append('g')
.attr('class','fmc')
.attr('id',(d,i)=>'fmc'+i)
.attr('transform',(d,k)=>{
var horSpace=(k%列)*间距;
var vertSpace=~(k/列))*vSpacing;
返回“translate”(“+horSpace+”,“+vertSpace+”);
});
快速消费品。附加('圆圈')
.attr('cx',100)
.attr('cy',100)
.attr('r',r)
.style('fill','none')
.style('stroke','003366');
fmcG.append('text')
.attr('x',100)
.attr('y',105)
.style('text-anchor','middle')
.text(函数(d){return d.fmc});
快速消费品追加('行')
//.data(函数(d){return d.ratings})为什么不工作??????
.数据([10,10,10,10,10,10,10,10,10,10,10,10,10])
.attr(“x1”,r)
.attr(“y1”,r)
.attr(“x2”,函数(d,i){返回长度(10)*Math.cos(旋转度(i)-Math.PI/2)+(宽度/2);})
.attr(“y2”,函数(d,i){返回长度(10)*Math.sin(旋转度(i)-Math.PI/2)+(高度/2);})
.style(“笔划”,函数(d){return#003366})代码>
主要问题是,现在,您正在追加一行。要添加尽可能多的行作为数据点,必须设置正确的enter选择:
fmcG.selectAll(null)
.data(function(d) {
return d.ratings
})
.enter()
.append('line')
//etc...
顺便说一句,这就是你的数据
不起作用的原因(正如你在评论“为什么它不起作用?”)
其他问题:
点刻度需要有一个离散域,例如d3.range(12)
不管出于什么原因,你都要把圆圈左右移动100像素。我移动了同样数量的线
以下是包含这些更改的代码段:
var页边距={
前20名,
底数:300,
左:30,,
右:100
};
var高度=600;
var宽度=900;
var totalWidth=宽度+边距.left+边距.right;
var totalHeight=高度+页边距.top+页边距.bottom;
var svg=d3.select('body')
.append('svg')
.attr('width',totalWidth)
.attr(“高度”,总高度);
var graphGroup=svg.append('g')
.attr('transform','translate(“+margins.left+”,“+margins.top+”);
风险值数据=[
//{'fmc':'fmc1','ratings':[{'r1':10,'r2':10,'r3':10,'r4':10,'r5':10}]}
{
‘fmc’:‘fmc1’,
“评级”:[10,10,10,10,10,10,10,10,10,10,10,10,10,10]
},
{
‘fmc’:‘fmc2’,
‘评级’:[8,10,10,5,10,10,10,10,10,10,7,10,5]
},
{
‘fmc’:‘fmc3’,
“评级”:[10,10,10,10,10,10,10,10,10,10,10,10,10,10]
},
];
var r=30;
var length=d3.scaleLinear().domain([0,10]).range([0,50]);
var rotationDegree=d3.scalePoint().domain(d3.range(12)).range([0,2*Math.PI]);
var列=5;
var间距=220;
var-vSpacing=250;
var fmcG=graphGroup.selectAll(“.fmc”)
.数据(数据)
.输入()
.append('g')
.attr('class','fmc')
.attr('id',(d,i)=>'fmc'+i)
.attr('transform',(d,k)=>{
var horSpace=(k%列)*间距;
var vertSpace=~(k/列))*vSpacing;
返回“translate”(“+horSpace+”,“+vertSpace+”);
});
快速消费品。附加('圆圈')
.attr('cx',100)
.attr('cy',100)
.attr('r',r)
.style('填充','无')
.style('stroke','003366');
fmcG.append('text')
.attr('x',100)
.attr('y',105)
.style('text-anchor','middle')
.文本(功能(d){
返回d.fmc
});
快速消费品。全选(空)
.数据(功能(d){
返回d级
})
.输入()
.append('行')
.attr(“x1”,100)
.attr(“y1”,100)
.attr(“x2”,函数(d,i){
返回100+长度(d)*数学cos(旋转度(i));
})
.attr(“y2”,函数(d,i){
返回100+长度(d)*数学sin(旋转度(i));
})
.样式(“笔划”,功能(d){
返回“#003366”
});代码>
主要问题是,现在,您正在追加一行。要添加尽可能多的行作为数据点,必须设置正确的enter选择:
fmcG.selectAll(null)
.data(function(d) {
return d.ratings
})
.enter()
.append('line')
//etc...
顺便说一句,这就是你的数据
不起作用的原因(正如你在评论“为什么它不起作用?”)
其他问题:
点刻度需要有一个离散域,例如d3.range(12)
无论什么原因,你都在移动圆圈