当前位置: 首页 > 知识库问答 >
问题:

有没有可能将D3.tree()用于包含父类而不是子类的数据集?

习洲
2023-03-14

我正在使用D3创建家谱。我的数据集确实是分层的,但树的根节点是子节点。每个“子节点”包含两个“父”节点,代表每个孩子的两个父母。这是我的数据示例。

    {
    name: "Morgans Jumpin Jack Flash",
    imagePath: "",
    description: "",
    subTitle: "",
    body: "",
    icon: "",
    iconColor: "",
    gender: "m",
    parents: [
        {
            name: "Moganas Heart of Fire",
            imagePath: "",
            description: "",
            subTitle: "",
            body: "",
            icon: "",
            iconColor: "",
            gender: "f",
            parents: [
                {
                    name: "Elkhaus Ice Storm",
                    imagePath: "",
                    description: "",
                    subTitle: "",
                    body: "",
                    icon: "",
                    iconColor: "",
                    gender: "m",
                    parents: []
                },{
                    name: "Morganas First Love",
                    imagePath: "",
                    description: "",
                    subTitle: "",
                    body: "",
                    icon: "",
                    iconColor: "",
                    gender: "f",
                    parents: []
                },
            ]
        },{
            name: "Desperado Hogan von der Accani",
            imagePath: "",
            description: "",
            subTitle: "",
            body: "",
            icon: "",
            iconColor: "",
            gender: "m",
            parents: [
                {
                    name: "Jim von Aurachgrund",
                    imagePath: "",
                    description: "",
                    subTitle: "",
                    body: "",
                    icon: "",
                    iconColor: "",
                    gender: "m",
                    parents: []
                },{
                    name: "Heroina D. Altobella",
                    imagePath: "",
                    description: "",
                    subTitle: "",
                    body: "",
                    icon: "",
                    iconColor: "",
                    gender: "f",
                    parents: []
                },
            ]
        },
    ]
}

树中的每个节点都代表一只狗。这里的想法是,您可以通过沿着家谱到父母、祖父母等来查看给定的狗的谱系。

是否可以在不修改数据的情况下将给定的数据集与d3.tree()一起使用?(我知道我可能只是将“父母”重命名为“孩子”,但这对下一个查看数据集的人来说会令人难以置信地困惑。)

共有1个答案

戎高爽
2023-03-14

您不需要改变您的原始数据集,而是当您使用d3.hierarchy创建根时,您可以指定哪个属性包含“子元素”:

var root = d3.hierarchy(data, function(d) {
   return d.parents;  
})

第二个参数是“子”访问器,但您可以使用它来表示父母。我刚刚保留了从左到右的布局,但将其更改为从右到左的布局是相当微不足道的:

var data = {
    name: "Morgans Jumpin Jack Flash",
    imagePath: "",
    description: "",
    subTitle: "",
    body: "",
    icon: "",
    iconColor: "",
    gender: "m",
    parents: [
        {
            name: "Moganas Heart of Fire",
            imagePath: "",
            description: "",
            subTitle: "",
            body: "",
            icon: "",
            iconColor: "",
            gender: "f",
            parents: [
                {
                    name: "Elkhaus Ice Storm",
                    imagePath: "",
                    description: "",
                    subTitle: "",
                    body: "",
                    icon: "",
                    iconColor: "",
                    gender: "m",
                    parents: []
                },{
                    name: "Morganas First Love",
                    imagePath: "",
                    description: "",
                    subTitle: "",
                    body: "",
                    icon: "",
                    iconColor: "",
                    gender: "f",
                    parents: []
                },
            ]
        },{
            name: "Desperado Hogan von der Accani",
            imagePath: "",
            description: "",
            subTitle: "",
            body: "",
            icon: "",
            iconColor: "",
            gender: "m",
            parents: [
                {
                    name: "Jim von Aurachgrund",
                    imagePath: "",
                    description: "",
                    subTitle: "",
                    body: "",
                    icon: "",
                    iconColor: "",
                    gender: "m",
                    parents: []
                },{
                    name: "Heroina D. Altobella",
                    imagePath: "",
                    description: "",
                    subTitle: "",
                    body: "",
                    icon: "",
                    iconColor: "",
                    gender: "f",
                    parents: []
                },
            ]
        },
    ]
}

var root = d3.hierarchy(data, function(d) {
  return d.parents;
})



var width =500;
var height = 300;
var margin = {left:100,top:50,right:100,bottom:50};

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



var tree = d3.tree().size([height-margin.top-margin.bottom,width-margin.left-margin.right]);
var path = d3.linkHorizontal().x(function(d) { return d.y; }).y(function(d) { return d.x; })
var layout = tree(root);

var link = g.selectAll(null)
  .data(layout.links())
  .enter().append("path")
  .attr("class","link")
  .attr("d", path)

var text = g.selectAll(null)
  .data(root.descendants())
  .enter().append("text")
  .attr("transform", function(d) { return "translate(" + d.y + "," + d.x + ")"; })
.text(function(d) { return d.data.name; })
  .attr("y",-15)
  .attr("x",-10)

var node = g.selectAll(null)
  .data(root.descendants())
  .enter().append("circle")
  .attr("transform", function(d) { return "translate(" + d.y + "," + d.x + ")"; })
  .attr("class","node")
  .attr("r",function(d) { return d.data.name == "" ? 0 : 8; });
path {
  fill:none;
  stroke: #888;
  stroke-width: 2px;
 }
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
 类似资料:
  • 有没有一种简单的方法可以从OWLAPI中的OWL本体中只检索根类?这里我指的是没有断言父类的命名类。增加了复杂性,尝试不使用reasoner,因为本体是巨大的,并且reasoner没有在足够快的时间内完成(通常)。一如既往的感谢!

  • 问题内容: 我有一个相当简单的行家化Java项目,但是在解决这个问题时遇到了麻烦。 我的父模块定义了许多Java类(和依赖项),我希望它们对几个子模块很有用。子模块之一专用于部署Web应用程序,因此它需要一些额外的类(Servlet)以及父模块中的所有内容。 文件结构如下所示 我的父母pom看起来像这样: 孩子看起来像这样: 这是我需要让孩子知道父级中定义的类和依赖项的全部吗?它似乎不是:ecli

  • 我想知道如果为某个参数创建一个带有空setter方法的父类,然后创建几个扩展该类的类,但不是所有的类都有该参数,会发生什么。在参数存在的类中调用set方法时,它会设置param。在参数不存在的类中,不会发生任何事情,例如: 因此,如果我们创建类A,将其上转换为Pak,并尝试,属性将被设置。 如果我们对类B也这样做,尝试什么都不会发生。 有人能解释一下“引擎盖下”发生了什么吗?我希望得到一个例外,因

  • 我有基类orderItem并且有子类DeviceItem和ServiceItem。我提供了下面的定义。当我收到这个请求时,我执行dozer映射以将jaxb模型转换为我创建的另一个数据模型。我的数据模型也有相同的OrderItem、DerviceItem和DeviceItem类,它们是POJO。当我进行dozer映射时,类会映射到OrderItem(基类)而不是专门的子类。有没有办法执行此用户doz

  • 当我尝试自动连接扩展CrudRepository的接口时,我遇到了这个错误。我有两个用于两个数据库的hibernate xml配置。整个堆栈是 unsatisfiedDependencyException:创建名为“Hello Controller”的bean时出错:通过字段“stock service”表示的不满足的依赖项;嵌套异常为org.springframework.beans.facto