【问题标题】:d3 seems to assume I know the column names of a csv?d3 似乎假设我知道 csv 的列名?
【发布时间】:2013-02-13 19:50:27
【问题描述】:

我有生成的 csv 文件,我正在尝试将它们加载到 d3 中以绘制它们。列名是基于数据的,所以我基本上无法提前知道它们。通过测试,如果我知道列的名称,我可以加载这些数据并很好地绘制图表……但我的用例中没有。

如何在 d3 中处理这个问题?我似乎无法在网上或文档中找到任何可以帮助/参考的内容。当我从 d3.csv 登录到控制台数据 [0] 时,我可以看到有两列以及为它们读取的值,但我不知道如何在不知道的情况下任意引用数据的第 1 列或第 2 列列名提前。一般来说,我想避免这种情况,知道我的时间戳在第 1 列,我的数据在第 2 列,如果这有意义的话。

编辑,我的回答使用 d3.entries 来帮助了解未知列的名称,然后继续访问具有该索引的所有对象:

d3.csv("export.csv", function(error, data) {
    var mappedArray = d3.entries(data[0]);
    var valueKey = mappedArray[1].key;
    data.forEach(function(d) {
        ...
        d.value = d[valueKey];
    }
}

【问题讨论】:

    标签: javascript csv d3.js graphing


    【解决方案1】:

    您可以使用d3.entries() function 将关联数组转换为另一个数组,该数组包含一个关联数组,每个键值对都有keyvalue 键。

    【讨论】:

    • 太好了,谢谢。我现在看到我能够找到列的名称。不过,我还是 d3 的新手,我现在需要看看如何在其余代码中引用此列中的值,类似于示例引用“d.date”和“d.close”的方式,我现在需要使用我找到的变量列名来引用这些条目。这可能吗?我可以存储列的名称,但似乎无法以任何明智的方式通过该列名称访问数据。感谢您到目前为止的帮助
    • 听起来您应该将 csv 数组转换为更合适的数据结构,例如通过在其上映射一个函数,对于每个元素(即 csv 中的一行)获取整体并提取所需的元素。
    • 我不完全遵循我在 d3 中必须使用的内容。你明白我的问题是什么吗?一切都与 d3.csv 正常调用相同,除了我事先不知道列的名称,所以我只想将数据加载到我的 csv 并像以前一样绘制一个简单的折线图,但是已经学会了要做到这一点的第二列的名称。我想我可以用它给我的 d3.entries() 数组移动,我想?但我不确定,也不想浪费太多时间,如果这就是你现在要我尝试的意思。
    • 编辑,没关系。我只是个白痴,不知道我可以使用 [] 语法访问 JS 对象字段,所以我只保存列的名称并使用它访问对象。我会用我的更多答案更新帖子,并接受你的作为 99% 的工作。谢谢
    【解决方案2】:

    我使用 d3.entries() 如下:

    for(i=0;i<data.length;i++)
    {
        var temp = d3.entries(data[i]);
        for(j=0;j<temp.length;j++)
        if(temp[j].key == selectedx)
        myarray.push(temp[j].value);
    }
    

    希望这会有所帮助:)

    【讨论】:

    • selectedx 未定义。
    • 这是您正在使用的密钥。例如,我的数据包含许多列,我正在根据选定的 X 和 Y 值绘制图表。
    【解决方案3】:

    您可以像这样使用 D3 v3 values() method 获取键(列名):

    const [dataValues] = d3.values(data)
    const keys = Object.keys(dataValues)
    console.log(keys);
    

    【讨论】:

      【解决方案4】:

      很高兴你知道了,@cdietschrun。

      D3 版本 4 允许您更简单地执行此操作。它引入了一个 columns 属性,该属性创建了一个列标题数组(即数据集的“键”)。

      所以,不要使用您的代码:

      var mappedArray = d3.entries(data[0]),
          valueKey = mappedArray[1].key;
      

      ...你可以使用:

      var valueKey = data.columns;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-02
        • 2020-09-16
        相关资源
        最近更新 更多