D3 二维图表的绘制系列(三)多列柱状图

[OfficeExcel] OfficeExcel2010 第20-22讲 Excel图表 王佩丰老师OfficeExcel2010 第20-22讲 Excel图表 学习笔记 阅读详情

上一篇: 基础柱状图 https://blog.youkuaiyun.com/zjw_python/article/details/98201470

下一篇: 堆叠柱状图 https://blog.youkuaiyun.com/zjw_python/article/details/98207916

代码结构和初始化画布的Chart对象介绍,请先看 https://blog.youkuaiyun.com/zjw_python/article/details/98182540

本图完整的源码地址: https://github.com/zjw666/D3_demo/tree/master/src/barChart/multiBarChart

1 图表效果

在这里插入图片描述

2 数据

date,food,transportation,education
Mon,30,40,50
Tue,20,80,100
Wed,20,50,80
Thu,10,30,40
Fri,15,20,35
Sat,10,30,70
Sun,20,50,60

3 关键代码

导入数据

d3.csv('./data.csv', function(d){
    return {
        date: d.date,
        food: +d.food,
        transportation: +d.transportation,
        education: +d.education
    };
}).then(function(data){
.....

配置一些样式参数

const config = {
        barOuterPadding: 0.15,
        barColor: chart._colors(0),
        margins: {top: 80, left: 80, bottom: 50, right: 80},
        textColor: 'black',
        gridColor: 'gray',
        tickShowGrid: [20, 40, 60, 80, 100],
        title: '多列直方图',
        barInnerPadding: 2,
        hoverColor: 'white',
        animateDuration: 1000
    }

尺度转换,注意与基础柱状图不同的是,Y轴的最大值为三个属性和的最大值

/* ----------------------------尺度转换------------------------  */
    chart.scaleX = d3.scaleBand()
                    .domain(data.map((d) => d.date))
                    .range([0, chart.getBodyWidth()])
                    .padding(config.barOuterPadding);
    
    chart.scaleY = d3.scaleLinear()
                    .domain([0, d3.max(data, (d) => d3.max([d.food, d.transportation, d.education]))])
                    .range([chart.getBodyHeight(), 0])

渲染柱形, 注意我们将数据绑定到g元素上,之后多个柱形平分一个bandwidth的宽度

/* ----------------------------渲染柱形------------------------  */
    chart.renderBars = function(){
        //改变数据结构,方便渲染
        const multiData = d3.zip.apply(this, data.map((d) => {
            let item = [];
            Object.keys(d).forEach((key) => {
                if (key !== 'date'){
                    item.push([d.date, d[key], key]);
                }
            });
            return item;
        }));

        let groups = chart.body().selectAll('.g')
                            .data(multiData);
        let bars = groups.enter()
                            .append('g')
                         .merge(groups)
                            .attr('class', (d) => 'g ' + d[0][2])
                            .attr('fill', (d,i) => chart._colors(i))
                            .selectAll('.bar')
                            .data((d) => d);
            
            groups.exit()
                    .remove();

            bars.enter()
                    .append('rect')
                    .attr('class','bar')
                .merge(bars)
                    .attr('x', (d) => {
                        return chart.scaleX(d[0]) + chart.scaleX.bandwidth() / multiData.length * (data.columns.indexOf(d[2]) - 1);
                    })
                    .attr('y', chart.scaleY(0))
                    .attr('width', chart.scaleX.bandwidth() / multiData.length - config.barInnerPadding * (multiData.length-1))
                    .attr('height', 0)
                    .transition().duration(config.animateDuration)
                    .attr('height', (d) => chart.getBodyHeight() - chart.scaleY(d[1]))
                    .attr('y', (d) => chart.scaleY(d[1]));
            
            bars.exit()
                    .remove();
    }

渲染坐标轴,与基础柱状图类似

/* ----------------------------渲染坐标轴------------------------  */
    chart.renderX = function(){
        chart.svg().insert('g','.body')
                .attr('transform', 'translate(' + chart.bodyX() + ',' + (chart.bodyY() + chart.getBodyHeight()) + ')')
                .attr('class', 'xAxis')
                .call(d3.axisBottom(chart.scaleX));
    }

    chart.renderY = function(){
        chart.svg().insert('g','.body')
                .attr('transform', 'translate(' + chart.bodyX() + ',' + chart.bodyY() + ')')
                .attr('class', 'yAxis')
                .call(d3.axisLeft(chart.scaleY));
    }

    chart.renderAxis = function(){
        chart.renderX();
        chart.renderY();
    }

渲染文本标签和网格线,与基础柱状图类似

/* ----------------------------渲染文本标签------------------------  */
    chart.renderText = function(){
        d3.select('.xAxis').append('text')
                            .attr('class', 'axisText')
                            .attr('x', chart.getBodyWidth())
                            .attr('y', 0)
                            .attr('fill', config.textColor)
                            .attr('dy', 30)
                            .text('日期');

        d3.select('.yAxis').append('text')
                            .attr('class', 'axisText')
                            .attr('x', 0)
                            .attr('y', 0)
                            .attr('fill', config.textColor)
                            .attr('transform', 'rotate(-90)')
                            .attr('dy', -40)
                            .attr('text-anchor','end')
                            .text('每日支出(元)');
    }

    /* ----------------------------渲染网格线------------------------  */
    chart.renderGrid = function(){
        d3.selectAll('.yAxis .tick')
            .each(function(d, i){
                if (config.tickShowGrid.indexOf(d) > -1){
                    d3.select(this).append('line')
                        .attr('class','grid')
                        .attr('stroke', config.gridColor)
                        .attr('x1', 0)
                        .attr('y1', 0)
                        .attr('x2', chart.getBodyWidth())
                        .attr('y2', 0);
                }
            });
    }

最后绑定鼠标交互事件

/* ----------------------------绑定鼠标交互事件------------------------  */
    chart.addMouseOn = function(){
        //防抖函数
        function debounce(fn, time){
            let timeId = null;
            return function(){
                const context = this;
                const event = d3.event;
                timeId && clearTimeout(timeId)
                timeId = setTimeout(function(){
                    d3.event = event;
                    fn.apply(context, arguments);
                }, time);
            }
        }

        d3.selectAll('.bar')
            .on('mouseover', function(d){
                const e = d3.event;
                const position = d3.mouse(chart.svg().node());

                d3.select(e.target)
                    .attr('fill', config.hoverColor);
                
                chart.svg()
                    .append('text')
                    .classed('tip', true)
                    .attr('x', position[0]+5)
                    .attr('y', position[1])
                    .attr('fill', config.textColor)
                    .text( d[2] + ':' + d[1] + '元');
            })
            .on('mouseleave', function(d){
                const e = d3.event;
                
                d3.select(e.target)
                    .attr('fill', chart._colors(data.columns.indexOf(d[2]) - 1));
                    
                d3.select('.tip').remove();
            })
            .on('mousemove', debounce(function(){
                    const position = d3.mouse(chart.svg().node());
                    d3.select('.tip')
                    .attr('x', position[0]+5)
                    .attr('y', position[1]-5);
                }, 6)
            );
    }

大功告成!!!


如果觉得这篇文章帮助了您,请打赏一个小红包鼓励作者继续创作哦!!!

在这里插入图片描述

D3 二维图表的绘制系列(一)介绍 1 介绍 D3 (或者叫 D3.js )是一个基于 web 标准的 JavaScript 可视化库. D3 可以借助 SVG, Canvas 以及HTML 将你的数据生动的展现出来. D3 结合了强大的可视化交互技术以及数据驱动 DOM 的技术,让你可以借助于现代浏览器的强大功能自由的对数据进行可视化 学习了d3一个多月,通过绘制一些简单的二维图表,总算入门了d3。强烈推荐《D3数据可视化实战... 阅读详情

相关推荐

D3 二维图表的绘制系列(二)基础柱状图

代码结构和初始化画布的Chart对象介绍,请先看 https://blog.youkuaiyun.com/zjw_python/article/details/98182540 本图完整的源码地址: https://github.com/zjw666/D3_demo/tree/master/src/barChart/basicBarChart 1 图表效果 2 数据 date,money Mon,120 T...

zjw_python的博客 3501

Excel数据分析—柱状图

Excel数据分析,让你快速了解并掌握柱状图~

James_Linz的博客 1万+

D3 二维图表的绘制系列(四)堆叠柱状图

上一篇: 多列柱状图 https://blog.youkuaiyun.com/zjw_python/article/details/98205614 下一篇: 横向柱状图 https://blog.youkuaiyun.com/zjw_python/article/details/98201470 代码结构和初始化画布的Chart对象介绍,请先看 https://blog.youkuaiyun.com/zjw_python/arti...

zjw_python的博客 5312

数据可视化 | Python绘制多维柱状图:一图展示西部各省人口变迁【附本文数据和代码】

本文从另一角度出发,着重讲解了将单一多维柱状图拆分为含有多个子图的多维柱状图的过程,为大家展示了一种新的数据可视化思路,并提供了执行方案。

weixin_55633225的博客 5105

避坑指南:用Origin做3D柱状图时,为什么你的柱子总对不齐或显示异常?

本文详细解析了使用Origin绘制3D柱状图时常见的柱子错位、显示异常等问题,提供了从数据架构到坐标轴基准的全面解决方案。通过高级调试技巧和视觉优化建议,帮助科研工作者精准呈现三维数据,特别适用于三维柱状图和3D堆积柱状图的制作与优化。

weixin_30731305的博客 368

D3.js入门篇-柱状图

引言 最近项目中有个新feature需要画一个业务流程的拓扑图,需要用到d3绘制,在这里记录一下学习过程,由于对前端不太熟悉,svg也是刚接触,所以进度感人(手动滑稽),好,进入正题,本篇使用d3完成一个简单的柱状图。 D3 柱状图 首先造一点json格式的数据: **data.json** { "data":[ {"value":123}, {"value":432}, ..

Waiting4U 2067

Matlab中画柱状图详细教程bar函数使用方法(二维附matlab代码)柱状图创建/位置/颜色/图例

matlab中柱状图/条形图绘制(bar函数)

iii66yy的博客 11万+

TensorRT(C++)部署 Pytorch模型

众所周知,python训练pytorch模型得到.pt模型。但在实际项目应用中,特别是嵌入式端部署时,受限于语言、硬件算力等因素,往往需要优化部署,而tensorRT是最常用的一种方式。本文以yolov5的部署为例,说明模型部署在x86架构上的电脑端的流程。(部署在Arm架构的嵌入式端的流程类似)。

女神sha手的博客 5405

基于MATLAB的直方图柱状图画法及特殊柱状图画法总结

MATLAB画二维柱状图,可以指定柱子的宽度,颜色,位置,二维特殊柱状图可以指定不同的形式进行区分,主要用于只能黑白打印的时候,需要形状区分,三维柱状图,指定柱状图颜色,位置,宽度,三维普通柱状图,三维特殊柱状图,三维随高度渐变颜色指定每个柱子颜色柱状图,三维随柱子高度整体颜色渐变柱状图...

abc991835105的博客 1万+

数字IC后端设计实现 | PR工具中到底应该如何控制density和congestion?(ICC2&Innovus)

数字IC后端设计实现中到底应该如何控制cell density和congestion?(ICC2和Innovus两种解决方案)

weixin_37584728的博客 7113

PLSQL Developer新手必看:如何避免安装过程中的常见坑

本文为PL/SQL Developer新手提供了详尽的安装与配置避坑指南。从版本选择、注册码使用、汉化包安装到Oracle客户端连接配置,逐一解析常见问题并提供解决方案,帮助开发者快速搭建稳定的PL/SQL开发环境,顺利开启Oracle数据库编程工作。

g9h0i1的博客 651

Origin科研绘图进阶:从数据导入到出版级图表的高效工作流与疑难解析

在数据可视化领域,掌握高效、标准化的绘图流程是提升科研与工程效率的关键。其核心在于理解软件底层的操作逻辑与数据映射原理,通过分离‘绘制’与‘美化’的关注点,实现图表的可复用性与精确控制。这种技术方法的价值在于能将繁琐的图表调整工作转化为可批量处理的流水线,显著提升从数据到成图的生产力。尤其在需要频繁产出出版级图表的科研论文、项目报告等场景中,一套稳健的工作流至关重要。本文聚焦于Origin软件,针对其高频痛点如‘坐标轴范围调整导致图形平移’、‘分组箱线图与图例排列’等,提供深度解析与根治方案,并系统阐述从数

weixin_30580341的博客 521

数据分享|1961-2017年中国0.25°×0.25° 逐日地表水文数据集(VIC-CN05.1)

其中,全球径流中心(University of New Hampshire and Global Runoff Data Centre, UNH/GRDC)的复合产流场集成了观测的河道径流和水量平衡模式模拟的地表和地下径流,常被用来评估模拟的径流。在长白山、海北灌丛和千烟洲通量站,模拟与观测的逐月潜热通量的平均NSE为0.61。VIC-CN05.1受益于较准确的大气驱动场、先进的地表水文参数化方案以及更真实丰富的土壤信息,可作为中国水文气象研究的参照数据,用于陆面模式的评估和长期的趋势分析等。

J_Giser的博客 1833

Plotly Express实战指南:一行代码生成交互式数据图表

交互式可视化是现代数据分析的核心能力,它让静态图表升级为可探索、可分享、可嵌入的动态叙事工具。其底层原理在于将数据绑定到图形元素(如x/y/color),通过JavaScript引擎实现实时悬停、缩放与筛选。技术价值体现在大幅降低前端交互开发门槛,使数据分析师无需掌握前端框架即可交付生产级可视化。典型应用场景包括业务看板、自动化报告、模型监控及协作式洞察分享。本文聚焦Python Plotly Express——这一专为Pandas设计的高阶可视化API,结合真实项目中的数据整形、参数精调与性能优化实践,系

weixin_33979203的博客 663

基于matlab的轴承损伤分析动力学建模仿真

高质量的轴承在正确的使用下,可以使用很长一段时间,如果过早的出现损伤,很可能是因为选型错误,使用不当或润滑不良造成的。因此,在安装轴承时,我们需要记录机器种类,安装部位,使用条件及周围配合。通过研究总结轴承损伤的类型,发生问题时的使用环境,以避免类似情况再次发生。轴承损伤方式按下述图片分类,我们可以图片中显示的主要特征来判断轴承损伤形式。01、压痕碰伤卡入固体异物或冲击造成的表面凹坑及安装是的擦伤◆固体异物侵入◆在倾斜状态下安装◆安装不良造成的撞击,脱落◆卡入剥离片◆改善安装、使用方法。

平时工作较为繁忙,私信消息一般晚上回复,谢谢大家~~ 2667

6、探索音乐结构中的统一性:贝多芬《英雄交响曲》第一乐章的深度剖析

本文深入剖析了贝多芬《英雄交响曲》第一乐章的音乐结构,探讨其统一性的来源及表现形式。通过主题与动机、和声与调性、旋律与节奏、织体与动态等多方面的分析,揭示了这部作品在技术层面和情感表达上的卓越成就。

b9c0d的博客 518

柱状图多维条形图vue_使用D3.js+Vue实现一个简单的柱形图

最近想在Vue的项目里尝试使用d3.js,封装一些常用的图表。这里记录一下自己搭建项目的过程,以及实现一个简单的柱形图。不了解D3的请移步,它是基于数据驱动文档工作方式的一款JavaScript函数库,主要用于网页作图、生成互动图形,是最流行的可视化库之一。说明采用Vue-cli脚手架快速搭建项目npm 安装 D3实现一个简单的柱形图项目搭建使用vue-cli搭建单页应用:D3安装(最新的v5版本...

weixin_39970369的博客 438

建行报专版报道建设银行金融科技发展历程

经过十多年的建设,总行前中后台部门都有了自己的业务系统,但系统“部门”特征显著,渠道、客户、产品的横向整合不足,产品系统层次化、结构化、参数化程度不高,渠道支持产品快速部署以及跨渠道服务能力不足,管理分析类系统建设相对滞后,系统较弱的可扩展能力在应对高速增长的交易量时已疲态尽显,同时安全稳定运行的压力和风险日益积聚。站在新的历史起点上,科技条线将聚焦主责主业,完善信息科技管理体系,紧紧围绕安全生产中心任务,持续推动技术能力复用共享和自主可控,为全行做好金融五篇大文章,推动业务高质量发展提供技术支撑。

银行信息系统应用架构详解 385

【Excel】两组行数不同数据做二维柱状图

两组数据的行数不同,并且有的字段项在另一表中没有,如何画二维柱状图呢?

qq_36148333的博客 3640

恒玄BES调试笔记-BES2500如何打开COMPEXP

打开Compressor and expander会占用资源,这个根据个人项目需求而定吧!打开方法,以及参数修改如下: config\best2300a_ibrt_anc\target.mk SPEECH_RX_COMPEXP ?= 1 apps\audioplayers\bt_sco_chain_cfg_default.c #if defined(SPEECH_RX_COMPEXP) /*****************************************************

leezs的博客 706

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

如何使用D3.js简单的制作可交互柱状图(完整代码)

前言 了解D3是什么,D3的基本用法 完成一个简易的可交互的柱状图 最近假期写了点东西,趁略有闲余之时,玩了一下D3,之前项目中主要是用各类charts,比如Echarts,诸如此类还有highCharts等,不过那种是用别人写好的库,添加好数据就完成了,就是配置的问题,这种类库最大的问题是定制很难,而D3是自己制作图形,可定制方面比较强,自由度很大,做完之后还是感觉很爽的 现在是数据时代,...

mclryan的博客 5811

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

使用d3.js动态获取数据文件,并进行垂直柱状图表渲染

一、最终效果截图: 二、动态返回的原始数据: 三、数据描述: 本地请求数据的名字:d3-data.csv HTML文件与d3-data.csv文件位置关系:在同一目录级别。 本地请求数据的内容:必须一行一条数据。 year,population 1953,5.94 1964,6.95 1982,10.08 1990,11.34 2000,12.66 2010,13.40 数据详情截图: 四、代码详情: <!DOCTYPE html> <htm...

xinxiaoyong的博客 1859

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

d3_v5.js绘制柱状图(可添加数据和实现排序功能)

这是博主用d3.js第一次绘制的图形,可以实现数据的添加和排序的功能,里面用到了线性比例尺和颜色比例尺等知识,后面都打了备注,因为时间的原因就不一个一个展开说了,源码放在下面,方便我管理也。

weixin_62268437的博客 586

d3柱形图响应鼠标事件(二)

发现一个问题,当d3为元素添加鼠标事件时,如果元素是被包含在symbol之中的,则鼠标事件不会得到响应。直接上代码,可以看到其中的rectback可以响应,但是柱形图中的rect并未得到响应 8.1.1 鼠标交互 .axis path, .axis line{ fill: none; stroke: black;

xiaozhu2hao的专栏 1336

js输入某一月内每一天的集合

getDaysArray(year, month) { let weeks = [ '周日', '周一', '周二', '周三', '周四', '周五', '周六' ]; let date = new Date(year, month - 1, 1); let result = []; while (date.getMonth() == month - 1) { result.push(year+"-"+month+"-"+date.getDate() + "(" + names[.

wgb0409的博客 286

d3.js——多柱体柱状图(v5)

一、页面引用 <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scal...

weixin_42095871的博客 1196
上一篇: D3 二维图表的绘制系列(二)基础柱状图
下一篇: D3 二维图表的绘制系列(四)堆叠柱状图
PAT-python-zjw
博客等级 码龄10年 381粉丝 408原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值