d3.js v5 实现类汉诺塔结构的数据可视化 「爱情、让人受尽委屈。」 2022-01-23 05:07 165阅读 0赞 ## 背景 ## 需求要实现一个类似于汉诺塔的结构,但是还有一点不一样,每一层的大小是打乱的,不是按照顺序排列的,塔的两侧是两个同类别但是不同值的属性值,这个图的作用主要用来对比两个“实体”的所有属性的值。 ![汉诺塔][2019060214293190.png_pic_center] ## 设计 ## 在实际设计的时候,发现每个“实体”50个属性值,其中属性值可以分为两类: 1. 定性类:比如派系,类别等属性,这一类属性统称为定性类,一般在可视化设计的时候,用颜色映射。 2. 定量类:比如流量,大小,方向等数值类的属性统称为定量类,一般在可视化设计的时候,用长短,或者大小来映射。 > 有了这些设计,那么方案也就出来了,就是设计一个汉诺塔结构的坐标轴,一直竖直方向,一个横向等坐标轴,竖直方向的轴放在中间,如下图所示。然后就是两侧采用不用方向的横向条形图来可视化,数值类属性的条形图全部采用刚蓝色显示,将具体的数值使用颜色来映射。定性类属性采用颜色映射,所以条形图在表示定性类属性的时候,长度全部是最大值。 ![坐标轴设计图片][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxOTk3ODQzOTEx_size_16_color_FFFFFF_t_70] ## 核心代码 ## #### 1. 绘制坐标轴 #### 添加svg let self = this; self.infoSvg = d3 .select("#attr-compare-div") .append("svg") .attr("class", "infosvg") .attr("width", "400px") .attr("height", "790px"); 设置x轴缩放,绘制x轴 let xScale = d3 .scaleBand() .domain(["当前节点", "对比节点"]) .range([20, self.InfoSvgWidth]); let xAxis = self.infoSvg .append("g") .attr("class", "xAixs") .attr("transform", "translate(0, " + self.InfoSvgHeight + ")") .call(d3.axisBottom(xScale)); 设置y轴缩放,绘制y轴 let yNumNameList = []; for (let index = 1; index <= 30; index++) { yNumNameList.push("num" + index); } for (let index = 1; index <= 20; index++) { yNumNameList.push("culster" + index); } console.log(yNumNameList); self.yAxisScale = d3 .scaleBand() .domain(yNumNameList) .range([0, self.InfoSvgHeight]); let yAxis = self.infoSvg .append("g") .attr("class", "yAixs") .attr("transform", "translate(" + self.InfoSvgWidth * 0.5 + ",0)") .call(d3.axisLeft(self.yAxisScale)); #### 2. 绘制横向条形图 #### 首先添加svg let barChartSvgLeft = d3 .select(".infosvg") .append("g") .attr("class", "barChartSvgLeft"); 处理数据,将50个属性放在list中 let currAllData = []; currAllData.push(...node.attr_num_list); currAllData.push(...node.attr_culster_list); 绘制横向条形图 let bar = barChartSvgLeft .selectAll(".bar_left") .data(currAllData) .enter() .append("rect"); bar .attr("x", function(d, i) { if (i <= 29) { return 0.5 * self.InfoSvgWidth - self.infoSvgXScaleList[i](d.value); } else { return 0; } }) .attr("y", function(d, i) { return i * self.yScaleBandWidth; }) .attr("width", function(d, i) { if (i <= 29) return self.infoSvgXScaleList[i](d.value); else return self.InfoSvgWidth / 2; }) .attr("height", function(d, i) { return self.yScaleBandWidth - 2; }) .attr("fill", function(d, i) { if (i <= 29) return "steelblue"; else { // console.log(self.colorScale(d.value)); return self.colorScale(d.value); } }); 需要重新绘制Y轴,这样就不会被条形图遮挡 if (!d3.selectAll(".yAixs").empty()) { d3.selectAll(".yAixs").remove(); } //需要重新绘制Y轴,这样就不会被条形图遮挡 let yAxis = self.infoSvg .append("g") .attr("class", "yAixs") .attr("transform", "translate(" + self.InfoSvgWidth * 0.5 + ",0)") .call(d3.axisLeft(self.yAxisScale)); 设置条形图文字 barChartSvgLeft .selectAll(".bar-text") .data(currAllData) .enter() .append("text") .text(function(d) { return d.value; }) .attr("x", function(d, i) { // console.log("x is "+0.5*self.InfoSvgWidth-self.infoSvgXScaleList[i](d.value)); if (i <= 29) return 0.5 * self.InfoSvgWidth - self.infoSvgXScaleList[i](d.value); else return 0; }) .attr("y", function(d, i) { // console.log("y is "+(i*self.yScaleBandWidth-self.yScaleBandWidth/2)); return i * self.yScaleBandWidth + self.yScaleBandWidth / 2 + 4; }) .attr("fill", "white"); ## 最终效果图 ## ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxOTk3ODQzOTEx_size_16_color_FFFFFF_t_70 1] [2019060214293190.png_pic_center]: /images/20220123/b03190e877014b90b2abc6616aa471de.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxOTk3ODQzOTEx_size_16_color_FFFFFF_t_70]: /images/20220123/7b4729027ea64205bb7c3ab3215c1c99.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxOTk3ODQzOTEx_size_16_color_FFFFFF_t_70 1]: /images/20220123/32f6430424704c9d870c73d07534f6fd.png
相关 JS实现汉诺塔问题 汉诺塔是一道经典的递归编程的经典题 题目要求: 汉诺塔问题来自一个古老的传说:在世界刚被创建的时候有一座钻石宝塔(塔A),其上有64个金碟。所有碟子按从大到小的次序从塔底堆 向右看齐/ 2023年10月11日 11:48/ 0 赞/ 20 阅读
相关 数据结构--汉诺塔问题 数据结构–汉诺塔问题 我列举了两种解法—递归和非递归 1、这是递归解法 include<iostream> using namespa 清疚/ 2023年07月03日 14:29/ 0 赞/ 110 阅读
相关 汉诺塔 在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的6 浅浅的花香味﹌/ 2022年08月25日 05:28/ 0 赞/ 233 阅读
相关 汉诺塔 Problem Description 汉诺塔(又称河内塔)问题是印度的一个古老的传说。 开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒A、B和C,A上面套着 Dear 丶/ 2022年06月17日 05:28/ 0 赞/ 299 阅读
相关 汉诺塔V Problem Description n个盘子的汉诺塔问题的最少移动次数是2^n-1,即在移动过程中会产生2^n个系列。由于 发生错移产生的系列就增加了,这种 小鱼儿/ 2022年05月28日 06:37/ 0 赞/ 76 阅读
相关 汉诺塔 def move(n, a, b, c): if n == 1: \ 如果a只有1盘子 print(a, '-->', c); \ 直接把盘子从a移到c els 迷南。/ 2022年05月18日 22:25/ 0 赞/ 313 阅读
相关 数据结构之汉诺塔 汉诺塔栈 include <stdio.h> include <stack> //递归实现 void hanoi_W 落日映苍穹つ/ 2022年05月06日 16:28/ 0 赞/ 157 阅读
相关 d3.js v5 实现类汉诺塔结构的数据可视化 背景 需求要实现一个类似于汉诺塔的结构,但是还有一点不一样,每一层的大小是打乱的,不是按照顺序排列的,塔的两侧是两个同类别但是不同值的属性值,这个图的作用主要用来对比两个 「爱情、让人受尽委屈。」/ 2022年01月23日 05:07/ 0 赞/ 166 阅读
相关 汉诺塔 include <iostream> using namespace std; int main() { void hanno(int 冷不防/ 2021年09月29日 12:14/ 0 赞/ 454 阅读
还没有评论,来说两句吧...