【问题标题】:Creating multiple column dimension from csv从 csv 创建多列维度
【发布时间】:2017-03-29 16:05:42
【问题描述】:

我正在尝试使用 csv 文件中的多个列制作饼图,我可以制作饼图,但它只使用最后一个值 d.gre。我做错了什么?

代码如下

d3.csv("elecVotes.csv", function (data) {

var ndx = crossfilter(data);
var partysDim = ndx.dimension(function(d) { return +d.rep, +d.dem, +d.lib, +d.ind, +d.gre;})
var partys = partysDim.group();

var pie = dc.pieChart('#chart-pie');

pie
    .width(180)
    .height(180)
    .radius(80)
    .dimension(partysDim)
    .group(partys)
    .renderLabel(true)
    .innerRadius(10)
    .transitionDuration(500)
    .colorAccessor(function (d, i) { return d.value; });

    dc.renderAll();
});

electVotes.csv

state, rep,dem,lib,ind,gre Alabama,1314431,725704,44211,20276,9341 New York,5655,54444,65666,2355,12225 Texas,4355,543234,12321,12331,45644

【问题讨论】:

  • 您可能需要转换您的数据,以便为 Crossfilter 提供更好的结构。你能分享一些示例数据吗?我将能够建议一个适合您的转换。一个工作示例会特别有用,但在这里并不完全必要。
  • state, rep,dem,lib,ind,gre Alabama,725704,44211,20276,9341 这是我正在使用的当前数据,我想实现这一点,以便当我点击地图上的州时,它会根据点击的州更新
  • @EthanJewett 我已经用一些示例数据更新了这个

标签: dc.js crossfilter


【解决方案1】:

Gordon 的建议应该可行,但我也敦促您考虑预先将数据转换为更合适的格式。当使用许多不同的工具时,它将以多种方式使您的生活更轻松。具体来说,您需要将文件转换为只有三列:State、Party 和 Votes。如果您在 Excel 中维护此数据,请在此处进行。或者你可以在你加载的文件上运行它:

var newData = []
data.forEach(function(d) {
  newData.push({state: d.state, party: 'rep', votes: d.rep})
  newData.push({state: d.state, party: 'dem', votes: d.dem})
  newData.push({state: d.state, party: 'lib', votes: d.lib})
  newData.push({state: d.state, party: 'ind', votes: d.ind})
  newData.push({state: d.state, party: 'gre', votes: d.gre})
})
data = newData

那么您的 Crossfilter 维度和组创建将如下所示:

var ndx = crossfilter(data);
var partysDim = ndx.dimension(function(d) { return d.party;})
var partys = partysDim.group().reduceSum(function(d) { return d.votes;});

同样,这是处理相同问题的另一种方法。我认为预先以正确的方式组织数据会带来很大的回报,因此我通常建议先完成这项工作,然后保持 Crossfilter/dc.js 代码简洁明了。

【讨论】:

  • 谢谢你,我不知道如何正确组织我的数据,现在这更有意义了。我正在研究从数据库中学到的东西,不想拥有冗余数据。干杯。
  • 酷 - 是的,重度标准化不利于分析。很多教学都告诉我们,更多的规范化总是更好,并且您至少需要第 3 范式,但这是一个非常关注传统面向行的 RDBMS 系统上的事务工作负载的视图。它不支持不同类型的数据库系统(Crossfilter 有点像列式引擎)和工作负载。对于分析,您通常希望优先考虑具有尽可能少的度量列的高表。
  • 只是出于兴趣,如果我想添加另一列数据,比如每个州的 ElecVotes,我应该只添加另一列并只输入一个数据条目吗?或每个阿尔巴马实体一个。
  • 这是elecVotes = rep + dev + lib + ind + gre 还是完全不同的东西?
  • 这将是一个名为 elec votes 的全新列,其中包含每个州的选举人票数量
【解决方案2】:

这里有几个问题。在 JavaScript 级别,逗号“运算符”只计算逗号的两边并返回第二个。所以

的值
1,2,3,4,5

只是5。这解释了你目前得到的结果。

另一个问题更具概念性。交叉过滤器并非旨在显示组中的每一列。我认为主要原因是无法按政党过滤,因为每个地区或州对每个政党都有价值观。您需要选民级别的数据才能按政党进行过滤。

鉴于此限制,您肯定无法通过单击饼图进行过滤。但是,只需稍加工作,您就可以让饼图将列总和显示为组的 bin。

正如 Ethan 所说,也许转换数据会更好,但 this answer shows how to produce a group which rotates the data on the fly

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-04
    • 1970-01-01
    • 2011-08-24
    • 2015-09-01
    • 1970-01-01
    • 2017-02-19
    相关资源
    最近更新 更多