在 d3 中堆叠矩阵而不重新映射到 json

2024-03-27

The docs https://github.com/d3/d3-shape/blob/master/README.md#stacks对于d3的堆叠功能d3.stack显示一个包含对象数组的示例(每个 json 对象代表 x 轴测量的点的集合)。例如:

var data = [
  {month: new Date(2015, 0, 1), apples: 3840, bananas: 1920, cherries: 960},
  {month: new Date(2015, 1, 1), apples: 1600, bananas: 1440, cherries: 720}
]

我正在尝试生成一个带有数据系列矩阵的堆叠直方图([ [], [], [], etc ])。迭代行并获取一系列直方图箱(在其他地方预定义了 x 比例和域)非常容易:

for(let i=0; i<data.length; i++){
    bins[i] = d3.histogram()
            .domain(x.domain())
            .thresholds(x.ticks(10))
            (data[i]);
    }

并为另一个循环内的每个数据系列创建组:

let bars = this.svg.selectAll(".series" + i)
    .data(this.bins[i])
    .enter().append("g")
    .classed("series" + i, true)

但当然这样做我会被困在这里。我该怎么办bars.append("rect")该特定系列的正确 x,y 坐标?换句话说,我有一个非常有用的数组bins目前,看起来像:

[
  [[1,2,3,3], [5,8,9], [10], ... etc], //series0 grouping by bins of 5
  [[1,3], [7,7,9,9], [11], ... etc], //series1
  [[2,3,3], [8,9], [10,12], ... etc], //series2
  ...etc
]

有没有办法调用stack不用将所有数据都整理成 json 键、值对?


我看了一眼来源 https://github.com/d3/d3-shape/blob/master/src/stack.js并且没有注释+单个字符变量=我理解如果不进行修改就不会发生这种情况。因此,我提出了我为节省别人时间而做出的拙劣尝试:

/*
 * Static helper method to transform an array of histogram bins into an array of objects
 * suitable for feeding into the d3.stack() function.
 * Args:
 *  bins (array): an array of d3 histogram bins
 */
static processBins(bins){
    let temp = {}; // the keys for temp will be the bin name (i.e. the bin delimiter value)
    // now create an object with a key for each bin, and an empty object as a placeholder for the data
    bins[0].map( (bin) => { temp[bin.x0] = {}});
    for(let i=0; i<bins.length; i++){
        //traverse each series
        bins[i].map( bin => { 
            temp[bin.x0]["series"+i] = bin.length; //push the frequency counts for each series
        });
    }
    /* now we have an object whose top-level keys are the bins:
    { 
        binName0: { series0: freqCount0, series1: freqCount1, ...},
        binName1: {...},
        ...
    }
    now, finally we're going to make an arrays of objects containing all the series' freqencies for that bin
    */
    let result = [];
    for(let binName in temp){                       // iterate through the bin objects
        let resultRow = {};
        if(temp.hasOwnProperty(binName)){
            resultRow["bin"] = binName;             //put the bin name key/value pair into the result row
            for(let seriesName in temp[binName]){   //iterate through the series keys
                if(temp[binName].hasOwnProperty([seriesName])){
                    resultRow[seriesName] = temp[binName][seriesName];
                }
            }
        }
        result.push(resultRow);
    }
    return result;
}

打电话像:

let stack = d3.stack().keys( bins.map( (d,i)=>{return "series"+i})); //stack based on series name keys
let layers = stack(MyCoolHistogram.processBins(bins));
//and now your layers are ready to enter() into a d3 selection.

编辑: 我注意到匿名函数中的堆栈数据第三个参数似乎是元素数组。 IE。它不再是堆栈层索引。例如,当并排分组条形时:http://bl.ocks.org/mbostock/3943967 http://bl.ocks.org/mbostock/3943967

这会破坏依赖此索引号来计算 x 位置的分组函数:

rect.attr("x", (d,i,j) => { return x(d.data.bin) + j*barWidth/numberOfSeries});

我想这表明 Mike 的要点仍然使用 v3,尽管在 v4 发布很久之后才进行了更新。

要获取图层索引,您必须使用layer.index直接属性。因此,在分组时,您将平移整个图层(当然,这会搞砸逐条动画......叹息)。

let layers = d3.stack(yourData);
let layer = this.svg.selectAll(".layer")
            .data(layers)
layer.transition()
    .attr("transform", d => { return "translate(" + d.index*barWidth/numberOfSeries + ",0)"; });
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 d3 中堆叠矩阵而不重新映射到 json 的相关文章

  • 开玩笑错误意外的令牌...(ES6)

    每当我在命令行中运行 jest 时 都会收到以下错误 Test suite failed to run Users
  • 节点异步循环 - 如何使该代码按顺序运行?

    我知道有几个关于此的帖子 但根据我发现的那些帖子 这应该可以正常工作 我想在循环中发出 http 请求 并且不希望循环迭代 直到触发请求回调 我正在使用异步库 如下所示 const async require async const req
  • 如何使用 jackson 反序列化为 Kotlin 集合

    我想要的示例代码 data class D val a String val b Int val jsonStr a value1 b 1 a value2 b 2 what I need val listOfD List
  • 在 JavaScript 中计算不包括周末和节假日的天数

    我正在尝试编写一个代码 其中将计算总天数 不包括周末和自定义假期 我通过 stackoverflow 和 adobe 论坛进行搜索以找到解决方案 并提供了以下代码 如果公共假期恰逢工作日 周六至周三 则不计算在内 我的问题是 如果公共假期落
  • Sequelize 关联 - 请改用 Promise 风格

    我正在尝试将 3 张桌子连接在一起Products Suppliers and Categories然后排SupplierID 13 我读过了如何在sequelize中实现多对多关联 https stackoverflow com a 25
  • 按 Enter 键提交消息?

    我正在开发一个基于本教程使用 Meteor 构建的聊天应用程序 http code tutsplus com tutorials real time messaging for meteor with meteor streams net
  • 如何从左向右滑动文本和图像并具有滑动效果[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • codePointAt 和 charCodeAt 之间的区别

    有什么区别String prototype codePointAt and String prototype charCodeAt 在 JavaScript 中 A codePointAt 65 A charCodeAt 65 从 MDN
  • 如何对像 Excel Pivot 这样两个键必须匹配的数组求和?

    我尝试对 Datum 和 Material 必须匹配的所有 Menge 和 Fehler 值求和 结果应类似于 Excel 数据透视表 到目前为止 这是我的代码 但我不知道如何添加也必须匹配的第二个键 Material 我希望你能理解我试图
  • 为什么人们将自己的自定义/用户函数添加到 jQuery 对象中? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我见过人们将自己的自定义 用户功能添加到jQuery目的 例如 myUserFunc function regular JS code 你为什么
  • Durandal SPA 与打字稿有关的问题

    我使用 TypeScript 1 8 将我的 durandal SPA 应用程序从 VS 2012 更新到 VS 2015 它将生成 JavaScript ECMA5 我解决了所有构建错误 但我无法修复一个名为 return 语句只能在函数
  • 如何使用javascript将视频文件转换为字符串?

    我在 signalR 工作 我想通过将视频文件拆分为不同部分来将视频文件从一个客户端发送到另一个客户端 我已经通过分割图像源数据发送图像并在另一个客户端上接收该图像 document getElementById fileUpload ad
  • 如何将数据从 JavaScript 发送到 Python

    我正在 jinja2 和 python2 7 上使用 GAE 进行 Web 开发 我可以从Python获取数据 但我无法将数据从 JavaScript 发送到 Python 这是 JavaScript 代码 function toSave
  • React setState回调返回值

    我是 React 新手 我希望实现这种流程 set the state execute a function f an async one which returns a promise set the state again return
  • 从数组创建树并将父字段的表示形式更改为对象而不是 ID

    我堆满了琐碎的问题 但找不到解决方案 任何帮助将不胜感激 我有一个对象数组 id 1 title home parent null id 2 title about parent null id 3 title team parent 2
  • 分配函数后如何删除 onmouseout 事件?

    我有一个问题 我正在为 onmouseout 事件分配一个函数 但运行该事件后 我需要将其删除 将非常感谢您的帮助 这取决于你的代码 如果你用 d3 这样做 那么你可以说 在 onmouseout 事件函数中 element on mous
  • 将文件读取为 JSON

    我想读取几个文件 index html style css main js 来创建用于上传的 JSON 有效负载 我知道使用 Nodejs 我可以开始创建我想要的东西 如下所示 var fs require fs fs readFile i
  • 使用 NodeJS 创建 YouTube 播放列表

    我正在尝试使用 NodeJS 服务器创建 YouTube 播放列表 我已按照 Oauth 的 NodeJS 快速入门说明进行操作 如以下链接所示 https github com youtube api samples blob maste
  • 阻止 PM2 上不同时运行的请求

    在我的 Express 应用程序中 我在应用程序中定义了 2 个端点 一种用于 is sever up 检查 另一种用于模拟阻塞操作 app use status req res gt res sendStatus 200 app use
  • javascript 加壳器与压缩器

    我想知道加壳器与压缩器的区别 优点是什么 即您应该在网络应用程序中部署压缩版本还是压缩版本 示例代码 var layout NAVVISIBLE 1 Init function this Resize Dimensions function

随机推荐

  • Symfony2 Assetic 路由和资源错误

    我有一个模板 例如index html php 我在其中使用 php assetic 加载器 如下所示 如果我对模板文件进行任何更改 我会得到路线 assetic 2b431f4 不存在 如果我改变 assetic use controll
  • C 中逐个字符读取文件

    我正在用 C 语言编写 BF 解释器 但在读取文件时遇到了问题 我以前用过scanf为了读取第一个字符串 但是你的 BF 代码中不能有空格或注释 现在这就是我所拥有的 char readFile char fileName FILE fil
  • EditText 随选择缩放

    我有一个EditText我想缩放它并滚动setScaleX setScaleY它工作正常 文本正在正确的位置进行编辑 但是当我尝试选择文本时 它会将选择手柄绘制到位置 就像文本未缩放时一样 我们都知道bug https code googl
  • 对公司名称的 DataFrame 进行非规范化 [第 1 部分]

    我有一个公司名称的 Pandas DataFrame 其结构如下 import numpy as np import pandas as pd df pd DataFrame name Nitron Pulset Rotaxi postal
  • 我如何知道创建项目时使用的是哪个版本的 Delphi

    如果我有 Delphi 项目的完整源代码 我如何知道使用哪个版本 即 Delphi 5 Delphi 7 Delphi 2010 等 来创建它 而无需在 Delphi 中打开它 我有许多可以追溯到 Delphi 6 时代的项目 我想对它们进
  • OpenId Connect 与 wso2 仅返回子声明

    当我询问用户 WSO2 的信息时 响应仅包含他的子信息 Request GET https srv wso2 domain com 9443 oauth2 userinfo schema openid Request headers Acc
  • AngularJS - 涉及异步数据的依赖注入

    我想让当前登录的用户 ID 和用户名可供我的 Angular 指令使用 我创建了一个 API 端点来检索此信息 以及一些其他信息 问题是 API 调用是异步的 var url baseUrl api sessions http get ur
  • 没有指定 dataType 的自定义 ajaxTransport 函数不会触发(根本!)

    我一直在尝试设置jQuery 的自定义 ajaxTransports http api jquery com extending ajax Transports在我们的产品的某些场景下缩短某些工作流程 然而 我在让这些运输受到尊重方面取得了
  • 将 CSV 文件转换为 Java - 向后复制

    我之前问过一个关于在java中将CSV文件转换为二维数组的问题 我完全重写了我的代码 几乎要重新编写了 我现在遇到的唯一问题是它正在向后打印 换句话说 列打印在行应该打印的位置 反之亦然 这是我的代码 int board new int 2
  • D 中是否有相当于 C++ 的 Future/Promise ?

    D 世界中是否存在 C 世界中的未来 承诺等价物 当然有标准并行度 http dlang org phobos std parallelism html但它并不完全具有承诺 未来组合的功能 没有相当于获取未来或设置结果或异常的功能 您也不能
  • Pytorch:了解 nn.Module 类内部如何工作

    一般来说 一个nn Module可以由子类继承 如下所示 def init weights m if type m nn Linear torch nn init xavier uniform m weight class LinearRe
  • 如何使用 jQuery 从 iframe 调用父页面上的函数?

    我有一个上传表单 可以发布到隐藏的 iframe 我试图从 iframe 调用父页面上的函数 但收到错误 top stopUpload 不是函数 这样做的正确方法是什么 父页面 document ready function documen
  • 检测两个图像之间的像素碰撞/重叠

    我有两个 UIImageView 其中包含具有某些透明区域的图像 有什么方法可以检查两个图像之间的非透明区域是否发生碰撞 Thanks 更新 这就是我到目前为止所拥有的 不幸的是它仍然不起作用 但我不明白为什么 if CGRectInter
  • 在什么情况下会调用类型到自身的转换运算符?

    考虑一个类型bar其中具有用户定义的类型引用转换运算符bar struct bar operator bar operator const bar const 何时应用这些转换 此外 如果这些运算符是deleted 这两个功能有什么有趣的用
  • 释放宝石时 rake 释放挂起

    我正在尝试将我的第一个宝石发布到 Ruby Gems 该宝石在本地运行良好 我使用以下方式释放它 rake release 这在控制台中给了我这个 example gem 0 0 3 built to pkg example gem 0 0
  • 命名空间、argparse 和用法

    这确实是几个问题 argparse 使用名称空间而不是字典有原因吗 假设我有一个班级 init self init method args The init method参数告诉 init function 我想用哪种方式初始化类 而arg
  • 用 java 中的 Apache Tar 保存结构的目录

    我怎么能够tar一个目录并使用以下命令保留目录结构org apache commons compress图书馆 通过我在下面所做的事情 我只是得到一个所有东西都被压平的包裹 Thanks 这是我一直在尝试的方法 但它不起作用 public
  • 为什么 macOS 会杀死由 clang 创建的静态可执行文件?

    我有一个用于 m1 arm cpu 的最小 c 程序 返回 42 void start asm mov x0 42 asm mov x16 1 asm svc 0x80 此代码在告诉 clang 使用 start 符号后进行编译并返回正确的
  • 如何使用带有面部特征的 openCV 训练支持向量机(svm)分类器?

    我想使用svm分类器进行面部表情检测 我知道 opencv 有一个 svm api 但我不知道训练分类器的输入应该是什么 到目前为止我读了很多论文 他们都说在面部特征检测之后训练分类器 到目前为止我所做的 人脸检测 每帧计算16个面部点 下
  • 在 d3 中堆叠矩阵而不重新映射到 json

    The docs https github com d3 d3 shape blob master README md stacks对于d3的堆叠功能d3 stack显示一个包含对象数组的示例 每个 json 对象代表 x 轴测量的点的集合