首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据datapoint索引更改元素绘图顺序?

如何根据datapoint索引更改元素绘图顺序?
EN

Stack Overflow用户
提问于 2020-01-18 01:03:17
回答 1查看 39关注 0票数 1

我正在为我在d3.js datavizualisation中使用的数据的每个数据点绘制几个元素。这将根据数据创建一个简单的项列表。它的产出如下:

代码语言:javascript
复制
<div>
  <p>[Title of datapoint 1]</p>
  <svg>[SVG using datapoint 1]</svg>
</div>
<div>
  <p>[Title of datapoint 2]</p>
  <svg>[SVG using datapoint 2]</svg>
</div>
<div>
  <p>[Title of datapoint 3]</p>
  <svg>[SVG using datapoint 3]</svg>
</div>
<div>
  <p>[Title of datapoint 4]</p>
  <svg>[SVG using datapoint 4]</svg>
</div>
<div>
  <p>[Title of datapoint 5]</p>
  <svg>[SVG using datapoint 5]</svg>
</div>

对大多数人来说,这正是他们想要的。

但是,我试图实现的是能够更改绘图顺序,例如,每个偶数数据点都应该以SVG标记开始,以p标记结束。看起来是这样的:

代码语言:javascript
复制
<div>
  <p>[Title of datapoint 1]</p>
  <svg>[SVG using datapoint 1]</svg>
</div>
<div>
  <svg>[SVG using datapoint 2]</svg>
  <p>[Title of datapoint 2]</p>
</div>
<div>
  <p>[Title of datapoint 3]</p>
  <svg>[SVG using datapoint 3]</svg>
</div>
<div>
  <svg>[SVG using datapoint 4]</svg>
  <p>[Title of datapoint 4]</p>
</div>
<div>
  <p>[Title of datapoint 5]</p>
  <svg>[SVG using datapoint 5]</svg>
</div>

请注意,对于数据池2和4,绘图顺序都发生了变化。

有人能告诉我d3.js是否提供了实现这一目标的方法,或者您能告诉我如何自己解决这个问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-19 08:29:14

不幸的是,您没有共享代码,所以我们不能重构它。

因此,我将使用selection.each编写一个答案,在您的例子中,这可以说是惯用的D3解决方案。这里唯一重要的事情是将索引传递给余数操作符,如i % 2,它返回奇数索引的true (1)和偶数索引的false (0)。然后,使用if,我们可以选择哪些元素将被追加。例如:

代码语言:javascript
复制
.each(function(_, i) {
    if (i % 2) {
        appendSvg(d3.select(this))
        appendParagraph(d3.select(this))
    } else {
        appendParagraph(d3.select(this))
        appendSvg(d3.select(this))
    }
});

在本例中,我使用了两个不同的函数,它们是我传递当前选择的函数,但您可以简单地使用所拥有的块(不过,代码比较重复)。

下面是演示:

代码语言:javascript
复制
const body = d3.select("body");

const divs = body.selectAll(null)
  .data(d3.range(5))
  .enter()
  .append("div")
  .each(function(_, i) {
    if (i % 2) {
      appendSvg(d3.select(this))
      appendParagraph(d3.select(this))
    } else {
      appendParagraph(d3.select(this))
      appendSvg(d3.select(this))
    }
  });

function appendSvg(sel) {
  sel.append("svg")
    .attr("width", 80)
    .attr("height", 20);
};

function appendParagraph(sel) {
  sel.append("p")
    .html("This is a p element")
};
代码语言:javascript
复制
div {
  display: inline-block;
  margin-right: 10px;
  border: 1px solid gray;
  padding: 2px;
}

svg {
  background-color: tan;
}

p {
  font-size: 12px;
  margin-bottom: 4px;
}
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59796662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档