我一直在研究 circle pack sample .但是,我在尝试从一组新的 JSON 数据更新事物并在之后刷新它时遇到了很多麻烦。
我的代码只是 circle pack 示例的修改版本:
var diameter = 960,
format = d3.format(",d");
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)
.append("g")
.attr("transform", "translate(2,2)");
var node;
d3.json("data1.json", function(error, root) {
node = svg.datum(root).selectAll(".node")
.data(pack.nodes);
node.enter().append("g")
.classed("node", true)
.attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; });
node.append("title")
.text(function(d) { return d.name; });
node.append("circle")
.attr("r", 0)
.on("click", refresh)
.transition()
.duration(2000)
.attr("r", function(d) { return d.r; });
node.append("text")
.attr("dy", ".3em")
.style("text-anchor", "middle")
.text(function(d) { return d.name });
node.exit()
.remove();
});
d3.select(self.frameElement).style("height", diameter + "px");
这按预期工作。但是,我想执行从新的 JSON 数据更新图表并刷新的刷新功能。我已经尝试了下面的代码,但它只是添加了新元素而不是更改旧元素 - 并且也没有删除旧元素(node.exit.remove() 显然从不运行)。我想知道这是否与使用“数据”而不是“数据”有关,以及是否在这方面实际进行了数据连接:
var refresh = function() {
d3.json("data2.json", function(error, root2) {
node = svg.datum(root2).selectAll(".node")
.data(pack.nodes);
node.append("title")
.text(function(d) { return d.name; });
node.append("circle")
.attr("r", 0)
.transition()
.duration(2000)
.attr("r", function(d) { return d.r; });
node.append("text")
.attr("dy", ".3em")
.style("text-anchor", "middle")
.text(function(d) { return d.name });
});
}
我很难弄清楚数据实际上是如何绑定(bind)到包上的,以及如何更新它。我可能再次遗漏了一些简单的东西,但我将不胜感激任何帮助,因为我很难找到说明这一点的示例。如果有人能在这里帮助我,我会很乐意将来为其他人制作一个。 :)
郑重声明,我使用的数据是这样的:
{
"name": "Names",
"children": [
{ "name": "John", "size": 100 },
{ "name": "Peter", "size": 200 },
{ "name": "Arnold", "size": 300 },
{ "name": "Rasmus", "size": 400 }
]
}
和
{
"name": "Names",
"children": [
{ "name": "John", "size": 1000 },
{ "name": "Rasmus", "size": 200 },
{ "name": "Benjamin", "size": 300 },
{ "name": "James", "size": 400 }
]
}
最佳答案
我很难理解这些包是如何工作的。显然,您只需向他们发送一个数据集,他们就会返回一个可用于绑定(bind)的新数据集。比我想象的要简单得多。这个解决方案有效,我认为大多数人应该能够从这里继续:
var diameter = 960,
format = d3.format(",d");
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)
.append("g")
.attr("transform", "translate(2,2)");
var node;
var currentJson;
var currentUrl = "data1.json";
var getNewData = function() {
if(currentUrl == "data1.json") {
currentUrl = "data2.json";
}
else {
currentUrl = "data1.json";
}
d3.json(currentUrl, function(error, data) {
currentJson = data;
refresh();
});
}
var refresh = function() {
node = svg.selectAll(".node")
.data(pack.nodes(currentJson));
node.enter().append("g")
.classed("node", true)
.attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; })
.append("circle")
.attr("r", 0)
.on("click", getNewData)
.transition()
.duration(2000)
.attr("r", function(d) { return d.r; });
node.transition()
.duration(2000)
.attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; });
node.select("circle")
.transition()
.duration(2000)
.attr("r", function(d) { return d.r; });
}
d3.select(self.frameElement).style("height", diameter + "px");
getNewData();
关于javascript - 从 JSON 调用和重绘更新包布局的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18790941/
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这
我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
我需要一些关于TDD概念的帮助。假设我有以下代码defexecute(command)casecommandwhen"c"create_new_characterwhen"i"display_inventoryendenddefcreate_new_character#dostufftocreatenewcharacterenddefdisplay_inventory#dostufftodisplayinventoryend现在我不确定要为什么编写单元测试。如果我为execute方法编写单元测试,那不是几乎涵盖了我对create_new_character和display_invent
是否可以为特定(或所有)项目使用多个布局?例如,我有几个项目,我想对其应用两种不同的布局。一个是绿色的,一个是蓝色的(但是)。我想将它们编译到我的输出目录中的两个不同文件夹中(例如v1和v2)。我一直在玩弄规则和编译block,但我不知道这是怎么回事。因为,每个项目在编译过程中只编译一次,我不能告诉nanoc第一次用layout1编译,第二次用layout2编译。我试过这样的东西,但它导致输出文件损坏。compile'*'doifitem.binary?#don’tfilterbinaryitemselsefilter:erblayout'layout1'layout'layout2'
我有一个非常简单的RubyRack服务器,例如:app=Proc.newdo|env|req=Rack::Request.new(env).paramspreq.inspect[200,{'Content-Type'=>'text/plain'},['Somebody']]endRack::Handler::Thin.run(app,:Port=>4001,:threaded=>true)每当我使用JSON对象向服务器发送POSTHTTP请求时:{"session":{"accountId":String,"callId":String,"from":Object,"headers":
我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_