我正在为项目构建数据仪表板,并且希望能够比较同一数据集中两个不同组的数据。
我的数据集如下:
Number,Name,Gender,Race,Height,Publisher,Alignment,Weight,Superpower,Strength,Costume Colour
1,A-Bomb,Male,Metahuman,203,Marvel Comics,Good,441,Superhuman Strength,10,None
2,Abin Sur,Male,Alien,185,DC Comics,Good,90,Cosmic Power,40,Green
3,Abomination,Male,Metahuman,203,Marvel Comics,Bad,441,Superhuman Strength,10,None
4,Abraxas,Male,Cosmic Entity,1000,Marvel Comics,Bad,1000,Reality Warping,40,Green
5,Absorbing Man,Male,Metahuman,193,Marvel Comics,Bad,122,Matter Duplication,5,None
6,Adam Strange,Male,Human,185,DC Comics,Good,88,None,0,Red
我想创建两个单独的selectMenus
,其中列出了字符名称,但是两个菜单中的每一个都按Publisher
名称进行过滤。
因此,一个下拉列表将具有与Marvel Comics
关联的所有字符,而另一个下拉列表将具有与DC Comics
关联的所有字符。
设置好之后,我们的想法是仪表板可以显示一组图形,这些图形可以作为已选择的两个字符之间的比较-因此,我不希望将整个数据集分开,我只希望选择内容由发布服务器过滤。
我经历过数十个关于类似内容的不同Stack Overflow线程,但是仍然很挣扎。我已经为角色名称和角色发布者创建了尺寸,但是我真的迷失了尝试使用其中一个来过滤另一个。
到目前为止,这就是我所要做的(忽略服装颜色的东西,这是为了更远的地方)-“ heroes-information.csv”中的数据与我上面共享的格式相同。
// Bring in data from csv files
Promise.all([d3.csv("../data/heroes-information.csv"), d3.csv("../data/costume-colors.csv")])
.then(function(data) {
// Tidy data before use
data.forEach(function(d) {
d.Height = +d.Height;
d.Weight = +d.Weight;
d.Strength = +d.Strength;
});
// Bring in Heroes data
var ndx = crossfilter(data[0]);
// Bring in costume color data
var ndxcol = crossfilter(data[1]);
// Create colorScale to dynamically color pie chat slices
var colorScale = d3.scaleOrdinal()
.domain(data[1].map(row => row.Name))
.range(data[1].map(row => row.RGB));
// Define chart type
var dccomicsSelector = dc.selectMenu('#dccomics-selector');
// Define chart dimension
var character = ndx.dimension(dc.pluck('Name'));
var characterPublisher = ndx.dimension(dc.pluck('Publisher'));
var dccomicsCharacters = character.group();
var dccomicsPublisher = characterPublisher.group();
dccomicsSelector
.dimension(character)
.group(dccomicsCharacters);
dc.renderAll();
});
我可能会错过一些确实很明显的东西,但是我对DC.js和Crossfilter还是很陌生,因此在使用它的过程中有些失落,任何帮助将不胜感激!