D3.js v5-从数组长度开始绕一个圆附加线

如何解决D3.js v5-从数组长度开始绕一个圆附加线

我想制作一个显示序数数据(等级)的图像。有12个等级维度,每个等级都有自己的专用线附加到圆圈上。线的极性方向指定类别(即,指向1点= 1类,2点= 2类,依此类推)。线的长度表示额定值(短=差,长=良好)。结果应该类似于雪花或太阳爆发。

名称存储在字符串中。每个公司的评级存储在一个数组中。这是我的opencv变量的两部分:

data

我有运作公司的网格系统位置,但是我对齐圆圈的线的方式似乎存在问题。相关代码:

  {'fmc':'fmc1','ratings':[10,10,10]},{'fmc':'fmc2','ratings':[8,5,7,5]},

看来我已经正确地设置了触发,但是在实现过程中我被证明是错误的:围绕雪花的线条没有像雪花/太阳爆发/时钟那样被附加在圆圈上。

摘要:

var rotationDegree = d3.scalePoint().domain([0,12]).range([0,2*Math.PI - Math.PI/6]);

fmcG.append('line')
    .data([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",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 height = 600;
var width = 900;

var totalWidth = width+margins.left+margins.right;
var totalHeight = height+margins.top+margins.bottom;

var svg = d3.select('body')
.append('svg')
.attr('width',totalWidth)
.attr('height',totalHeight);

var graphGroup = svg.append('g')
.attr('transform',"translate("+margins.left+","+margins.top+")");

var data = [
  //{'fmc':'fmc1','ratings':[{'r1':10,'r2':10,'r3':10,'r4':10,'r5':10}]}
  {'fmc':'fmc1',{'fmc':'fmc3',];

var r = 30;
var length = d3.scaleLinear().domain([0,10]).range([0,50]);
var rotationDegree = d3.scalePoint().domain([0,2*Math.PI - Math.PI/6]);

var columns = 5;
var spacing = 220;
var vSpacing = 250;

var fmcG = graphGroup.selectAll('.fmc')
  .data(data)
  .enter()
  .append('g')
  .attr('class','fmc')
  .attr('id',(d,i) => 'fmc' + i)
  .attr('transform',k) => {
var horSpace = (k % columns) * spacing;
var vertSpace = ~~((k / columns)) * vSpacing;
return "translate("+horSpace+","+vertSpace+")";
  });


fmcG.append('circle')
.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(function(d) {return d.fmc});

fmcG.append('line')
  //.data(function(d) {return d.ratings}) why doesnt it workk??????
.data([10,10])
.attr("x1",r)
.attr("y1",r)
.attr("x2",i) { return length(10) * Math.cos(rotationDegree(i) - Math.PI/2) + (width/2); })
.attr("y2",function(d) { return "#003366" });

问题

当使用数组中每个项目的值确定线的长度时,如何获取12个项的数组并以30度为增量(360除以12)在圆上附加线?

解决方法

主要问题是,现在您要添加一行。要附加与数据点一样多的行,必须设置适当的回车选择:

fmcG.selectAll(null)
  .data(function(d) {
    return d.ratings
  })
  .enter()
  .append('line')
  //etc...

顺便说一句,这就是您的data无法正常工作的原因(正如您在评论中所问的那样“为什么它不起作用?????”

其他问题:

  1. 点标需要具有离散域,例如d3.range(12)
  2. 无论出于何种原因,您都将圆圈向右下移100px。我将线移动相同的数量。

以下是这些更改的摘要:

var margins = {
  top: 20,bottom: 300,left: 30,right: 100
};

var height = 600;
var width = 900;

var totalWidth = width + margins.left + margins.right;
var totalHeight = height + margins.top + margins.bottom;

var svg = d3.select('body')
  .append('svg')
  .attr('width',totalWidth)
  .attr('height',totalHeight);

var graphGroup = svg.append('g')
  .attr('transform',"translate(" + margins.left + "," + margins.top + ")");

var data = [
  //{'fmc':'fmc1','ratings':[{'r1':10,'r2':10,'r3':10,'r4':10,'r5':10}]}
  {
    'fmc': 'fmc1','ratings': [10,10,10]
  },{
    'fmc': 'fmc2','ratings': [8,5,7,5]
  },{
    'fmc': 'fmc3',];

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 columns = 5;
var spacing = 220;
var vSpacing = 250;

var fmcG = graphGroup.selectAll('.fmc')
  .data(data)
  .enter()
  .append('g')
  .attr('class','fmc')
  .attr('id',(d,i) => 'fmc' + i)
  .attr('transform',k) => {
    var horSpace = (k % columns) * spacing;
    var vertSpace = ~~((k / columns)) * vSpacing;
    return "translate(" + horSpace + "," + vertSpace + ")";
  });


fmcG.append('circle')
  .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(function(d) {
    return d.fmc
  });

fmcG.selectAll(null)
  .data(function(d) {
    return d.ratings
  })
  .enter()
  .append('line')
  .attr("x1",100)
  .attr("y1",100)
  .attr("x2",function(d,i) {
    return 100 + length(d) * Math.cos(rotationDegree(i));
  })
  .attr("y2",i) {
    return 100 + length(d) * Math.sin(rotationDegree(i));
  })
  .style("stroke",function(d) {
    return "#003366"
  });
<script src="https://d3js.org/d3.v5.min.js"></script>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-