gpt4 book ai didi

svg - Circle-packing diagram - 两组值之间的转换

转载 作者:行者123 更新时间:2023-12-04 19:28:44 25 4
gpt4 key购买 nike

我有一个与 circle packing 非常相似的图表

在某些时候,用户想要查看一些不同的数据。显然,可以立即显示不同的图表,但从感知和认知的角度来看,过渡会好得多。注意:层次结构保持不变,没有新的或删除的节点,只有决定圆圈大小变化的基础值。

在结构相同但值不同的两个圆包图之间实现这种平滑过渡的好方法是什么?

(当然,在过渡过程中,假设持续10秒,不需要像原始图中那样保持圆圈之间的关系,圆圈可以相交并越过另一个)

我知道 treemaps 有类似的解决方案.但是,它根本不能应用在圆包装上。 Treemaps 甚至有一个特殊的函数 sticky() 可以在这种情况下提供帮助。

编辑:我附上新版本的 jsfiddle .

一些功能现在开始工作了。由随机数据驱动的转换很漂亮。

我现在有两个问题:

  1. 我不知道如何更新工具提示。这很重要,用户应该能够通过工具提示识别数据点。另一方面,好处是它们不需要在过渡期间进行插值,突然变化就足够了,但我不知道该怎么做。
  2. 我真的不明白代码。编码主要是试错过程。如果有人验证代码是好的,或者可能不好,或者它可能不同,我将不胜感激。

编辑 2:我解决了问题,如果有人需要代码,我会在答案中附上 jsfiddle。仍然欢迎大家对解决方案发表评论。

enter image description here

代码中最关键的部分,似乎是:

function updateVis() {
// change pack value
if (updateMethod == 0)
pack.value(function(d) { return d.size; });
if (updateMethod == 1)
pack.value(function(d) { return 100; });
if (updateMethod == 2)
pack.value(function(d) { return 1 + Math.floor(Math.random()*101); });

var data1 = pack.nodes(data);

// titles = ?????

circles.transition()
.duration(2000)
.attr("cx", function(d) { return d.x; })
.attr("cy", function(d) { return d.y; })
.attr("r", function(d) { return d.r; });
return;
};

在此先感谢您的帮助或提示。

最佳答案

看来我终于解决了所有问题。 jsfiddle 是 here .

这是处理圆包布局平滑过渡的全部代码(数据定义和按钮创建除外):

var diameter = 500,
format = d3.format(",d"),
dataSource = 2;
var pack = d3.layout.pack()
.size([diameter - 4, diameter - 4])
.value(function(d) { return d.size; });
var svg = d3.select("body").append("svg")
.attr("width", diameter)
.attr("height", diameter);

var data = getData();

var vis = svg.datum(data).selectAll(".node")
.data(pack.nodes)
.enter()
.append("g");

var titles = vis.append("title")
.attr("x", function(d) { return d.x; })
.attr("y", function(d) { return d.y; })
.text(function(d) { return d.name +
(d.children ? "" : ": " + format(d.value)); });

var circles = vis.append("circle")
.attr("stroke", "black")
.style("fill", function(d) { return !d.children ? "tan" : "beige"; })
.attr("cx", function(d) { return d.x; })
.attr("cy", function(d) { return d.y; })
.attr("r", function(d) { return d.r; });

updateVis();

function updateVis() {

if (dataSource == 0)
pack.value(function(d) { return d.size; });
if (dataSource == 1)
pack.value(function(d) { return 100; });
if (dataSource == 2)
pack.value(function(d) { return 1 +
Math.floor(Math.random()*301); });

var data1 = pack.nodes(data);

titles.attr("x", function(d) { return d.x; })
.attr("y", function(d) { return d.y; })
.text(function(d) { return d.name +
(d.children ? "" : ": " + format(d.value)); });

circles.transition()
.duration(5000)
.attr("cx", function(d) { return d.x; })
.attr("cy", function(d) { return d.y; })
.attr("r", function(d) { return d.r; });
};

关于svg - Circle-packing diagram - 两组值之间的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20814073/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com