具有水平和垂直组合布局的可折叠树

2024-05-05

我正在尝试在 D3 中创建一个可折叠树,它结合了水平(第一级和第二级)和垂直(3+级)布局。这里有一个jsfiddle http://jsfiddle.net/artemkolotilkin/z7tb23Lo/到目前为止我所得到的。除了一件事之外,它几乎就在那里。当两个同级部分展开时,它们之间的距离会增加得超过应有的距离。

我相信发生这种情况是因为 D3 认为子元素将以水平方式定位,因此它为它们分配更多空间,但我在代码中覆盖它们的位置,以便它们垂直显示。我觉得我现在需要重写计算父节点之间距离的函数,但无法弄清楚是哪一个。

这是我的 JS 代码:

var margin = {
    top: 20,
    right: 20,
    bottom: 20,
    left: 20
},
width = 1140 - margin.right - margin.left,
    height = 800 - margin.top - margin.bottom;

var i = 0,
    duration = 750;

var tree = d3.layout.tree()
    .size([height, width]);

var diagonal = d3.svg.diagonal()
    .source(function (d) {
    return {
        "x": d.source.x,
            "y": d.source.y
    };
})
    .target(function (d) {
    return {
        "x": d.target.x,
            "y": d.target.y
    };
});

var svg = d3.select("#body").append("svg")
    .attr("width", "100%")
    .attr("height", height + margin.top + margin.bottom)
    .append("g")
    .attr("transform", "translate(" + margin.left + "," + margin.top + ")");

root.x0 = height / 2;
root.y0 = 0;

function collapse(d) {
    if (d.children) {
        d._children = d.children;
        d._children.forEach(collapse);
        d.children = null;
    }
}

root.children.forEach(function (parent) {
    collapse(parent);
});

update(root);

function update(source) {

    // Compute the new tree layout.
    var nodes = tree.nodes(root),
        links = tree.links(nodes),
        position = [];

    nodes.forEach(function (d) {
        if (d.parent) {
            position[d.parent.id] = position[d.parent.id] || 1;
            d.position = position[d.parent.id]++;
            if (d.children && d.depth > 1) {
                d.children.forEach(function (entry) {
                    position[d.parent.id]++;
                });
            }
        }
        if (d.depth < 2) {
            d.y = d.depth * 60;
            if (d.parent) {
                columns = d.parent.children.length;
                //d.x = (d.position - 1 + columns / 12) * width / columns;
            } else {
                columns = d.children.length;
                //d.x = (width * (4 * columns - 1)) / (8 * columns);
                // d.x = width / 2;
            }
        } else {
            d.y = d.parent.y + d.position * 20;
            d.x = d.parent.x + 20;
        }
    });

    // Update the nodes…
    var node = svg.selectAll("g.node")
        .data(nodes, function (d) {
        return d.id || (d.id = ++i);
    });

    // Enter any new nodes at the parent's previous position.
    var nodeEnter = node.enter().append("g")
        .attr("class", "node")
        .attr("transform", function (d) {
        return "translate(" + source.x0 + "," + source.y0 + ")";
    })
        .on("click", click);

    nodeEnter.append("circle")
        .attr("r", 1e-6)
        .style("fill", function (d) {
        return d._children ? "lightsteelblue" : "#fff";
    });

    nodeEnter.append("text")
        .attr("x", function (d) {
        return 10;
    })
        .attr("dy", ".35em")
        .attr("text-anchor", function (d) {
        return "start";
    })
        .text(function (d) {
        //return d.name + " ("+d.x+","+d.y+")";
        return d.name;
    })
        .each(function (d) {
        d.width = this.getBBox().width;
    })
        .style("fill-opacity", 1e-6);

    // Transition nodes to their new position.
    var nodeUpdate = node.transition()
        .duration(duration)
        .attr("transform", function (d) {
        return "translate(" + d.x + "," + d.y + ")";
    });

    nodeUpdate.select("circle")
        .attr("r", 4.5)
        .style("fill", function (d) {
        return d._children ? "lightsteelblue" : "#fff";
    });

    nodeUpdate.select("text")
        .style("fill-opacity", 1);

    // Transition exiting nodes to the parent's new position.
    var nodeExit = node.exit().transition()
        .duration(duration)
        .attr("transform", function (d) {
        return "translate(" + source.x + "," + source.y + ")";
    })
        .remove();

    nodeExit.select("circle")
        .attr("r", 1e-6);

    nodeExit.select("text")
        .style("fill-opacity", 1e-6);

    // Update the links…
    var link = svg.selectAll("path.link")
        .data(links, function (d) {
        return d.target.id;
    });

    // Enter any new links at the parent's previous position.
    link.enter().insert("path", "g")
        .attr("class", "link")
        .attr("d", function (d) {
        var o = {
            x: source.x0,
            y: source.y0
        };
        return diagonal({
            source: o,
            target: o
        });
    });

    // Transition links to their new position.
    link.transition()
        .duration(duration)
        .attr("d", diagonal);

    // Transition exiting nodes to the parent's new position.
    link.exit().transition()
        .duration(duration)
        .attr("d", function (d) {
        var o = {
            x: source.x,
            y: source.y
        };
        return diagonal({
            source: o,
            target: o
        });
    })
        .remove();

    // Stash the old positions for transition.
    nodes.forEach(function (d) {
        d.x0 = d.x;
        d.y0 = d.y;
    });
}

// Toggle children on click.
function click(d) {
    if (d.children) {
        d._children = d.children;
        d.children = null;
    } else {
        d.children = d._children;
        d._children = null;
    }
    update(d);
}

None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有水平和垂直组合布局的可折叠树 的相关文章

  • d3 强制添加和删除节点

    我根据我在书中看到的一些代码整理了以下 jfiddle http jsfiddle net hiwilson1 o3gwejbx 2 http jsfiddle net hiwilson1 o3gwejbx 2 总的来说 我关注正在发生的事
  • SVG 路径超出 d3 画笔上的图表区域

    当我尝试刷动和缩放折线图的一部分时 所选区域的某些部分会呈现在图表之外 代码和行为再现可以在以下位置找到这个jsbin https jsbin com jamojonaqu edit js output 单击并拖动以选择一部分并放大 双击以
  • d3.js:是否可以通过键而不是索引来进行转换?

    我有不同长度的数据数组 x值 年 是有限年数的一部分 例如 var data Year 2008 Value 5 Year 2009 Value 6 or var data Year 2007 Value 8 Year 2009 Value
  • 无法让 D3 .on('mouseover', ...) 工作

    我正在学习 D3 并尝试通过将鼠标悬停在 SVG 圆圈上来在散点图上显示数据信息 我从 csv 文件中获取数据 数据位于太阳系 包含行星名称 质量和半径 并且所有圆圈都正确显示 但是当我尝试在鼠标悬停时 console log 数据信息 例
  • d3.forcesimulation() 链接距离

    我在堆栈上查看了不同的链接距离 似乎为了改变链接距离 您需要实现一个函数 然后传递它来动态分配链接距离 如下所示 function linkDistance d return d distance 然后我认为我可以传递给 svg 但返回函数
  • 通过 Fabric.js 推送 D3.js 输出以支持 IE8?

    我正在评估Fabric js http fabricjs com 作为替代拉斐尔 js http raphaeljs com 用于创建与 IE8 兼容的交互式可视化 IE8 不支持 SVG 或画布 不幸的是 IE8 支持是不可协商的 Rap
  • d3 (v4) 树布局和打字稿:类型“HierarchyNode”上不存在属性“x”

    我正在尝试在使用时使用正确的 ts 类型d3 hierarchy具有树布局的根 例如 interface MyCustomGraphType id string children MyCustomGraphType let treeData
  • 如何在D3中导入json数据?

    如何在D3中导入json文件 I did d3 json temp json 但是我如何在进一步的代码中访问这个数据集呢 到目前为止我已经尝试过 var data d3 json temp json 但使用 data data 在其余代码中
  • 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.js 中拖动后(有时)单击事件未触发

    观察到的行为 我正在使用 d3 js 并且我想根据以下情况更新一些数据drag https github com mbostock d3 wiki Drag Behavior wiki on事件 并重绘事件之后的所有内容dragend ht
  • d3 地理投影从正交到 X 的过渡

    我正在开发一个教育地图项目 其中显示不同的地图投影 我想在选择不同投影之间实现变形过渡 我找到了一个很好的例子来实现它 并且我没有遇到太多的麻烦来重新创建它 不幸的是 我还需要裁剪投影的功能 这与目标状态完美配合 但在改变投影时则不然 当选
  • D3.js 中的点图

    我有兴趣创建一个Dot plot 每个数据值都有连续的点 但到目前为止我所管理的是为每个值创建一个点 更清楚地说 假设对于 array1 我希望第一个值创建 5 个圆圈 第二个值创建 4 个圆圈 依此类推 array1 5 4 2 0 3
  • D3:如何在Groups of Force布局节点上绘制多个凸包?

    我试图在力布局中的所有组上绘制凸包 但我只画出了一半的凸包 当 D3 尝试绘制其余的船体时 控制台返回错误 元素尚未创建 然而 当我检查控制台中的 groups 变量时 所有组数据都在那里 x y 数据都设置得很好 见下图 我什至尝试在ti
  • 分配函数后如何删除 onmouseout 事件?

    我有一个问题 我正在为 onmouseout 事件分配一个函数 但运行该事件后 我需要将其删除 将非常感谢您的帮助 这取决于你的代码 如果你用 d3 这样做 那么你可以说 在 onmouseout 事件函数中 element on mous
  • 将文本放置在矩形的中心

    在下面的代码中 文本没有放置在矩形的中心 我使用的是 attr dx x bandwidth 2 attr dy y bandwidth 2 有没有办法将文本中心放置在矩形中 而不是反复试验 目前它看起来像这样 朝底部和朝右 以下是我的代码
  • D3 v4 在同一元素上进行画笔和缩放(鼠标事件不冲突)

    我的目标是构建一个使用两者的 D3 v4 图表d3 zoom https github com d3 d3 zoom and d3 brush https github com d3 d3 brush一起 如下 当鼠标位于 x 轴上时 用户
  • 使圆圈与 d3.js 上的多线匹配相同的颜色过滤?

    我有一个多线图 当按每种水果过滤时会更新 每条线条颜色对应不同的销售年份 在 的帮助下Shashank https stackoverflow com users 5569282 shashank 每个数据点线上的圆圈已添加到组中 而不是直
  • 如何将此数据编码为 JSON 中的父/子结构

    我正在使用 d3 js 将动物 有机体 家族 一次最多 4000 个 可视化为树形图 尽管数据源也可以是目录列表或命名空间对象列表 我的数据如下 json organisms name Hemiptera Miridae Kanakamir
  • 如何使 d3 饼图响应式?

    我有一个 PIE 图表 它工作正常 但我无法使其具有响应能力和可调整大小 我需要它与移动浏览器和 iPad 等兼容 div div

随机推荐

  • 如何使用 angularjs 更改 iframe src

    p Your browser does not support iframes p 如何修改iframe的src 你还需要 sce trustAsResourceUrl否则它不会打开 iframe 内的网站 JSFiddle http js
  • 泛型函数的不同实例是否可以具有不同的静态变量?

    当我在泛型函数中使用静态变量时 泛型函数的每个实例中的变量实体都是相同的 例如 在这段代码中 fn foo
  • 为什么索引操作不调用 __getattr__ ?

    我的问题 看起来 getattr 不调用索引操作 即我不能使用 getattr 在课堂上A提供A 是否有一个原因 或者一种绕过它的方法 getattr 可以提供该功能而无需显式定义 getitem setitem 等A 最小示例 假设我定义
  • 读取txt文件中的每一行并使用windows dos命令分配变量

    我通过使用 Beyond Compare 命令行比较这 2 个文件夹 将文件从一个路径复制到 svn 工作副本 使用 Beyond Compare 进行比较后将生成报告 如果右侧存在任何额外文件 则应从 svn 存储库中删除 所以我使用下面
  • 通用 Property.GetSetMethod 的委托

    我正在尝试创建一个委托来设置泛型的属性值 但出现错误 Error binding to target method当我尝试执行以下代码时 Action
  • Ruby on Rails - 独特性

    我有一个关于唯一性验证的问题 From http guides rubyonrails org active record validations callbacks html uniqueness http guides rubyonra
  • 如何将 python 字典与多处理同步

    我正在使用 Python 2 6 和用于多线程的多处理模块 现在我想要一个同步字典 其中我真正需要的唯一原子操作是值上的 运算符 我应该用 multiprocessing sharedctypes synchronized 调用包装字典吗
  • 与恶霸算法相比,高级主选举算法有什么好处?

    我读过当前的主选举算法 如 Raft Paxos 或 Zab 如何在集群上选举主节点 但不明白为什么他们使用复杂的算法而不是简单的恶霸算法 我正在开发一个集群库并使用 UDP 多播来发送心跳消息 每个节点加入一个多播地址 并定期向该地址发送
  • Flask 会话不持久(Postman 有效,Javascript 无效)

    我正在开发一个 Flask 服务器 用于通过网络在一些后端 Python 功能和 Javascript 客户端之间进行通信 我正在尝试利用 Flask 的session变量来存储用户在与应用程序交互过程中的特定数据 我已经删除了下面大部分应
  • WebUSB 和 RFID 读取器

    我想知道是否有人有让 RFID 读取器通过 WebUSB 工作的经验 我使用的阅读器是https www parallax com product 28340 https www parallax com product 28340 根据我
  • ng-cloak 对于 Angular ui-router 在模板解析时隐藏元素没有帮助

    我正在使用角度用户界面路由器 我想展示一些东西如果 div 当模板下载并立即显示时 我们可以在控制器加载之前看到 div 的闪烁 scope total 有人会认为 scope total在开始时未定义 因此 div 将被隐藏 但我认为模板
  • Nginx 中 uwsgi_pass 和 proxy_pass 的区别?

    我在 Nginx 后面运行 uWSGI 并一直在使用proxy pass让 Nginx 访问 uWSGI 切换到有什么好处吗uwsgi pass 如果是这样 那是什么 uwsgi pass使用一个uwsgi协议 proxy pass使用普通
  • Android fill_parent 到 match_parent

    引入 match parent 和弃用 fill parent 背后的原因是什么 因为两者含义相同 此更改不会妨碍向后兼容性吗 使用 match parent 而不是 fill parent 不会使生成的 APK 在旧版本中无法运行 因为在
  • gwt 谷歌应用引擎 HTTP 错误 404

    我在 Eclipse 中使用 google 应用程序引擎创建了一个新的 gwt 项目 但是当我运行该项目时 在浏览器中我收到以下消息 HTTP 错误 404 访问 Test html 时出现问题 原因 NOT FOUND 由码头提供动力 现
  • 多维数组(如 C/C++ 中的数组)是不规则数组的特殊情况吗? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我和一个哥们讨论了C 和C多维数组是否是不规则数组的特例 一种观点是 多维数组不是参差不齐的数组 因为多维数组的每个元素具有相同的大小 在参差不齐的数
  • IE11 中的 JavaScript 给我脚本错误 1003

    我有一个带有手风琴和一些 javascript 的网站 在 Firefox 中一切正常 但在 IE11 中出现错误 SCRIPT1003 应为 我将其范围缩小到 js 文件中的这段代码 var nmArray new Array funct
  • 如何(如果可能)更改 eclipse(月出主题)中突出显示的搜索结果的颜色选项?

    我已将 Eclipse Kepler SR2 主题更改为 Moonrise 0 8 9 现在 突出显示对象的颜色使结果几乎不可见 我没有找到任何选项来修改文本颜色或背景颜色 我已附加搜索视图 要更改突出显示的行搜索结果 请转到 Window
  • 如何在节点红色中进行http重定向?

    我需要重定向到另一个网址 我正在使用nodered请求一个url 然后获取用户名和密码 在cloudant数据库中检查它们 在发现它们存在之后 我需要重定向到另一个 home 是否有一个节点可以重定向 我尝试使用 http 请求节点 但它只
  • 如何使用 Apache HttpClient 4 获取文件上传的进度条?

    我有以下用于使用 Apache 的 HTTP Client org apache http client 上传文件的代码 public static void main String args throws Exception String
  • 具有水平和垂直组合布局的可折叠树

    我正在尝试在 D3 中创建一个可折叠树 它结合了水平 第一级和第二级 和垂直 3 级 布局 这里有一个jsfiddle http jsfiddle net artemkolotilkin z7tb23Lo 到目前为止我所得到的 除了一件事之