如何在d3js中制作分组堆积条形图?

2023-12-09

我有以下 d3 图表,它已分组,并且每个分组都包含一个堆积条形图。但不知何故,我觉得这不是一个正确的实施方式,而且有点复杂。如果只有堆积条形图,我会使用d3.stack()。有人可以让我知道有没有更好的方法来做到这一点?

片段如下:

var data = [
  {
    Category: "cat1",
    type1: 300,
    type2: 450,
    type3: 120
  },
  {
    Category: "cat2",
    type1: 400,
    type2: 100,
    type3: 200
  },
  {
    Category: "cat3",
    type1: 400,
    type2: 100,
    type3: 200
  },
  {
    Category: "cat4",
    type1: 400,
    type2: 100,
    type3: 200
  }
];

var margin = { top: 20, right: 20, bottom: 30, left: 40 },
  width = 500 - margin.left - margin.right,
  height = 500 - margin.top - margin.bottom;
var barWidth = 40;
var x0 = d3.scaleBand().range([0, width]);

var x1 = d3.scaleBand();

var y = d3.scaleLinear().range([height, 0]);

var xAxis = d3.axisBottom(x0);

var yAxis = d3.axisLeft(y).tickFormat(d3.format(".2s"));

var color = d3.scaleOrdinal().range(["#98abc5", "#8a89a6", "#7b6888"]);

var svg = d3
  .select("body")
  .append("svg")
  .attr("width", width + margin.left + margin.right)
  .attr("height", height + margin.top + margin.bottom)
  .append("g")
  .attr("transform", "translate(" + margin.left + "," + margin.top + ")");

var yBegin;

var innerColumns = {
  column1: ["type1", "type2"],
  column2: ["type3"]
};
var columnHeaders = d3.keys(data[0]).filter(function(key) {
  return key !== "Category";
});
color.domain(
  d3.keys(data[0]).filter(function(key) {
    return key !== "Category";
  })
);
var groupData = data.forEach(function(d) {
  var yColumn = new Array();
  d.columnDetails = columnHeaders.map(function(name) {
    for (ic in innerColumns) {
      if (innerColumns[ic].indexOf(name) >= 0) {
        if (!yColumn[ic]) {
          yColumn[ic] = 0;
        }
        yBegin = yColumn[ic];
        yColumn[ic] += +d[name];
        return {
          name: name,
          column: ic,
          yBegin: yBegin,
          yEnd: +d[name] + yBegin
        };
      }
    }
  });
  d.total = d3.max(d.columnDetails, function(d) {
    return d.yEnd;
  });
});

//console.log(data);
x0.domain(
  data.map(function(d) {
    return d.Category;
  })
);
x1.domain(d3.keys(innerColumns)).range([0, x0.bandwidth()]);

y.domain([
  0,
  1.15 *
    d3.max(data, function(d) {
      return d.total;
    })
]);

svg
  .append("g")
  .attr("class", "x axis")
  .attr("transform", "translate(0," + height + ")")
  .call(xAxis);

svg
  .append("g")
  .attr("class", "y axis")
  .call(yAxis);

var stackedbar = svg
  .selectAll(".stackedbar")
  .data(data)
  .enter()
  .append("g")
  .attr("class", "g")
  .attr("transform", function(d) {
    return "translate(" + x0(d.Category) + ",0)";
  });

stackedbar
  .selectAll("rect")
  .data(function(d) {
    return d.columnDetails;
  })
  .enter()
  .append("rect")
  .attr("width", barWidth)
  .attr("x", function(d) {
    return x1(d.column) + (x1.bandwidth() - barWidth) / 2;
  })
  .attr("y", function(d) {
    return y(d.yEnd);
  })
  .attr("height", function(d) {
    return y(d.yBegin) - y(d.yEnd);
  })
  .style("fill", function(d) {
    return color(d.name);
  });
body {
  font: 10px sans-serif;
}
 
.axis path,
.axis line {
  fill: none;
  stroke: #000;
  shape-rendering: crispEdges;
}
 
.bar {
  fill: steelblue;
}

 
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.6.0/d3.min.js"></script>

我尝试使用以下方法实现分组堆积条形图d3.stack()。以下是我的解决方案的两个重要部分:

var datasets=[d3.stack().keys(['type1','type3'])(data),
              d3.stack().keys(['type2'])(data)];

var num_groups=datasets.length;

这里我使用 d3.stack 的 .keys() 方法为每个组创建数据集。之后我们可以使用创建堆积条形图的代码,如下所示:

d3.range(num_groups).forEach(function(gnum) {
        svg.selectAll('g.group'+gnum)
            .data(datasets[gnum])
            .enter()
            .append('g')
                .attr('fill',accent)
                .attr('class', 'group'+gnum)
            .selectAll('rect')
            .data(d=>d)
            .enter()
            .append('rect')
                .attr('x',(d,i)=>xscale(xlabels[i])+(xscale.bandwidth()/num_groups)*gnum)
                .attr('y',d=>yscale(d[1]))
                .attr('width',xscale.bandwidth()/num_groups)
                .attr('height',d=>yscale(d[0])-yscale(d[1]));
            });

您可以在这里查看完整的解决方案:https://jsfiddle.net/Abhi9kt/28wzdrfk/4/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在d3js中制作分组堆积条形图? 的相关文章

  • 检测单选按钮/复选框状态的变化

    我需要可靠地检测页面上单选按钮 复选框的状态变化 以便查看表单是否被修改 现在 这是一个完全独立的脚本 我无法修改任何控制表单的内容 目前 我只能看到两种方法 onchange事件处理程序 有助于处理文本框 文本区域和选择 但不会针对复选框
  • 在节点环境中存根 jQuery.ajax (jQuery 2.x)

    我正在尝试运行一些需要存根的测试jQuery ajax 我正在使用 SinonJS 来做到这一点 它曾经与旧版本的 jQuery 1 x 一起工作得很好 var require jquery var sinon require sinon
  • JavaScript 字符串中的脚本标签[重复]

    这个问题在这里已经有答案了 我遇到一个问题 即 JavaScript 中带引号的字符串内有结束脚本标记 并且它正在杀死脚本 我认为这不是预期的行为 可以在这里看到这样的示例 http jsbin com oqepe edit http js
  • Javascript 进程是否有多个执行线程?

    背景 我正在创建一个 地址簿 类型的应用程序 有很多条目需要加载 一个想法是首先加载一小部分条目 让用户开始 然后将剩余条目排队 优先考虑用户单击的条目 例如 如果他们单击以 X 开头的名称 请先加载这些名称 然后再处理队列的其余部分 这个
  • 从选择 onChange 调用 javascript 函数 [重复]

    这个问题在这里已经有答案了 所以我有一个简单的 HTML 选择框和一个 javascript 警报功能 我希望选择框有一个 onchange 事件来调用 javascript 警报函数 这是我到目前为止所拥有的 HTML div Type
  • 以下文档我无法创建 Vue.js 3 的实例

    The code https stackblitz com edit vue ttt file src main js https stackblitz com edit vue ttt file src main js 问题 我正在尝试在
  • 将时间戳转换为一个数组

    在应用程序脚本 谷歌表中运行 我从 API 获取时间戳并返回此结果 1 6370611672429312E18 1 63706107263277082E18 我执行此代码并且工作正常 但问题不在数组中 我每次都需要它在数组中 const t
  • 裁剪 SVG 的正确方法?

    我对 SVG 图像完全感到困惑 我想将图像裁剪为其核心内容 我想通过指定其视图框和 或视口和 或其他任何内容来裁剪它 除非我不想更改折线元素中的任何点 图像按原样呈现类似这样的内容 注意 边框仅用于说明目的 边框实际上并不是 SVG 的一部
  • 如何将一个数组中的所有项目复制到另一个数组中?

    如何将数组的每个元素 其中元素是对象 复制到另一个数组中 以便它们完全独立 我不想更改一个数组中的元素来影响另一个数组 这里的关键是 数组中的条目是对象 并且 您不希望对一个数组中的对象的修改显示在另一个数组中 这意味着我们不仅需要将对象复
  • 检查用户设备的 GPS 是否开启

    我正在使用 jQuery Mobile 和 PHP 开发一个应用程序 我没有使用 Phonegap 或其他框架 我需要找到用户的geolocation 如果用户设备的 GPS 关闭 那么我无法获取位置 现在我需要查找用户设备的 GPS 是否
  • 通过 JavaScript 单击按钮/页面提交

    我想了解 asp net 框架如何知道何时单击了按钮 因此一旦收到请求 就会在服务器上触发其单击事件 我需要了解它是如何工作的 因为我想从 JavaScript 触发按钮的服务器单击事件 我能够从 JavaScript 执行页面提交 doc
  • 如何显示接下来的三个图像单击加载更多按钮

    我需要一个加载更多按钮来显示图像 页面加载时 我显示 3 个图像 单击 加载更多 按钮后 接下来的 3 个图像将显示在屏幕上 我尝试了下面的代码 但它不起作用 你能帮我解决这个问题吗 function item slice 0 2 show
  • 使用 float:left 与 display:inline-block 的 jQuery UI 拖放排序比较

    我这里有两个例子 这两个例子之间的唯一区别是 一种使用display inline block 另一种使用float left li doc item 显示 内联块 与 li doc item float left 我的问题是 displa
  • Firefox Addon 中的 JQuery 导致多个警告

    我在 Firefox 插件中使用 jquery 但我不断收到大量警告消息 如下所示 anonymous function does not always return a value System JS WARNING resource g
  • AngularJS + jQuery 移动

    是否还有其他可能性来设计AngularJS以移动友好的方式应用程序CSS 我正在计划一个移动应用程序 并希望使用 AngularJS 进行逻辑和数据绑定 但我不想自己设计所有内容CSS The AngularJSFAQ说它使用jQuery
  • 可以禁用幻灯片的触摸模拟但不能禁用滚动条(危险的滑动器)吗?

    我的页面上有一个危险的滑动器 它成功地模拟了幻灯片和随附滚动条上的触摸事件 允许单击鼠标并移动以向左或向右滑动幻灯片 这很好 但我现在在滑动器内的幻灯片上调用了可拖动 这意味着我需要停止此触摸模拟 拖动幻灯片并同时移动它们会引起混乱 但仅限
  • 从字节数组设置 img src

    我需要设置img src我在对象中拥有的字节数组的属性 img
  • 如何将MathJax公式转换为img

    Mathjax 现在在我的项目中运行良好 但有一个问题 有没有办法将MathJax的公式 纯html和css 转换成img文件 我可以保存 MathJax 可以配置为生成 SVG 看http docs mathjax org en late
  • onPress 方法中箭头函数与普通函数的行为

    正在学习 Native React 并学习更多关于 javascript 的知识 所以我仍然不明白它的行为的很多事情 我使用 TouchableOpacity 及其 onPress 属性创建了一个按钮组件 为了让它工作 我必须发送我想要执行
  • 如果 POST 响应仅包含 ID,如何将数据保存到我的 Ember 存储?

    Ember 数据期望我的服务器在每次成功后返回完整的对象POST 但是 我的 API 只返回一种元对象 其中包含id 当 Ember 收到此对象时 记录中的现有数据将被删除 除了id 例如 当我这样做时 var asset App Asse

随机推荐

  • Hive tez执行错误

    我正在运行配置单元查询 在设置 hive execution engine tez 时出现以下错误 而查询在 engine MR 下工作 FAILED Execution Error return code 1 from org apach
  • 如何使用 PowerShell 脚本运行 Terraform CLI 并传递映射类型的变量?

    Terraform 文件中的变量 infrastructure tf 声明如下 variable tags type map string 这是执行以下命令的 PowerShell 代码terraform命令行程序plan命令 comman
  • 应用程序从应用程序托盘中删除后,服务的进程被杀死

    当活动启动时 我正在启动服务 或重新启动正在运行的服务 使用 Intent intent new Intent this MyService class startService intent 稍后 基于某些操作 相同的活动使用以下方式绑定
  • 如果其他工作簿关闭,公式不会更新

    我有下面的公式 它引用同一文件夹中的另一个工作簿 但是当文件打开时它工作正常 问题是当另一个 Excel 文件关闭时 因为公式不会更新 另一个工作簿打开时的公式 IFERROR COUNTIFS Auto Zero xlsx MonthDB
  • 获取从 Moment.js 到 ISOString 的意外时间偏移

    我正在尝试标准化ISO 8601 日期格式 string 来自 Moment js 但我没有得到我期望的结果 瞬间的toISOString 方法给我一个带有 17 小时偏移量的输出 而不是午夜 var mom moment 23 11 20
  • 删除鼠标悬停 Google Chart 上的自定义工具提示

    我正在使用时间线谷歌图表 基于此question 我试图添加仅当鼠标移出工具提示时删除工具提示的功能 我的下面的函数成功地将其删除一次 但随后抛出错误 此外 我希望它仅在鼠标移出工具提示后才被删除 google visualization
  • ANTLR:带参数的规则?

    我是 ANTLR 新手 我开始探索 ANTLR 教程 我见过为特定规则定义返回类型的示例 请参见下面的示例 我也可以将参数传递给规则吗 我只是在心里想 我想根据提供给它的论据来改变特定状态下的规则行为 如果在 ANTLR 中可行 请帮助我
  • ORA-00936 缺少表达式

    当用户投票时 我需要更新我的表列 votecount 但我遇到此错误 我不知道该怎么办 private void Vote string VoteId OracleCommand cmd new OracleCommand UPDATE A
  • project.cabal 文件的 build-depends 中的“stack install NAME”和“NAME”有什么区别?

    添加和添加有什么区别package name在下面build depends 项目中的部分 cabal file 与做stack install package name在该项目的目录中 stack install只会将包安装到适当的位置
  • 将格式化的 Excel 范围粘贴到 Outlook 邮件中

    我想将一系列格式化的 Excel 单元格粘贴到 Outlook 邮件中 以下代码 我从各种来源获取 运行时没有错误并发送一条空消息 Sub SendMessage SubjectText As String Importance As Ol
  • 当依赖属性发生更改时是否有通知机制?

    在 Silverlight 应用程序中 我试图找出用户控件上的属性何时发生更改 我对一个特定的 DependencyProperty 感兴趣 但不幸的是该控件本身没有实现 INotifyPropertyChanged 还有其他方法可以确定值
  • 如何在neo4j中按时间戳过滤边缘?

    我有一个以下形式的图表 产品 产品 in stock 更新 时间戳 gt stock items StockItem 数量 q stored at gt 位置 位置 显然更重要的是 但你明白了要点 stock item 节点和 in sto
  • UITabBarController 的“更多”导航控制器在 UINavigationController 下消失

    我在我的应用程序上使用 UITabBarController 和 UINavigationController 在我的 UITabBarController 中 我使用了超过 5 个项目 因此我会自动获取 更多 项目 我已经设法添加一个保存
  • .net cf TextBox 在焦点上显示键盘

    我的 UI 上有一些文本框 我想在控件获得焦点时显示移动键盘 然后消失 注意 对于这个特定的程序 它是一个高屏幕 并且设备上没有物理键盘 将 InputPanel 添加到表单中 连接 TextBox 的 GotFocus 和 LostFoc
  • 将 LINQ to Entity Framework 与 DB2 结合使用

    是否有 IBM 驱动程序 以便我们可以使用 Linq to Entity 框架连接到 DB2 并在 desinger edmx 文件上生成 DB2 实体 任何链接将不胜感激 7已经出来了您可以在PC上安装DB2 9 7客户端来连接任何DB2
  • 抛出另一个异常:FormatException: Invalid number (at character 1)

    为什么会出现错误Another exception was thrown FormatException Invalid number at character 1 在一切恢复正常之前 我的屏幕上会出现几微秒 有时甚至不会发生 下面是我的
  • 尝试通过 jQuery ajax 调用加载 Google 图表

    最初发布在这里 尝试通过 jQuery ajax 调用加载 Google 图表但对我的代码进行了一些修改 但我仍然无法让它正常工作 我正在尝试编写一个轮询函数来加载结果并将其显示在同一页面中而不刷新 我正在使用谷歌图表 api 和 jque
  • 在 VB.Net 中等待变量改变状态的更好方法

    我有一个循环遍历多个值 迭代每个值时 都会将页面加载到 Web 浏览器控件中 将值作为参数传递 并且当加载和读取页面时 循环应转到列表中的下一个值并继续 直到处理完所有值 我需要一种方法来在网站异步加载时暂停该过程 然后在页面加载 读取过程
  • Google Sheet:onChange 事件触发时如何获取实际更改?

    the doc不是很有帮助 不像onEdit onChange事件没有包含所做更改的属性 我怎样才能得到它 function onChange e console log e 该事件对象中没有任何有用的信息 我无法使用 onEdit 的原因
  • 如何在d3js中制作分组堆积条形图?

    我有以下 d3 图表 它已分组 并且每个分组都包含一个堆积条形图 但不知何故 我觉得这不是一个正确的实施方式 而且有点复杂 如果只有堆积条形图 我会使用d3 stack 有人可以让我知道有没有更好的方法来做到这一点 片段如下 var dat