d3 v4嵌套数据和堆积条形图

2023-12-10

I am trying to make a chart that looks like this: Example Bar Chart

我有一个 D3.nest 数据结构,如下所示:

{"key":"Area 1","values":[
    {"key":"5. Validation Complete","value":12.5},
    {"key":"Deferred","value":1},
    {"key":"3. Identify & Validate Proposed Solutions","value":5},
    {"key":"1. Define & Describe the Problem or Opportunity","value":0}]},
{"key":"Area 2","values":[
    {"key":"5. Validation Complete","value":41.2},
    {"key":"4. Implement the Solutions","value":86.6},
    {"key":"3. Identify & Validate Proposed Solutions","value":6},
    {"key":"2. Identify Root Causes","value":4},
    {"key":"1. Define & Describe the Problem or Opportunity","value":9}]},
{"key":"Area 3","values":[
    {"key":"5. Validation Complete","value":40},
    {"key":"4. Implement the Solutions","value":49.2},
    {"key":"3. Identify & Validate Proposed Solutions","value":10.4}]},
{"key":"Area 4","values":[
    {"key":"Deferred","value":0.25},
    {"key":"4. Implement the Solutions","value":28},
    {"key":"3. Identify & Validate Proposed Solutions","value":84.9},
    {"key":"2. Identify Root Causes","value":0}]}

我的 zKeys 的结构如下:

Array Image

我尝试过但没有成功Bostock 的堆积条形图示例和这个SOpost.

这是我的代码:

    var svg = d3.select("svg"),
    margin = {top: 20, right: 20, bottom: 30, left: 40},
    width = +svg.attr("width") - margin.left - margin.right,
    height = +svg.attr("height") - margin.top - margin.bottom;

var x = d3.scaleBand().rangeRound([0, width]).padding(0.1);
var y = d3.scaleLinear().rangeRound([height, 0]);
var z = d3.scaleOrdinal().range(["#F8A11E", "#E51F36", "#582C85", "#1C92D0", "#017165", "#7F7F7F"]);    

var g = svg.append("g")
    .attr("transform", "translate(" + margin.left + "," + margin.top + ")");

var sharepointStatusArray = getListData("Points List","ID,Title,Color_Code");
var data=getListData("Points%20List","$select=Area,StatusID,Points,Status/Title&$expand=Status");   

var zKeys = [];

sharepointStatusArray.forEach(function(d)
 {
    zKeys.push(d.Title);
 });

var nestData = d3.nest()
    .key(function(d) { return d.Area; })
    .key(function(d) { return d.Status.Title; })
    .rollup(function(v) { return d3.sum(v, function(d) { return d.Points; }); })
    .entries(data);

    nestData.sort(function(a,b) {return b.total - a.total;});
    x.domain(nestData.map(function(d) { return d.key; }));
    y.domain([0, d3.max(nestData, function(d){return d3.sum(d.values, function(d){return d.value})})+20]).nice();
    z.domain(zKeys) 

  g.append("g")
    .selectAll(".serie")
    .data(d3.stack().keys(zKeys)(nestData))
    .enter().append("g")
        .attr("class","serie")
        .selectAll("rect")
        .data(function(d) { return d; })
        .enter().append("rect")
            .attr("class", "bar")
            .attr("fill", function(d) { return z(d.key);})
            .attr("x", function(d) {return x(d.data.key);})         
            .attr("y", function(d) {return y(d[1]);})
            .attr("height", function(d) { return y(d[0]) - y(d[1]); })
            .attr("width", x.bandwidth());

  g.append("g")
    .attr("class", "axis axis--x")
    .attr("transform", "translate(0," + height + ")")
    .call(d3.axisBottom(x));

  g.append("g")
      .attr("class", "axis")
      .call(d3.axisLeft(y).ticks(null, "s"))
    .append("text")
      .attr("x", 2)
      .attr("y", y(y.ticks().pop()) + 0.5)
      .attr("dy", "0.32em")
      .attr("fill", "#000")
      .attr("font-weight", "bold")
      .attr("text-anchor", "start")
      .text("Hours");


    //Creating legend for colors
      var legend = g.append("g")
      .attr("font-family", "sans-serif")
      .attr("font-size", 10)
      .attr("text-anchor", "end")
    .selectAll("g")
    .data(zKeys.slice())
    .enter().append("g")
      .attr("transform", function(d, i) { return "translate(0," + i * 20 + ")"; });

  legend.append("rect")
      .attr("x", width - 19)
      .attr("width", 19)
      .attr("height", 19)
      .attr("fill", z);

  legend.append("text")
      .attr("x", width - 24)
      .attr("y", 9.5)
      .attr("dy", "0.32em")
      .text(function(d) { return d; }); 

我无法根据示例绘制堆积条形图。几乎每个示例都使用 d3.csv 而不是 d3.nest,因此我不知道如何将这些示例转换为具有输出数组的 d3.nest 场景。

有人可以帮我吗?谢谢。


I ended up finding the answer to my own question. One of the things I discovered was that all the information I found that dealt with d3.stack() stated that the data that was sent to the function needed to be 2D (2 dimensional). This was something that d3.nest() outputs nicely. This turned out to not be accurate. I should have done this from the beginning, but I debugged the example Mike Bostock’s Stacked Bar Chart and discovered that the output of d3.csv() that everyone uses in their examples actually outputs a 1D array with each element containing key/value pairs of the data to be displayed in each rect. Screenshot of the data output from Mike's example

我可能采取了一种非常迂回的方式来做到这一点,但这是我为解决 d3.stack() 没有正确的数据结构的问题所做的。

1)我保留了 d3.nest() 输出的使用,因为它允许我将各个值总结为每个元素的单个键/值对,如下所示:

Nested Data

2)然后,我使用以下代码对该数据输出进行清理,使其看起来像所有示例中 d3.csv() 的输出(添加缺失数据的键/值默认值并展平结构:

//BEGIN data cleanup for d3.stack
//Add default values for missing data points to make each array formatted the same
    nestData = nestData.map(function(keyObj) {
        return {
            key: keyObj.key,
            values: zKeys.map(function(k) { 
                    value = keyObj.values.filter(function(v) { return v.key == k; })[0];
                    return value || ({key: k, value: 0});
                })
        };
    });

//Loop through the nested array and create a new array element that converts each individual nested element into a key/value pair in a single object.
var flatData = [];
nestData.forEach(function(d) {
    var obj = { Area: d.key }
        d.values.forEach(function(f) {
            obj[f.key] = f.value;
        });
    flatData.push(obj);
  });
//END data cleanup for d3.stack

The data now looked like this: Flattened Structure

3)数据清理后,我就可以开箱即用地使用迈克示例中的代码,如下所示:

    x.domain(flatData.map(function(d) { return d.Area; }));
    y.domain([0, d3.max(nestData, function(d){return d3.sum(d.values, function(d){return d.value})})+20]);
    z.domain(zKeys) 

var g = svg.append("g")
    .attr("transform", "translate(" + margin.left + "," + margin.top + ")");

  g.append("g")
    .selectAll("g")
    .data(d3.stack().keys(zKeys)(flatData))
    .enter().append("g")
      .attr("fill", function(d) { return z(d.key); })
    .selectAll("rect")
    .data(function(d) { return d; })
    .enter().append("rect")
      .attr("x", function(d) { return x(d.data.Area); })
      .attr("y", function(d) { return y(d[1]); })
      .attr("height", function(d) { return y(d[0]) - y(d[1]); })
      .attr("width", x.bandwidth());
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

d3 v4嵌套数据和堆积条形图 的相关文章

  • chrome 调试器承诺在暂停时不会解析?

    也许我没有正确调试承诺 但基本上 如果您在断点处停止并运行异步代码 它实际上不会完成 直到您恢复执行为止 这是一个问题 调试器允许您快速试验多个 api 方法 但如果您恢复它 您就不能 debugger now type the follo
  • 如何将udp发送到udp node.js服务器?

    我对此很陌生 所以我真的不知道我在做什么 但我已经设置了一个 node js udp 服务器 我想从客户端 来自网站 向它发送一个数据包 但我不知道如何在 javascript 中做到这一点 或者是否可能 我不是在研究如何从 Node js
  • Node js 使用中间件重定向进行过多重定向

    在我的 Node js 应用程序 我使用的是express 4 x 中 我想检查用户是否已登录 如果用户未登录 我想重定向到我的登录页面 然后我在中间件中这样做 服务器 js app use function req res next if
  • 在Javascript中按降序对字符串进行排序(最有效)?

    W3Schools 有这个例子 var fruits Banana Orange Apple Mango fruits sort fruits reverse 这是在 Javascript 中按降序对字符串进行排序的最有效方法吗 Updat
  • 动画进度元素值

    我有一个progress元素 该元素如下所示 div class container div div div
  • 如何使用canvas.toDataURL()将画布保存为图像?

    我目前正在构建一个 HTML5 Web 应用程序 Phonegap 本机应用程序 我似乎不知道如何将画布保存为图像canvas toDataURL 有人可以帮我吗 这是代码 有什么问题吗 我的画布被命名为 canvasSignature J
  • 使用 CryptoJS 更改密钥 [重复]

    这个问题在这里已经有答案了 我正在使用 CryptoJS 来加密和解密文本 在这里 我只是获取消息并显示加密和解密消息 我使用DES算法进行加密和解密 这是我的 HTML 文件
  • 在为 RXJS 可观察量编写测试时,如何避免让调度程序通过我的业务逻辑?

    我发现使某些测试通过的唯一方法是显式地将调度程序传递给函数 为了便于说明 请考虑以下函数 function doStuff stream return stream delay 100 filter x gt x 2 0 map x gt
  • javascript中按tab键时如何调用函数?

    我有一个这样的功能 function whenEmpty field if field value field style backgroundColor ffcccc alert Please fill the field field f
  • 通过 node-http-proxy 保留基于 cookie 的会话

    我有一个简单的基于 Express 的 Node js Web 服务器 用于开发 JavaScript 应用程序 我将服务器设置为使用 node http proxy 来代理应用程序向在不同域和端口上运行的 Jetty 服务器发出的 API
  • 如何流式传输 OpenAI 的完成 API?

    我想流式传输结果通过 OpenAI 的 API 完成 https beta openai com docs api reference completions 该文档提到使用服务器发送的事件 https developer mozilla
  • 在d3.js中将2D形状转换为3D,并根据ANGULAR中的值调整高度

    我正在使用 d3 js v6 创建以下 2D 图表表示的 3D 图表 这个圆圈中有多个正方形 每个正方形都根据值分配了一种颜色 值越大 正方形越暗 现在我想将其转换为 3D 形状 其中当值变高时 只有特定正方形的高度会增加 因此结果在某种程
  • 如何使JavaScript函数在Eclipse“大纲视图”中可见?

    我有这样的代码 但如果它在匿名函数中定义 则无法打开函数大纲 类没有问题 我该如何概述something2 请分享一些提示 我可以将所有函数标记为构造函数 但这是无效的方法 start of track event required deb
  • Chartjs刻度标签位置

    尝试让 Y 轴刻度标签看起来像image https i stack imgur com XgoxX png 位于秤顶部且不旋转 缩放选项当前如下所示 scales yAxes id temp scaleLabel display true
  • 为什么“tbody”不设置表格的背景颜色?

    我在用 tbody 作为 CSS 选择器来设置background color在一个表中 我这样做是因为我有多个 tbody 表内的部分 它们具有不同的背景颜色 我的问题是 当使用border radius在细胞上 细胞不尊重backgro
  • 当用户单击链接时,如何记录 MixPanel 事件?

    当用户单击某种类型的链接时 我试图在 MixPanel 中记录一个事件 我正在使用 JQuery 不引人注意地完成此操作 据我所知 我需要添加一个回调函数 以便在记录事件后将用户带到 URL 这是我正在使用的代码 不幸的是
  • 如何在jquery中获取保存时间和当前时间的差异?

    我想在 javascript 或 jquery 中获取保存时间和当前时间之间的时差 我节省的时间看起来像Sun Oct 24 15 55 56 GMT 05 30 2010 java中的日期格式代码如下 String newDate 201
  • JavaScript 代码在不使用 ActiveX 的情况下截取网站屏幕截图

    我有一个用户与之交互的 JavaScript 应用程序 我需要保存当前界面的外观 裁剪出我需要的部分 或者通过指定div只拍摄我需要的部分 然后发送回服务器 显然任何外部服务都无法做到这一点 我需要一个 JavaScript 或Flash
  • 如何在 javascript 正则表达式中匹配平衡分隔符?

    我原以为这个问题是不可能的 据我所知 Javascript 的正则表达式既没有递归插值 也没有漂亮的 NET 平衡组功能 但问题就在那里 如问题 12 所示正则表达式 alf nu http regex alf nu 匹配平衡对 lt an
  • 需要有关 React Js 的帮助

    我是 React Js 新手 我的代码无法正常工作 请看下面 这是我的脚本文件Main jsx 该文件由 React 编译 输出放置在 dist 文件夹下的 main js 文件中 var react require react react

随机推荐

  • 80x86 中 SHL 和 SAL 的区别

    我已经学会了如何使用 80x86 汇编器 因此在按位移位操作中 我遇到了 SAL 和 SHL 使用的问题 我的意思是代码行之间的区别如下 MOV X 0AAH SAL X 4 MOV X 0AAH SHL X 4 什么时候应该使用SHL 什
  • Openerp 函数字段

    嘿 我是 openerp 的新手 我需要帮助来创建一个名为 Total 的函数字段 用于计算同一对象的所有字段的总和 例如 name hr performanzze columns p fields selection 1 Outstand
  • 将 PDO 与 MSSQL 服务器一起使用时出现“无法找到驱动程序”错误

    这个问题已经被问过很多次了 我已经经历了所有这些问题 但没有一个解决方案对我有用 基本上 使用 PDO 连接到 MSSQL 服务器时出现 找不到驱动程序 异常 以下是我的规格 Windows 8 64 Bit version MSSQL s
  • SWIG 无法识别字符串参数

    我有一个令人沮丧的问题 让我花了很多时间来处理它 但我没有找到任何解决方案 我想通过 SWIG 在 PHP 中使用 C 类 我生成了我的共享对象 它对于某些方法工作正常 但每当我使用字符串参数作为输入调用这些方法时 我都会遇到此错误 致命错
  • 如何通过xib将NSMutableArray绑定到ArrayController

    我是可可的新手 我正在显示一个简单的 Tableview 其中填充了 NSMutableArray 它绑定到 NSArrayController 如下所示 arrController bind contentArray toObject s
  • OutofMemoryError:位图大小超出 VM 预算 (Android)

    BitmapFactory 中出现异常 不确定是什么问题 好吧 我可以猜测这个问题 但不确定为什么会发生 ERROR AndroidRuntime 7906 java lang OutOfMemoryError bitmap size ex
  • 为什么 StringTemplate 会很慢?

    我使用 StringTemplate 作为我的 Web 应用程序的视图层 最近我测量了渲染页面所花费的时间 简单页面约为 50 毫秒 复杂页面约为 500 毫秒 这对于我的需求来说太多了 所以我正在寻找一种方法来提高 ST 的性能 我怎样才
  • 使用 XPath 提取节点值

    我想从 amazon com 的一个部分中提取每个项目的数据 仅节点值 而不是链接 我正在寻找的价值是内在的 span class narrowValue ul li style margin left 0px a href s ref s
  • chdir() 可以接受相对路径吗?

    在Linux上的C中 chdir 函数可以接受相对路径吗 是的 当前工作目录是进程的一个属性 稍微扩展一下 这里有一些相关的POSIX定义 The 当前工作目录被定义为 与进程关联的目录 用于不以斜杠字符开头的路径名的路径名解析 有关更多详
  • 如何更改自定义轨道生成器的源? (雷神)

    我正在制作一个自定义生成器来生成新的 Rails 应用程序 我是这样做的 require thor require rails generators rails app app generator class AppBuilder lt R
  • ORACLE SQL 使用窗口函数运行 TOTAL 和 daytotal

    从 EMPLOYEE 表中 我想对记录数量 雇用的员工 进行分组 并且还有每天的运行总数 输入的格式是这样的 rownum Hired date time 1 1 10 2012 11 00 2 1 10 2012 13 00 3 20 1
  • 如何比较 if 语句中的多个字符串?

    我正在尝试检查 if 语句中的多种可能性 用户输入一个字符串 然后我检查该字符串是否有多种可能性 if theString Seven seven 7 theInt 7 cout lt lt You chose lt lt theInt l
  • Scala isInstanceOf 和类型擦除

    我很困惑如何isInstanceOf在 Scala 中工作 如果我做这样的事情 val x Int 5 x isInstanceOf Int 鉴于 Scala 确实进行了类型擦除 那么 JVM 不应该在运行时删除所有类型信息吗 它不是all
  • 如何获取Windows启动时间? [复制]

    这个问题在这里已经有答案了 如何使用某些 WinAPI 函数在 C 中获取 Windows 启动时间 我目前正在使用命令 systeminfo 但我正在寻找更合适的解决方案 我检查了任务管理器是如何做到这一点的 结果发现它使用ZwQuery
  • C++ 优化中的代码重新排序何时停止?

    我已经阅读了很多关于优化代码中的代码执行保证的问题 所以我试图编译一个关于允许 阻止编译器重新排序代码序列的原因列表 我已经从通常正确的内容开始回答 但我没有添加标准中的引号 这是根据我的经验得出的 如果有任何忘记的内容或对现有的要点进行扩
  • 使用Python多处理在worker之间共享变量[重复]

    这个问题在这里已经有答案了 如何读取和更新Python中多个worker之间共享的变量 例如 我正在使用 Python 中的多个进程扫描文件列表 并且想检查父目录是否已被扫描 def readFile filename Add the pa
  • R中Leaflet中聚集标记的聚合加权线串

    我正在尝试绘制位置和加权连接线串 当我放大或缩小时 标记的聚类会调整得很好 显示的集群标签是聚合的node val的标记 我想对线串做类似的事情 这样 该图不显示连接单个标记的蓝线 而是显示连接标记簇的线 并且 连接标记簇的新线串的宽度根据
  • 如何访问(转发)docker compose 网络内的公共 HTTP 请求 IP 地址?

    通过以下设置 只有 YARP 容器已发布端口 它正确设置了X Forward 供其他容器使用的标头 但不幸的是它是 docker compose 网关地址 当我想记录 公共 客户端的 IP 地址时 我得到 ffff 172 18 0 1这是
  • 如何创建具有依赖注入和接口的连接类?

    我正在读这个问题 PHP 多个不同的数据库依赖注入类 最佳答案 我理解这里使用接口背后的概念 但我不知道如何使用它 这是最重要的答案 抱歉 如果我不应该将其复制到这里 您应该首先为所有数据库操作创建一个接口 interface IDatab
  • d3 v4嵌套数据和堆积条形图

    I am trying to make a chart that looks like this 我有一个 D3 nest 数据结构 如下所示 key Area 1 values key 5 Validation Complete valu