d3js 将标签移动到节点旁边

2024-04-11

我正在开发一个通过图表进行模式表示的项目。我来从 json 检索数据以生成图形并找到与节点关联的标签(我还想找到与链接对应的标签)。但是,当移动节点时,我无法移动标签。有什么帮助吗?请参阅此处的代码 http://jsfiddle.net/obordies25/L76yboz9/11:

var width = 960,
    height = 500,
    resolution = 150,
    r = 15;

var graph = {
    "nodes":  [
        {"task": "1", "label": "1", "social": "I", "id": 1, "x": 150, "y": 450},
        {"task": "2", "label": "2", "social": "G", "id": 2, "x": 300, "y": 150},
        {"task": "3", "label": "3", "social": "T", "id": 3, "x": 450, "y": 300}
        ],

    "links": [
        {"source": "1", "target": "2", "type": "N:1"},
        {"source": "2", "target": "3", "type": "1:N"},
        {"source": "1", "target": "3", "type": "1:1"}
        ]
}

var margin = {
    top: -5,
    right: -5,
    bottom: -5,
    left: -5
};

var colors = d3.scale.category20();

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

var force = d3.layout.force()
    .charge(-200)
    .linkDistance(50)
    .size([width + margin.left + margin.right, height + margin.top + margin.bottom])
    .nodes(graph.nodes);

var drag = d3.behavior.drag()
    .origin(function(d) { return d; })
    .on('drag', dragged);

svg.selectAll('.vertical')
    .data(d3.range(1, width / resolution))
    .enter().append('line')
    .attr('class', 'vertical')
    .attr('x1', function(d) { return d * resolution; })
    .attr('y1', 0)
    .attr('x2', function(d) { return d * resolution; })
    .attr('y2', height);

svg.selectAll('.horizontal')
    .data(d3.range(1, height / resolution))
    .enter().append('line')
    .attr('class', 'horizontal')
    .attr('x1', 0)
    .attr('y1', function(d) { return d * resolution; })
    .attr('x2', width)
    .attr('y2', function(d) { return d * resolution; });

svg.append('defs').append('marker')
    .attr({'id':'arrowhead',
        'viewBox':'-0 -5 10 10',
        'refX':25,
        'refY':0,
        'orient':'auto',
        'markerWidth':5,
        'markerHeight':5,
        'xoverflow':'visible'})
    .append('svg:path')
    .attr('d', 'M 0,-5 L 10 ,0 L 0,5')
    .attr('fill', '#777')
    .style('stroke','none');


var link = svg.selectAll("svg.link")
    .data(graph.links)
    .enter().append("line")
    .attr("class", "link")
    .attr('marker-end','url(#arrowhead)')

    .attr("data-source", function (d) {
          return d.source;
        })
    .attr("data-target", function (d) {
          return d.target;
        })
    .attr("x1", function (d) {
        for (let node of graph.nodes) {
            if (node.task === d.source)
                return node.x;
        }
    })
    .attr("x2", function (d) {
        for (let node of graph.nodes) {
            if (node.task === d.target)
                return node.x;
        }
    })
    .attr("y1", function (d) {
        for (let node of graph.nodes) {
            if (node.task === d.source)
                return node.y;
        }
    })
    .attr("y2", function (d) {
        for (let node of graph.nodes) {
            if (node.task === d.target)
                return node.y;
        }
    })
    .style("stroke-width", function(d) {
        return Math.sqrt(d.value);
});

var node = svg.selectAll("svg.node")
    .data(graph.nodes)
    .enter().append('g');

node.append("circle")
    .attr("class", "node")
    .attr('cx', function(d) { return d.x; })
    .attr('cy', function(d) { return d.y; })
    .attr('r', r)
    .call(drag);//
    
//text element
node.append("title")
    .text(function (d) {return d.social});

node.append("text")
    //.attr("dx", )
    //.attr("dy", 6)
    .attr("class", "font")
    .attr('dx', function(d) { return d.x-6; })
    .attr('dy', function(d) { return d.y+6; })
    .text(function(d) { return d.social; });

force.on("tick", function () {
    link.attr("x1", function (d) { return d.source.x; })
        .attr("y1", function (d) { return d.source.y; })
        .attr("x2", function (d) { return d.target.x; })
        .attr("y2", function (d) { return d.target.y; });

    node.attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; });

});

function dragged(d) {
  var x = d3.event.x,
      y = d3.event.y,

      gridX = round(Math.max(r, Math.min(width - r, x)), resolution),
      gridY = round(Math.max(r, Math.min(height - r, y)), resolution);

      d3.select(this).attr('cx', d.x = gridX).attr('cy', d.y = gridY);
      d3.select(this).attr('dx', d.x = gridX).attr('dy', d.y = gridY);

      d3.selectAll(`[data-source='${d.task}']`).attr('x1', d.x).attr('y1', d.y);
      d3.selectAll(`[data-target='${d.task}']`).attr('x2', d.x).attr('y2', d.y);
}

function round(p, n) {
  return p % n < n / 2 ? p - (p % n) : p + n - (p % n);
}
.node {
    fill:#ccc;
    stroke: #fff;
    stroke-width: 2px;
}
.node-active {
    stroke: #555;
    stroke-width: 1.5px;
}
link-active {
    stroke: #555;
    stroke-opacity: 5;
}
line {
  stroke: rgb(212, 212, 212);
  stroke-width: 1px;
  shape-rendering: crispEdges;
}
.overlay {
    fill: none;
    pointer-events: all;
}
.link{
    stroke: #ccc;
    stroke-width: 2px;
    }
svg {
  box-sizing: border-box;
  border: 1px solid rgb(212, 212, 212);
}
 <!DOCTYPE html>
<html>
<head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <title>[D3]</title>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <meta name="robots" content="noindex, nofollow">
  <meta name="googlebot" content="noindex, nofollow">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  
  <body>
<script src="https://d3js.org/d3.v3.min.js" charset="utf-8"></script>
</body>

添加标识属性<circle> and <text>要素:

...attr('node-id', d => d.social)

沿着圆圈移动文本:

d3.select(`text[node-id='${d.social}']`).attr('dx', d.x).attr('dy', d.y)

使用文本锚点和对齐基线<text>标签而不是偏移量(+6/-6):

...attr('text-anchor', 'middle')
  .attr('alignment-baseline', 'middle')
  .attr('dx', function(d) { return d.x; })
  .attr('dy', function(d) { return d.y; })

我还放大了<circle>是为了让它们易于拖动...

var width = 960,
    height = 500,
    resolution = 150,
    r = 15;

var graph = {
    "nodes":  [
        {"task": "1", "label": "1", "social": "I", "id": 1, "x": 150, "y": 450},
        {"task": "2", "label": "2", "social": "G", "id": 2, "x": 300, "y": 150},
        {"task": "3", "label": "3", "social": "T", "id": 3, "x": 450, "y": 300}
        ],

    "links": [
        {"source": "1", "target": "2", "type": "N:1"},
        {"source": "2", "target": "3", "type": "1:N"},
        {"source": "1", "target": "3", "type": "1:1"}
        ]
}

var margin = {
    top: -5,
    right: -5,
    bottom: -5,
    left: -5
};

var colors = d3.scale.category20();

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

var force = d3.layout.force()
    .charge(-200)
    .linkDistance(50)
    .size([width + margin.left + margin.right, height + margin.top + margin.bottom])
    .nodes(graph.nodes);

var drag = d3.behavior.drag()
    .origin(function(d) { return d; })
    .on('drag', dragged);

svg.selectAll('.vertical')
    .data(d3.range(1, width / resolution))
    .enter().append('line')
    .attr('class', 'vertical')
    .attr('x1', function(d) { return d * resolution; })
    .attr('y1', 0)
    .attr('x2', function(d) { return d * resolution; })
    .attr('y2', height);

svg.selectAll('.horizontal')
    .data(d3.range(1, height / resolution))
    .enter().append('line')
    .attr('class', 'horizontal')
    .attr('x1', 0)
    .attr('y1', function(d) { return d * resolution; })
    .attr('x2', width)
    .attr('y2', function(d) { return d * resolution; });

svg.append('defs').append('marker')
    .attr({'id':'arrowhead',
        'viewBox':'-0 -5 10 10',
        'refX':40,
        'refY':0,
        'orient':'auto',
        'markerWidth':5,
        'markerHeight':5,
        'xoverflow':'visible'})
    .append('svg:path')
    .attr('d', 'M 0,-5 L 10 ,0 L 0,5')
    .attr('fill', '#777')
    .style('stroke','none');


var link = svg.selectAll("svg.link")
    .data(graph.links)
    .enter().append("line")
    .attr("class", "link")
    .attr('marker-end','url(#arrowhead)')

    .attr("data-source", function (d) {
          return d.source;
        })
    .attr("data-target", function (d) {
          return d.target;
        })
    .attr("x1", function (d) {
        for (let node of graph.nodes) {
            if (node.task === d.source)
                return node.x;
        }
    })
    .attr("x2", function (d) {
        for (let node of graph.nodes) {
            if (node.task === d.target)
                return node.x;
        }
    })
    .attr("y1", function (d) {
        for (let node of graph.nodes) {
            if (node.task === d.source)
                return node.y;
        }
    })
    .attr("y2", function (d) {
        for (let node of graph.nodes) {
            if (node.task === d.target)
                return node.y;
        }
    })
    .style("stroke-width", function(d) {
        return Math.sqrt(d.value);
});

var node = svg.selectAll("svg.node")
    .data(graph.nodes)
    .enter().append('g');

node.append("circle")
    .attr("class", "node")
    .attr('node-id', d => d.social)
    .attr('cx', function(d) { return d.x; })
    .attr('cy', function(d) { return d.y; })
    .attr('r', r * 2)
    .call(drag);//
    
node.append("text")
    .attr("class", "label")
    .attr('node-id', d => d.social)
    .attr('text-anchor', 'middle')
    .attr('alignment-baseline', 'middle')
    .attr('dx', function(d) { return d.x; })
    .attr('dy', function(d) { return d.y; })
    .text(function(d) { return d.social; });

force.on("tick", function () {
    link.attr("x1", function (d) { return d.source.x; })
        .attr("y1", function (d) { return d.source.y; })
        .attr("x2", function (d) { return d.target.x; })
        .attr("y2", function (d) { return d.target.y; });

    node.attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; });

});

function dragged(d) {
  var x = d3.event.x,
      y = d3.event.y,

      gridX = round(Math.max(r, Math.min(width - r, x)), resolution),
      gridY = round(Math.max(r, Math.min(height - r, y)), resolution);

      d3.select(this).attr('cx', d.x = gridX).attr('cy', d.y = gridY);
      d3.select(this).attr('dx', d.x = gridX).attr('dy', d.y = gridY);

      d3.selectAll(`[data-source='${d.task}']`).attr('x1', d.x).attr('y1', d.y);
      d3.selectAll(`[data-target='${d.task}']`).attr('x2', d.x).attr('y2', d.y);
      d3.select(`text[node-id='${d.social}']`).attr('dx', d.x).attr('dy', d.y)
}

function round(p, n) {
  return p % n < n / 2 ? p - (p % n) : p + n - (p % n);
}
.node {
    fill:#ccc;
    stroke: #fff;
    stroke-width: 2px;
}
.node-active {
    stroke: #555;
    stroke-width: 1.5px;
}
link-active {
    stroke: #555;
    stroke-opacity: 5;
}
line {
  stroke: rgb(212, 212, 212);
  stroke-width: 1px;
  shape-rendering: crispEdges;
}
.overlay {
    fill: none;
    pointer-events: all;
}
.link{
    stroke: #ccc;
    stroke-width: 2px;
    }
svg {
  box-sizing: border-box;
  border: 1px solid rgb(212, 212, 212);
}
 <!DOCTYPE html>
<html>
<head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <title>[D3]</title>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <meta name="robots" content="noindex, nofollow">
  <meta name="googlebot" content="noindex, nofollow">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  
  <body>
<script src="https://d3js.org/d3.v3.min.js" charset="utf-8"></script>
</body>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

d3js 将标签移动到节点旁边 的相关文章

  • 在 Power BI 自定义视觉对象中使用 d3.js 库绘制一条线

    我正在努力在 Power BI 自定义视觉对象中绘制一条单线 Power BI 中的报表是使用 TypeScript 和 d3 js v 3 0 编写的 我可以用轴绘制图表 但没有出现线条 在 HTML 文件中使用纯 d3 js 确实很容易
  • 将数据从 csv 复制到 D3 中的数组中

    我知道这个问题以前曾被问过 但由于某种原因 他们的解决方案对我不起作用 我正在尝试使用 CSV 文件中的数据填充两个数组 其中 name value alpha 34 beta 12 delta 49 gamma 89 我现在正在尝试的是
  • SVG 路径超出 d3 画笔上的图表区域

    当我尝试刷动和缩放折线图的一部分时 所选区域的某些部分会呈现在图表之外 代码和行为再现可以在以下位置找到这个jsbin https jsbin com jamojonaqu edit js output 单击并拖动以选择一部分并放大 双击以
  • d3.js:如何在圆环图中的标签下方添加值

    我是 d3 js 的新手 到目前为止我所取得的成就是 this https jsfiddle net saras arya ypdw96v9 使用教程和视频 Now I am trying to add the dataset value
  • D3:打字机风格的文本过渡

    In this jsfiddle http jsfiddle net VividD QbysN 标签通过减小旧文本的字体 然后增加新文本的字体 从一个文本过渡到另一个文本 但是 我希望新文本以 打字机 方式出现 就像这样jsfiddle h
  • NVD3 - 更新数据时不均匀的刻度

    当我更新现有 NVD3 图表中的数据时 沿 x 轴的刻度不以固定间隔呈现 我正在创建一个multiBarChart数据来源于d3 json 数据表示某个日期范围内的点击次数 我有一个单独的日期范围选择器 可以更新图表的数据 我有以下内容来创
  • 我想从 Cakefile 运行 d3

    我想从命令行执行一些 d3 代码 最初我只是尝试了类似的方法 task data Build some data with d3 gt d3 require lib d3 v2 console log d3 version d3 versi
  • d3.js v4 中的 d3.locale(),本地化

    我正在使用 d3 js 制作图表 现在想将其更新到 v4 结果发现d3 locale 由于所有日期格式的翻译都采用不同的语言 因此不再起作用 我该如何解决这个问题 我正在挖掘论坛 但对于 v4 我并没有真正找到它 你必须使用d3 timeF
  • 选择 G 元素内的路径并更改样式

    本质上 我试图让除悬停的路径之外的所有路径都变成灰色 而选择的路径则保持其原始颜色 我已经能够将所有其他路径变成灰色 但是我在使用 select this 函数并实际访问我想要更改样式的路径时遇到了问题 看来我实际上已经成功地找到了 g 组
  • d3.js:在树布局中展开多个路径

    My JSON contains same node names in different paths I would like to be able to open all children with the same name or h
  • d3.select 不适用于特殊字符

    我正在使用 d3 js 处理简单的图表 假设下面的 div 是我计划放置 d3 的 svg 容器的地方 div 但是当我使用 d3 select my div chart 我无法选择特定的 div 但是通过使用 java 脚本选择器 它可以
  • 获取因子变量中水平和标签之间的原始关联

    我正在寻找一个函数来获取因子变量的原始映射表 我导入一个 Rdata 文件 我有一个名为 FactVar 的因子变量 我知道 FactVar 的映射表如下 010025 gt city1 015146 gt city2 048017 gt
  • d3.js。带条的旋转地球仪

    我正在尝试创建带有像这样的酒吧的旋转地球仪这个例子 http data arts appspot com globe 你可以看我的例子here http jsfiddle net zeleniy jrh5xucs 一切都很顺利 直到酒吧超出
  • 如何在D3中导入json数据?

    如何在D3中导入json文件 I did d3 json temp json 但是我如何在进一步的代码中访问这个数据集呢 到目前为止我已经尝试过 var data d3 json temp json 但使用 data data 在其余代码中
  • d3.js V4 按钮缩放实现表现得很奇怪

    我正在尝试实现 d3 平移和缩放功能 默认的平移和缩放工作正常 但要求是我们还需要放大和缩小按钮 我还实现了缩放按钮 它也有效 奇怪的是 当我第一次移动图像并单击缩放按钮时 图像会移回到以前的位置 不仅是当我第一次用鼠标缩放并使用按钮再次开
  • D3:使用 d3-tile 缩放到边界框

    我已成功将 D3 矢量 地图分层到从 Mapbox 提取图块的 d3 tile 光栅 地图之上 手动缩放效果非常好 矢量和光栅都是同步的 我现在正在尝试实施迈克 博斯托克 缩放到边界框 https bl ocks org mbostock
  • 我可以补间 D3 弧的结束角度,但不能补间起始角度。我究竟做错了什么?

    我只是在玩这个演示并自己重新创建它 http bl ocks org mbostock 5100636 http bl ocks org mbostock 5100636 我可以定义一个新的 endAngle 并且它会很好地制作动画 但现在
  • d3 同步 2 个独立的缩放行为

    我有以下 d3 d3fc 图表 https codepen io parliament718 pen BaNQPXx https codepen io parliament718 pen BaNQPXx 该图表的主要区域有缩放行为 y 轴有
  • 如何运行 D3 示例

    例如https observablehq com d3 zoomable treemap https observablehq com d3 zoomable treemap 如果将脚本片段粘贴到
  • 如何使用 D3 (或只是 javascript)将表单选项设置为“选择”

    有没有一种方法可以搜索选择表单元素中的所有选项 并将具有匹配值的选项指定为 已选择 var xStat G var statOptions Points PTS Goals G Assists A Penalty Minutes PIM c

随机推荐

  • Django请求GET参数值列表

    我想做一些排序 我想要的是使用名为 ordering 的参数执行 GET 请求 如下所示 该值将是我将用于排序的模型属性 如下所示 order age height 问题是当我尝试接收订单参数时 该值是一个列表 我尝试像这样使用 as if
  • 查看寻呼机 + ImageView + 捏合缩放 + 旋转

    我想在 Imageview 上实现捏缩放 在 View Pager 中类似于默认 Android Gallery 我在 GitHub 上找到了多个源 但缩放和滑动仅适用于第一个图像 我尝试过的 1 触摸图像视图 https github c
  • 如何从缓冲图像中获取子图像

    我们可以使用 BufferedImage 获取子图像getSubimage int int int int 但我的问题是我想通过传递双值来获得精确的子图像 矩形图像 width and height 有什么替代方案吗 将 double 值转
  • FragmentTransation setCustomAnimations 不起作用

    我尝试使用新的 android 兼容性包将片段包含到我的项目中 我试图在添加新片段时包含过渡动画 这只是我的动画作品之一 In 动画有效 但 Out 动画无效 我在某处读到这是兼容性包中的一个错误 但我还了解到该错误已在兼容性包的第三版中修
  • 是否有从 Maven 到 Bazel 的迁移路径?

    现在巴泽尔 http bazel io http bazel io 已经开源了 是否有一个增量过程可以让我逐渐从 Maven 迁移 一个大型存储库 到 Bazel 我在研究巴泽尔 不 据我们所知 没有这样的过程 我希望 我们一直在运行一些从
  • iOS Swift 3 参数前面有下划线

    今天我在Xcode中打开我的项目 需要将当前的Swift转换为Swift 3 转换后 我发现函数的所有参数前面都有一个下划线 例如 func didGetWeather weather Weather 我尝试去掉下划线 效果很好 我想知道这
  • IE9 ReactJs 中未定义“Set”或“Map”

    我使用 React 16 2 0 创建了一个简单的应用程序 当我在 IE9 上执行 运行它时 它显示控制台错误 Set 或 Map 未定义 我发现在 IE9 上运行我的 React 应用程序需要一些填充 我按照以下步骤操作 它对我有用 由于
  • MPL pos 是一个未记录的元函数吗?

    里面有下面的示例代码BOOST MPL 文档find算法 http www boost org doc libs 1 46 1 libs mpl doc refmanual find html typedef vector
  • 什么是部分视图?

    我一直在使用 Codeigniter 来习惯模型 视图 控制器架构 并尝试加快制作和实现网站的过程 我不断看到对 部分视图 的引用 但找不到该术语的定义 谁能告诉我什么是部分视图以及它在哪里使用 部分视图只是可以包含在父视图中的子视图 我们
  • Sonata 管理捆绑包 - 表单类型:sonata_type_collection - 自定义模板?

    是否可以覆盖表单类型的模板 sonata type collection 我已经尝试过以下方法 formMapper gt add slides sonata type collection array array edit gt inli
  • 如何将“element.offsetParent”与 HTML SVG 元素一起使用?

    我正在对一些 javascript 进行维护 它使用 offsetParent http www quirksmode org js findpos html财产 最近的更改现在使应用程序使用 SVG 元素 并且它们破坏了 JavaScri
  • 如何在 Iphone 上显示带有 UIButton 的 UINavigationController?

    在我的应用程序中 第一个视图是一个 UIView 带有几个 uilabel 和一个 uibutton 来进行登录 我想在登录后显示一个带有表格的 uinavigationcontroller 因此可以使用按钮的操作 我知道如何从 Xcode
  • Python 中的(命名)元组字典和速度/RAM 性能

    我正在创建一本字典d一百万个元组项目 理想情况下我想通过以下方式访问它们 d 1634 id or d 1634 id d 1634 name or d 1634 name d 1634 isvalid or d 1634 isvalid
  • 如何使用 vba 将临时记录集导出到 csv 文件

    我有一个 MS Access 表 正在跟踪 50 种产品及其每日销量 我想使用 vba 1 csv 文件 包括标题 导出每个产品 显示记录集中的每日交易量 而不将记录集保存到永久查询 我正在使用下面的代码 但我陷入了下面代码中突出显示的实际
  • 如何在静态服务器上托管 ReactJS 项目

    我已经构建了一个 React 应用程序 它在本地服务器上运行良好 但是 当我运行 npm run build 时 该过程似乎正确执行 创建 build 文件夹 其中包含捆绑的 js 文件和 index html 文件 但是当我在浏览器中打开
  • 每个用户的子域

    我拥有一个网站 为每个注册用户提供一个专用空间 如下所示 www mywebpage com user1 www mywebpage com user2 www mywebpage com user3在这条路径中 用户有他的迷你网站 我想为
  • 自定义内联SeekBarPreference - 如何在第一次运行时设置SeekBar进度?

    我已经准备好了一个简单的测试项目 https github com afarber android newbie tree q19 MyPrefs我在 GitHub 上提出的问题 我的项目中有一个自定义inline 搜索栏首选项 https
  • Python ctypes:带有 LPCSTR [out] 参数的原型

    我目前正在进入ctypes模块 我正在尝试调用 user32 函数GetWindowText http msdn microsoft com en us library windows desktop ms633520 28v vs 85
  • SSL23_GET_SERVER_HELLO:未知协议[连接到msa(587)端口]

    当新用户注册并忘记密码时 我正在尝试发送电子邮件 我正在 Linux 上工作 该应用程序是使用 node js 开发的 Error Error 140020013401920 error 140770FC SSL routines SSL2
  • d3js 将标签移动到节点旁边

    我正在开发一个通过图表进行模式表示的项目 我来从 json 检索数据以生成图形并找到与节点关联的标签 我还想找到与链接对应的标签 但是 当移动节点时 我无法移动标签 有什么帮助吗 请参阅此处的代码 http jsfiddle net obo