- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在从包含 1955 年到 2012 年选定国家/地区的 GDP 的谷歌电子表格加载数据。我想从中绘制一个树状图。到目前为止一切顺利。
我已经通过内部链接加载数据并将其格式化为 d3 可以处理的对象,然后在屏幕上绘制布局 - 一切都很好。我以 Mike Bostock 教程为基础,网址为 http://bl.ocks.org/mbostock/4063582。 .
当我尝试从 1955 年到 2010 年的一组数据转换时,问题就来了。我确信我用来生成树状图布局的函数正在运行,因为初始显示是正确的。我将一个日期传递给它,它会创建 TreeMap 结构。
但是,当我触发更改时,似乎会发生转换,并且各个方 block 的大小也会发生变化。但是当我检查它们时,我意识到它们都是错误的,而且我似乎将新的值(value)集映射到了错误的国家。
新结构看起来是正确的,但所有的名字都是错误的。所以我得到了像塞浦路斯这样的东西,它在 2012 年拥有最大的 GDP。就好像我有一个按字母顺序排列的列表,它有另一组按数量级排列的值应用于而不是说美国的新值被映射到旧值。
因为我还是 d3 的新手,所以在这里兜圈子,所以非常感谢所有帮助。
代码如下所示:
/*global app:true JST:true d3:true*/
(function (window, $) {
'use strict';
var menuItems = [];
var menuType='measure';
var checboxItems= ['advanced','emerging'];
var ddID = '0';
var model=[];
var yearValue="2012"
var group="gdp";
var treeStruc={
name:[],
children:[]
}
var margin = {top: 25, right: 5, bottom: 5, left: 5},
width = 965 - margin.left - margin.right,
height = 650 - margin.top - margin.bottom;
var color = d3.scale.category10();
app.spreadsheet.get(function (data) {
// TODO: process the data
menuItems = data.measures
//console.log(data);
//console.log('menuItems', menuItems);
//crete dropdown and use toggle to swich display on and off
$('#dropDown').click(function () {
$('ul.ddMenuList').toggle();
});
//populate the dropdown menu
for (var k = 0; k <menuItems.length; k++) {
$('#ddList').append('<li id="dd_' + k + '"><a href="#">'+menuItems[k].menulist +'</li>');
};
//add functionality to dropDown menu
$('#ddList li').bind('click', function () {
ddID = this.id.split('_')[1];
var text = $(this).text();
//console.log ("ID=",ddID);
//console.log (text, "Measure=",menuItems[ddID].type);
$('#ddTitle').empty();
$('#ddTitle').append(text);
createCheckboxes()
});
function createCheckboxes() {
//decide which check boxes to populate
if (menuItems[ddID].type==="measure") {
group=menuItems[ddID].type
checboxItems=[];
$.each(menuItems, function (i) {
if (menuItems[i].type==="group"){
checboxItems.push (menuItems[i].checkbox);
}
//console.log (checboxItems);
});
}
else {
group=menuItems[ddID].type
checboxItems=[];
$.each(menuItems, function (i) {
if (menuItems[i].type==="measure"){
checboxItems.push (menuItems[i].checkbox);
}
//console.log (checboxItems);
});
}
//Populate the check boxes
console.log ("Populating check boxes");
$('#cbHolder').empty();
$('#cbHolder').append('<form>');
$.each(checboxItems, function (i) {
$('#cbHolder').append('<input type="checkbox" id="cb_'+i+'">'+checboxItems[i]);
$('#cbHolder').append('</form>');
//console.log ("checkboxItems",checboxItems[i]);
});
changed3 ()
}
//creates an object containing just the advanced countries
treeStruc={name:[],children:[]};
console.log ("group=",group);
$.each(checboxItems, function (k) {
console.log("Parent",checboxItems[k])
model=jQuery.grep(data.stats,function(e,i){return e[checboxItems[k]];});
console.log('model', model);
treeStruc.children.push({"name":checboxItems[k],"children":[]});
//Construct the children of 1 big group to be completed to be updated for each sheet
$.each(model, function (i) {
treeStruc.children[k].children.push({'name':model[i].countryname,'size':model[i] [group]});
});
});
console.log('treeStruc', treeStruc)
Handlebars.createOptionsHelper(data.options);
drawd3 ();
});
function generateTreemapLayout(filter){
return d3.layout.treemap()
.size([width, height])
.sticky(true)
.value(function(d) {
if(d.size[filter] < 0){
return 0;
}
return d.size[filter];
});
}
function drawd3() {
console.log ("function drawd3");
var treemap = generateTreemapLayout('y'+yearValue)
var div = d3.select("#d3Object").append("div")
.style("position", "relative")
.style("width", (width + margin.left + margin.right) + "px")
.style("height", (height + margin.top + margin.bottom) + "px")
.style("left", margin.left + "px")
.style("top", margin.top + "px");
var node = div.datum(treeStruc).selectAll(".node")
.data(treemap.nodes)
.enter().append("div")
.attr("class", "node")
.call(position)
.attr("id",function(d){
return d.name;
})
.style("background", function(d) { return d.children ? color(d.name) : null; })
.text(function(d) { return d.children ? null : d.name; });
};
function position() {
this.style("left", function(d) { return d.x + "px"; })
.style("top", function(d) { return d.y + "px"; })
.style("width", function(d) { return Math.max(0, d.dx - 1) + "px"; })
.style("height", function(d) { return Math.max(0, d.dy - 1) + "px"; });
}
function changed3() {
console.log ("function changed3");
//make a new treemap layout
var treemap = generateTreemapLayout('y'+1955);
console.log('treeStruc',treeStruc);
//redraw the treemap using transition instead of enter
var node = d3.select("#d3Object")
.datum(treeStruc).selectAll(".node")
.data(treemap.nodes)
.transition()
.duration(1500)
.call(position)
}
}(this, jQuery));
最佳答案
非常感谢我的同事 Tom Pearson。问题在于数据绑定(bind)到页面上的项目的位置。当您重新绘制树形图时,因为数据未绑定(bind)到具有唯一标识符(如对象名称)的 div,它会将数据重新映射到列表的第一项。这意味着像中国这样的东西得到了比利时的信息。简单的解决方案如下代替
.data(treemap.nodes)
使用
.data(treemap.nodes,function(d){
return d.name;
})
原始 drawd3 函数中有两个 this 实例,它们在 changed3 函数中。希望能帮助任何遇到类似问题的人
关于javascript - d3.js 中的过渡 TreeMap ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18760437/
由于内容高度不同,我正在使用过渡最大高度而不是高度的技术,但我遇到了问题。 在增长或收缩的元素内,我有一个溢出的绝对定位元素,我想在父元素展开时显示该元素。 问题是如果我只在元素没有展开的时候设置ov
我正在用 CSS 制作一个表格,上面会有一些有趣的动画。单击文本字段时,它应该展开,但除此之外,它还应该使它旁边的按钮移动。谁能看到一个简单的方法来做到这一点?我在这里包含了代码: .inpu
我想在将鼠标悬停在按钮/div 标记上时仅使用 CSS3 过渡更改页面的背景颜色。我希望颜色逐渐出现,因此想使用过渡效果,但我不知道如何将页面的背景颜色与 div 上的悬停事件相关联。有人可以帮我处理
我这里有这个页面(进行中)http://kimwilddesigns.com/index_new.htm 在本节中,我希望能够将鼠标悬停在 li 上,使背景图像淡出并使 h2 淡入。这是否可以通过过渡
我的 CSS 有点问题。我正在看一本书学习 CSS3,我刚刚发现了 Transition 函数。所以我决定尝试一下,我想不出我错在哪里,希望你能帮助我。 这是我的 Index.html 文件
我正在尝试使使用 background-image 设置的背景图像随着页面变窄而淡出。我很确定它可以使用 CSS 转换来完成,但我对它们相当不熟悉。我想我想问的是,你能根据媒体查询将背景图片转换出来吗
有没有办法在 PyQt 中将过渡颜色作为背景?我尝试使用 CSS 的线性渐变,但不起作用 stylesheet = ("QWidget { background-color : linear-grad
我有这段代码,可以在一定的延迟后切换图像的不透明度: $(".pattern-overlay").css("background","black").delay(2000).queue(functio
我还在学习 jQuery,我现在想做的就是结合 html()带有过渡的方法(例如 hide() 和 show() ),以便更改具有过渡效果的 div 的 html。这是我尝试过的: $('div.co
我有一个链接列表和一些内容部分 ORANGE BLUE PINK GREEN gfgfgfgf gfgfgfgf gfgfgfgf gfgfgfgf 每个链接对应
我不想从 JS 触发 CSS 动画,而是相反。 如果我通过 -webkit-transition 或 transition: all 1000ms 类型的样式表做 CSS 动画,有没有办法在转换后触发
我想用节点的“宽度”制作动画。 在本例中,我的节点是“AnchorPane”。 我尝试在javafx中制作一个抽屉导航。 没有属性“width Property()”? new Key Value (
这是一个简单的设置,其中使用 left 属性将盒子向右移动。通过单击按钮更新该属性。为什么我第一次点击按钮时没有应用过渡动画? document.addEventListener('DOMConten
我是安卓开发的新手。我想创建一个带有两个 TextView 的启动画面。在此初始屏幕中,我想要两个转换 1) Text View 1 从顶部到中心的过渡2) text View 2 从底部到中心的过渡
我有三个 fragment ,F1、F2 和 F3。 在 F1 到 F2 转换并返回到 F1 的情况下,不会调用 F1 的 onCreateView()。 但在 F1 到 F3 转换并返回到 F1 的
我正在为我的应用程序使用扩展导航栏,将其高度增加 30 点。为此,我对 UINavigationBar 进行了子类化,这是我的 CustomNavigationBar.m: CGFloat Custo
我在下面创建了 jQuery 脚本,但是在将它转换为最好仅使用过渡的 CSS 时遇到了一些问题。如果有人可以帮助我,我会很高兴。 下面示例的解释: - 当你点击文本框时,一个空的 div 容器会掉下来
我有一个盒子,点击它会翻转。里面还有一张悬停时放大的图片,如图 fiddle 所示。 . 问题是当我将鼠标移出或放回时,隐藏的图像上的缩放过渡会短暂显示。 My attempt修复它: #box.fl
div 自己移动,我什至不想要也没有编写代码的移动。 这是我的问题: 我正在使用这样的 CSS 转换(想要移动背景图片): .mobile{ background: url(../img/galaxy
我知道如何进行淡入淡出的 CSS 过渡,但是否有解决方案可以从上到下淡出? 这是我的代码 .navbar-default{ -webkit-transition: all 0.5s ease;
我是一名优秀的程序员,十分优秀!