- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一张用 D3 制作的旭日图。每个“花瓣”代表一个数据子集。当用户点击其中一个“花瓣”时,我希望它进行转换,散开以仅显示该子集(见图):
我无法让代码正确转换。
单击时,所有“花瓣”(除了选定的花瓣)都应消失,其余路径应沿圆圈设置动画(使用 attrTween、arcTween 和插值?)。将要更改的主要值是 angleSize(var angleSize = (2 * Math.PI)/theData.length;
)。
我试过使用 this , this , this , 和 this作为引用没有太大的成功。处理动画的最佳方式是什么?
感谢您的宝贵时间!
--> 参见 Plunker Here . <--
代码如下:
var colors = {
'Rank1' : '#3FA548',
'Rank2' : '#00B09E',
'Rank3' : '#8971B3',
'Rank4' : '#DFC423',
'Rank5' : '#E74341'
};
var $container = $('.chart'),
m = 40,
width = $container.width() - m,
height = $container.height() - m,
r = Math.min(width, height) / 2;
var study = null;
var arc = d3.svg.arc();
d3.csv('text.csv', ready);
function ready(err, data) {
if (err) console.warn('Error', err);
var svg = d3.select('.chart')
.append('svg')
.attr({
'width' : (r + m) * 2,
'height' : (r + m) * 2,
'class' : 'container'
})
.append('g')
.attr('transform', 'translate(' + (width / 4) + ', ' + (height / 2) + ' )');
var slice = svg.selectAll('.slice');
function updateChart(study) {
if (study) {
var theData = data.filter(function(d) {
return d.study_name === study;
});
} else {
var theData = data;
}
slice = slice.data(theData);
slice.enter()
.append('g')
.attr('class', 'slice');
var angleSize = (2 * Math.PI) / theData.length;
var startRadArr = [],
endRadArr = [];
for ( var i = 0; i < data.length; i++ ) {
var startRadius = (width / 20),
endRadius = startRadius;
for ( var x = 0; x < 4; x++ ) {
startRadArr.push(startRadius);
if ( x == 0 ) {
endRadius += Number(data[i].group1_score) * (width / 500);
} else if ( x == 1 ) {
endRadius += Number(data[i].group2_score) * (width / 500);
} else if ( x == 2 ) {
endRadius += Number(data[i].group3_score) * (width / 500);
} else {
endRadius += Number(data[i].group4_score) * (width / 500);
}
endRadArr.push(endRadius);
startRadius = endRadius + 0.3;
}
}
var startRadGroup = [],
endRadGroup = [];
for (i = 0; i < startRadArr.length; i += 4) {
startRadGroup.push(startRadArr.slice(i, i + 4));
}
for (i = 0; i < endRadArr.length; i += 4) {
endRadGroup.push(endRadArr.slice(i, i + 4));
}
slice.selectAll('path')
.remove();
for ( var x = 0; x < 4; x++ ) {
slice.append('path')
.attr({
'class' : function(d, i) {
if ( x == 0 ) {
return d.group1_class;
} else if ( x == 1 ) {
return d.group2_class;
} else if ( x == 2 ) {
return d.group3_class;
} else {
return d.group4_class;
}
},
'company' : function(d, i) {
return d.brand_name;
},
'cat' : function(d, i) {
if ( x == 0 ) {
return 'Group1';
} else if ( x == 1 ) {
return 'Group2';
} else if ( x == 2 ) {
return 'Group3';
} else {
return 'Group4';
}
},
'study' : function(d, i) {
return d.study_name;
},
'companyid' : function(d, i) {
return d.brand_id;
},
'startradius' : function(d, i) {
return startRadGroup[i][x];
},
'endradius' : function(d, i) {
return endRadGroup[i][x];
},
'startangle' : function(d, i) {
return angleSize * i;
},
'endangle' : function(d, i) {
return angleSize * (i + 1);
}
})
.on('click', selectStudy);
}
slice.exit()
.remove();
slice.selectAll('path')
.attr({
'd' : function(d) {
return arc({
innerRadius : +d3.select(this)[0][0].attributes.startradius.nodeValue,
outerRadius : +d3.select(this)[0][0].attributes.endradius.nodeValue,
startAngle : +d3.select(this)[0][0].attributes.startangle.nodeValue,
endAngle : +d3.select(this)[0][0].attributes.endangle.nodeValue
})
}
});
}
function selectStudy(d) {
study = $(this).attr('study');
updateChart(study);
}
updateChart();
}
编辑
更新了代码(基于 this )以包含正常工作的进入、更新和退出模式。但是仍然不确定过渡。我链接的大多数示例使用类似于 d3.interpolate(this._current, a);
的东西,在不同数据之间进行补间。
在这个图表中,this._current和a是一样的,angleSize(var angleSize = (2 * Math.PI)/theData.length;
),startAngle,endAngle是唯一的那改变了。
最佳答案
你的问题是你并没有真正将数据绑定(bind)到元素,因此转换是不可能的。我稍微修改了您的代码,以便数据包含有关起始 Angular 和结束 Angular 的所有嵌套信息,以便它可以绑定(bind)到每个切片内的路径。
看看这个 Plunker:https://plnkr.co/edit/a7cxRplzy66Pc1arM2a9?p=preview
修改后的版本列表如下:
var colors = {
Rank1: '#3FA548',
Rank2: '#00B09E',
Rank3: '#8971B3',
Rank4: '#DFC423',
Rank5: '#E74341'
};
// Configuration
var $container = $('.chart'),
m = 40,
width = $container.width() - m,
height = $container.height() - m,
r = Math.min(width, height) / 2;
var study = null;
var arc = d3.svg.arc();
// Load data
d3.csv('text.csv', ready);
// Data loaded callback
function ready(err, data) {
if (err) console.warn('Error', err);
var svg = d3.select('.chart')
.append('svg')
.attr({
'width': (r + m) * 2,
'height': (r + m) * 2,
'class': 'container'
})
.append('g')
.attr('transform', 'translate(' + (width / 4) + ', ' + (height / 2) + ' )');
var slices = svg.selectAll('.slice');
function updateChart(study) {
var theData = data;
if (study) {
theData = data.filter(function (d) {
return d.study_name === study;
});
}
var angleSize = (2 * Math.PI) / theData.length;
theData.forEach(function (item, i) {
var startRadius = (width / 20),
endRadius = startRadius,
groupName;
item.paths = [];
for (var g = 0; g < 4; g++) {
item.paths[g] = {};
item.paths[g].startRadius = startRadius;
groupName = 'group' + (g + 1) + '_score';
endRadius += Number(item[groupName]) * (width / 500);
item.paths[g].endRadius = endRadius;
startRadius = endRadius + 0.3;
}
});
// Set the data
slices = slices.data(theData);
// Enter
slices.enter()
.append('g')
.attr('class', 'slice');
// Exit
slices.exit()
.remove();
// Update
slices
.transition()
.duration(750)
.each(function (dSlice, iSlice) {
var slice = d3.select(this);
var paths = slice.selectAll('path');
// Set data
paths = paths.data(dSlice.paths);
// Exit
paths.exit()
.remove();
// Enter
paths.enter()
.append('path')
.attr('class', 'path');
// Update
paths
.transition()
.attr({
'class': function (d, i) {
return dSlice['group' + (i + 1) + '_class'];
},
'company': dSlice.brand_name,
'cat': function (d, i) {
return 'Group' + (i + 1);
},
'study': function (d, i) {
return dSlice.study_name;
},
'companyid': function (d, i) {
return dSlice.brand_id;
},
'startradius': function (d, i) {
return d.startRadius;
},
'endradius': function (d, i) {
return d.endRadius;
},
'startangle': function (d, i) {
return angleSize * iSlice;
},
'endangle': function (d, i) {
return angleSize * (iSlice + 1);
},
'd': function (d) {
return arc({
innerRadius: +d.startRadius,
outerRadius: +d.endRadius,
startAngle: +angleSize * iSlice,
endAngle: +angleSize * (iSlice + 1)
})
}
})
.duration(750);
paths.on('click', selectStudy);
});
function selectStudy(d, i) {
study = $(this).attr('study');
updateChart(study);
}
}
updateChart();
}
如您所见,关键是正确准备数据(假设您的示例 .tsv
文件中的格式不是最佳选择,但有时我们无法选择数据源。 ..)
然后,通过将用于路径生成的代码放在切片上的 .each
调用中,可以从 function (d, i) { ...
回调,每个元素恰好接收到相应的数据。
另一个技巧是在路径的回调中使用切片数据(通过 dSlice
和 iSlice
变量在 .each
函数中访问) .这样,路径可以出于自己的目的使用此数据。在本例中,company
和 study_name
属性。
现在为了调整过渡并使其更准确,起始属性可以更改。您可以尝试在 .enter()
阶段为路径设置一些属性。
关于javascript - D3 - Sunburst 图中的过渡弧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39024805/
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 9 年前。 Improve this q
半径为r的圆上的点p(x,y)与圆心O(x0,y0)的关系: x = x0+rcosA; y = y0+rsinA ,A为弧度 1、圆 复制代码 代码如下:
我正在尝试找到一种方法来计算两条弧线之间的交点。我需要用它来确定在视觉上圆弧的右半边有多少,左边有多少。我考虑创建右半部分的弧线,并将其与实际弧线相交。但是我花了很多时间来解决这个问题,所以我想在这里
这听起来可能是一个新手问题,但我是 iOS 开发新手。 我在我的项目中跟踪了代码,该项目启用了 ARC,但我在执行时遇到错误(访问错误),并且想了解问题的原因并解决它。 按下某些按钮后,将在 MTCl
我想使用圆弧连接两个 SVG 点(例如两个圆的中心)。如果只有一个连接,则线 ( ) 将是一条直线。如果有两个连接,则两者都将是圆形的并且是对称的,这样: 所以,事实上,有一些规则: 一切都应该与连
我正在尝试实现多级饼图 我的初始代码在这里:JSFIDDLE var departments = [ { "name": "Sales", "color": "green",
我想在我的布局中制作一个弧形 View ,我尝试使用一个库但它不能正常工作,我如何制作这样的拱形 View 并在其上附加一个按钮,例如: 我尝试了一些代码,但它们在平板电脑和不同尺寸的屏幕上无法正常显
我有点 X 和 A, A',... 坐标: X [x,y](是起点) A [a,b], A'[a',b']等(是终点) 我还知道 Angular XCA、XCA'等 我找不到计算弧的公式,类似于图片上
我有一个 ViewController,它从 CoreData 获取对象并用它们构建一个 UITableView。当用户按下一行时,我得到报告文学对象并使用以下方法将其传递给下一个 View Cont
我有一个带有弧形的 Canvas ,里面有一些标签。 这是 fiddle 链接 - Fiddle下面是代码: var canvas = document.getElementById("myC
如何使用 css 创建这样的 Angular 弧? 这是入门模板:https://codepen.io/anon/pen/rwraXG 我希望我能够使用黑色外部 div 和红色内部 div,并使用边框
只是想完全理解 ARC。 MyView *testView = [[MyView alloc] init]; __weak MyView *weakView = testView; [weakView
假设我有一条线,我想为这条线设置动画,首先线是隐藏的,经过一点一点的线出现并完成后,我的问题是在 Android 中可以做到这一点还是我必须使用 Adobe After Effect? 更新 :
更新:2013 年 11 月 20 日:此问题仍未解决。 我正在尝试在自定义 View 中以动画方式创建圆圈。我想制作圆周的动画 - 在动画开始时有一个圆弧,在动画结束时圆是完整的。 我按照这个答案成
This is a basic code to create a pie chart for protocol distribution. In my .csv file, I have two co
我有一个 NSArray 对象,在我的 UIViewController 中使用。我可以将其声明为 ivar 或属性。这两种方法都有什么优点(考虑到我使用的是 ARC)? 选项 1: @interfa
此刻 Canvas 以不同的速度和大小绘制 15 个从 ltr 移动的圆圈。当其中一个离开窗口时,它将被设置为开始。问题是 Canvas 在圆圈之间画线,我不知道为什么?有人可以帮忙吗? window
我最近在这里和其他网站上阅读了很多关于 IBOutlets 应该强还是弱的文章。官方判定它们应该是弱的,除非它们引用顶级 xib 对象。 这很好。 然而,我还不清楚为什么将它们设置为强或弱实际上会对应
我有一个 CIImage,我正试图在鼠标沿路径拖动时画线。我可以这样做吗? 我正在为 mac 构建一个应用程序,我是 Core Image 的新手。 最佳答案 您需要先创建一个图形上下文,然后从中检索
我有一个使用 CAShapeLayer 绘制的圆弧,我希望它围绕圆的中心旋转。我正在尝试使用“transform.rotation”属性上的 CABasicAnimation 来获取此动画。但是旋转似
我是一名优秀的程序员,十分优秀!