D3 二维图表的绘制系列(三十)平行坐标系折线图-程序员宅基地

技术标签: D3.js 二维图表系列  d3  

上一篇: 径向树图

下一篇: 热力地图

代码结构和初始化画布的Chart对象介绍,请先看 这里

本图完整的源码地址: 这里

1 图表效果

在这里插入图片描述

2 数据

name,math,chinese,english,chemistry
小明,30,60,57,49
小红,50,95,65,65
小张,66,70,40,88

3 关键代码

导入数据

d3.csv('./data.csv', function(d){
    
    return {
    
        name: d.name,
        math: +d.math,
        chinese: +d.chinese,
        english: +d.english,
        chemistry: +d.chemistry
    };
}).then(function(data){
    
....

一些样式参数配置

const config = {
    
        lineColor: chart._colors(0),
        margins: {
    top: 80, left: 50, bottom: 50, right: 50},
        textColor: 'black',
        title: '平行坐标系折线图',
        hoverColor: 'red',
        padding: 120,
        animateDuration: 1000
    }

平行坐标系需要对每一个维度都生成一个度量尺度

/* ----------------------------尺度转换------------------------  */
    const fields =  ['math', 'chinese', 'english', 'chemistry'];
    chart.scales = d3.zip(...(data.map((item) => d3.permute(item, fields)))).map((subject) => {
    
        return d3.scaleLinear()
                    .domain([0, Math.floor(d3.max(subject)/10 + 1)*10])
                    .range([chart.getBodyHeight()*0.9, 0]);
    });

渲染坐标轴,注意各轴的横向偏移距离

 /* ----------------------------渲染坐标轴------------------------  */
    chart.renderAxis = function(){
    
        chart.scales.forEach((scale, index) => {
    
            chart.body()
                 .append('g')
                 .attr('class', 'axis axis-' + index)
                 .attr('transform', 'translate(' + (index+0.5) * config.padding + ',0)' )
                 .call(d3.axisLeft(scale).ticks(7));
        });
    }

渲染连线,运用d3.line快速画线

/* ----------------------------渲染线条------------------------  */
    chart.renderLines = function(){
    
        const lines = chart.body().append('g')
                                .attr('class', 'lines')
                                .selectAll('.line')
                                .data(data);

        const linesEnter = lines.enter()
                                .append('g')
                                .attr('class', 'line');

              linesEnter.append('path')
                            .attr('stroke', (d,i) => chart._colors(i % 10))
                            .attr('stroke-width', 2)
                            .attr('fill', 'none')
                            .attr('d', (d) => d3.line()(generatePoints(d)))

              linesEnter.append('text')
                            .attr('dx', '1em')
                            .attr('transform', (d,i) => 'translate(' + 3.5 * config.padding + ',' + chart.scales[chart.scales.length-1](d['chemistry'])+')' )
                            .text((d) => d.name)

              lines.exit()
                      .remove()

        function generatePoints(d) {
    
            return d3.permute(d, ['math', 'chinese', 'english', 'chemistry']).map((item, index) => {
    
                return [
                    (index+0.5) * config.padding,
                    chart.scales[index](item)
                ];
            });
        }

    }

大功告成!!!


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

在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zjw_python/article/details/102802154

智能推荐

推荐:偷懒利器 EmEditor-程序员宅基地

我喜欢的不是冒险。我知道自己喜欢什么。那是生活。——圣埃克絮佩里摘自《人的大地》EmEditor 是啥?它是一款和UltraEdit、EditPlus类似的文本编辑器。“KAO!有没有搞错,一个文本编辑器有啥好说的?!”“我已经用惯了UltraEditor和EditPlus,不想再换了,再见!”我想你肯定会这么说。以前我也用了很久的EditPlus,不过最近却转向EmEdit..._小贴士:在“replace”对话框中的“find”和“replace with”文本框的右侧各有一个

深度残差收缩网络(Deep Residual Shrinkage Networks for Fault Diagnosis )-程序员宅基地

深度残差收缩网络(Deep Residual Shrinkage Networks for Fault Diagnosis )_深度残差收缩网络

.NET Core+WebApi+EF访问数据新增用户数据-程序员宅基地

新建一个.NET Core项目,我使用的IDE是VS2019依次创建三个Core类库:第一个命名api.Model,第二个api.Common,第三个api.Bo解释一下这个三类库的作用:第一个Model,主要存放一些数据库连接字符串,ORM实体类等第二个Common,主要存放一些公共类,文件上传,md5加密文件等第三个Bo,处理一些业务逻辑的事情,比如将用户信息存放...

The Start-Run Line_runline-程序员宅基地

转自:http://commandwindows.com/runline.htm The "Run" line in the Start menu can be used to speed up access to a whole variety of functions. Some examples of the shortcuts that are available are discussed here.Introduction to the Run LineThe Run command l_runline

quartus 中工程建好后怎么修改其工程名_quartus怎么改工程名-程序员宅基地

quartus 中工程建好后怎么修改其工程名_quartus怎么改工程名

利用python对b站某GPT-4解说视频的近万条弹幕进行爬取、数据挖掘、数据分析、弹幕数量预测及情绪分类_python爬取b站弹幕并进行数据分析-程序员宅基地

近期,GPT-4在网络上引起了轩然大波,b站上也出现了许许多多关于GPT-4的解说视频,其中有一个解说视频受到了网友的热烈追捧,目前已填充有2万多的弹幕,这也引起了本人的极大兴趣,因此对该视频的弹幕进行了爬取,并记录于mysql数据库中,以进行数据分析、数据挖掘、弹幕数量预测和情绪分类等等。话不多说,正文开始。_python爬取b站弹幕并进行数据分析

随便推点

ERROR:VFS cannot open root device or unknown block, please append a correct root= option-程序员宅基地

I built my own kernel and tried it out, but when I rebooted my system it paniced right after giving me this error message: VFS cannot open root device or unknown block, please append a correct root=_please append a correct root

DUX7.5大前端WordPress主题开源无限制版_wordpress大前端主题_源码庄的博客-程序员宅基地

️ 编号:ym246️ 品牌:WordPress️ 语言:PHP️ 大小:2MB️ 类型:DUX7.5大前端️ 支持:pc+wap???? 欢迎免费领取(注明编号) ???? 源码介绍DUX7.5大前端主题,WordPress大前端主题,适合小而美的文章站。值得一提的更新:重新设计主列表展示样式不得不说,之前的列表略显单薄,且图标太多会影响视觉重心,这次的主列表重新设计希望能够得到多数人的喜爱。一直以来,主列表的设计决定了一个主题的逼格,因为几乎全部的列表页都会用到,这次的_wordpress大前端主题

python脚本实现xlsx文件分析-程序员宅基地

python脚本实现xlsx文件解析环境配置:1.系统环境:Windows 7 64bit 2.编译环境:Python3.4.3 3.依赖库: os sys xlrd re 4.其他工具:none 5.前置条件:待处理的xlsx文件脚本由来最近的工作是做测试,而有一项任务呢,就是分析每天机器人巡检时采集的数据,包括各种传感器,CO2、O2、噪声等等,每天的数据也有上千条,通过站控的导出数据

数据库小结-程序员宅基地

1、关系型数据库(只是一个保存数据的容器) 关系模型是把世界看作是由实体和联系组成的,而关系型数据库是将数据库表作为实体,以数据库的主键和外键的关联关系描述的一种数据库结构 表之间的关联关系:①一对一关系:一条主表记录对应一条从表记录,同时一条从表记录也对应一条主表记录 ②一对多关系:一条主表记录对应多条_数据库小结

常用的MySQL数据库命令大全_数据库表 custom-程序员宅基地

常用的MySQL命令大全第 1 一、连接MySQL格式: mysql -h主机地址 -u用户名 -p用户密码1、例1:连接到本机上的MYSQL。首先在打开DOS窗口,然后进入目录 mysqlbin,再键入命令mysql -uroot -p,回车后提示你输密码,如果刚安装好MYSQL,超级用户root是没有密码的,故直接回车即可进入到MYSQL中了,MYSQL的提示符是: m_数据库表 custom

文本框获得焦点时选中文本框中的文字-程序员宅基地

function test(){var test=document.getElementById("test");test.select();//选中框中的所有文本;}