摘要:這篇學(xué)習(xí)筆記是入門(mén)篇的最后一部分,將前幾篇的內(nèi)容整合到一起,繪制帶過(guò)渡效果的柱狀圖,這次先給大家看一下結(jié)果圖。
這篇學(xué)習(xí)筆記是入門(mén)篇的最后一部分,將前幾篇的內(nèi)容整合到一起,繪制帶過(guò)渡效果的柱狀圖,這次先給大家看一下結(jié)果圖。
結(jié)果
前言先放結(jié)果圖是想反饋一下在整合基礎(chǔ)知識(shí)繪制完整柱狀圖遇到的幾個(gè)問(wèn)題:
整個(gè)柱狀圖的布局,比如哪些元素包在一個(gè)
如果不采用translate,transform?翻轉(zhuǎn)height屬性的值,如何讓矩形正常方向顯示;
如何繪制文字;
如何為柱狀圖添加過(guò)渡效果;
坐標(biāo)軸的位置如何確定,x軸如何劃分刻度,如何讓刻度顯示在矩形的正下方;
?。。?! 接下來(lái)將逐個(gè)解決上述出現(xiàn)的問(wèn)題?。。。?/p> Problem1:柱狀圖的整體布局
Solution
(1)為了繪制時(shí),圖形四周留有空白區(qū)域,我們首先設(shè)置一個(gè)padding值; var padding={top:40,bottom:40,left:40,right:40};//定義間隔 (2)我們考慮在svg畫(huà)布上進(jìn)行繪制,采用如下的結(jié)構(gòu)進(jìn)行繪圖:Problem2:如何按照垂直向上的方向顯示矩形
Solution
之前的幾篇文章我都是通過(guò)transform變換實(shí)現(xiàn)了矩形的翻轉(zhuǎn),這篇文章介紹一個(gè)新的思路。
首先確定一個(gè)矩形需要四要素(x,y,width,height),同時(shí)我們需要注意,畫(huà)布的坐標(biāo)軸方向?yàn)樗较蛴液痛怪毕蛳隆eight是我們數(shù)據(jù)可視化的展示部分,即數(shù)據(jù)的綁定部分,x,y確定了繪制矩形的左上角坐標(biāo)。
這里提供一個(gè)思路:
如果按照正常垂直向下的方向繪制矩形時(shí),要求矩形的bottom處在同一水平線上,y+height==固定值;也就是數(shù)據(jù)(height)大的部分,我們希望矩形的繪制起始點(diǎn)(y)的值較小,數(shù)據(jù)?。╤eight)的部分,我們希望矩形的繪制起始點(diǎn)(y)的值較大。
因此我們可以通過(guò)定義比例尺完成這個(gè)功能,將dataset中大的數(shù)值,映射出range中小的數(shù)值。
//定義y方向比例尺 var yScale=d3.scaleLinear() .domain([0,d3.max(dataset)]) .range([height-padding.top-padding.bottom,0]); //定義y的值 .attr("y",function (d,i) { return yScale(d) }) //定義height .attr("height",function (d,i) { return height-padding.top-padding.bottom-yScale(d); }) 可以看出來(lái)‘y’+‘height’==height-padding.top-padding.bottom(這是一個(gè)固定的值)Problem3:如何繪制文字
Solution
在Problem1中已經(jīng)解決的布局方案問(wèn)題,我們的方法是將矩形與文字包在一個(gè)g標(biāo)簽下,所以繪制文字與繪制矩形的方法相同,在
(1)文字的顯示位置:x,y
(2)文本信息:text
(3)文字位置的偏移值:dx,dy
graph.append("text") .style("fill","pink") .attr("x",function(d,i){ return xScale(i); }) .text(function (d) { return d }) .attr("y",function (d,i) { return yScale(d); })Problem4:如何為柱狀圖添加過(guò)渡效果
Solution
為柱狀圖添加過(guò)渡效果,我們需要調(diào)用以下API:
.transition():為這個(gè)元素添加過(guò)渡;
.duration():設(shè)定元素從起始狀態(tài)到終止?fàn)顟B(tài)的過(guò)渡時(shí)間;
.delay():設(shè)定元素執(zhí)行過(guò)渡效果的時(shí)間間隔;
.ease():設(shè)定過(guò)渡的動(dòng)畫(huà)效果;
在為元素添加過(guò)渡效果時(shí),初始狀態(tài),終止?fàn)顟B(tài)尤為重要,柱狀圖為例分析一下元素的兩個(gè)狀態(tài):
明確柱形圖為每個(gè)矩形添加過(guò)渡時(shí),只有兩個(gè)屬性值需要改變,一個(gè)是y的值,一個(gè)是height的值;
起始狀態(tài):柱狀圖的起始狀態(tài)非常好理解,就是矩形不顯示的狀態(tài),即y值設(shè)定為前文提到的固定值,height設(shè)定為0;
終止?fàn)顟B(tài):柱狀圖的終止?fàn)顟B(tài)應(yīng)該是矩形元素和文字都可視化固定顯示出來(lái),即為正常綁定元素時(shí)設(shè)定的相關(guān)屬性值。
//為矩形添加過(guò)渡效果 .attr("y",function (d) { var min=yScale.domain()[0]; return yScale(min); }) .attr("height",function(d,i){ return 0; }) .transition() .duration(2000) .delay(function(d,i){ return i*400; }) .ease(d3.easeBackOut) .attr("y",function (d,i) { return yScale(d) }) .attr("height",function (d,i) { return height-padding.top-padding.bottom-yScale(d); })Problem5:格式化顯示坐標(biāo)軸
Solution
在開(kāi)始學(xué)習(xí)坐標(biāo)軸的時(shí)候,只實(shí)現(xiàn)了添加y軸,在這次完整柱狀圖實(shí)現(xiàn)中,嘗試添加x軸卻遇到了問(wèn)題。在這個(gè)例子中我們一共綁定了8個(gè)數(shù)據(jù),那么如何讓x軸的刻度均勻的顯示在每個(gè)矩形的下方呢?
在定義x軸的時(shí)候我用了ScaleBand()這個(gè)方法:
//在range返回等差數(shù)列 var xScale=d3.scaleBand() .domain(d3.range(dataset.length)) .rangeRound([0,dataset.length*(rectWidth+(rectPadding/2))]); var xAxis=d3.axisBottom(xScale) .ticks(5);
既然比例尺返回一個(gè)等差數(shù)列,所以我們要求在柱狀圖區(qū)域,每個(gè)矩形和空白間隔這個(gè)整體是相同的,所以我的實(shí)現(xiàn)是每個(gè)矩形左右各是半個(gè)rectPadding。先設(shè)置x的值,然后width設(shè)置成矩形寬度減去半個(gè)間隔。(不理解的可以自己畫(huà)一張圖就可以了)
.attr("x",function (d,i) { return (i*rectWidth)+(i+1)*(rectPadding/2); }) .attr("width",rectWidth-rectPadding/2)
代碼部分
import * as d3 from "d3"; var dataset = [45, 70, 12, 79, 4, 127, 33, 150]; var width = 600;//svg畫(huà)布寬 var height = 600;//svg畫(huà)布高 var rectWidth = 50;//每個(gè)矩形的默認(rèn)寬度 var rectPadding=10;//每個(gè)矩形間的間隔 var padding={top:40,bottom:40,left:40,right:40};//定義間隔 //定義畫(huà)布 var svg = d3.select("body") .append("svg") .attr("width", width) .attr("height", height) .style("background-color", "yellow"); //定義矩形比例尺 var yScale=d3.scaleLinear() .domain([0,d3.max(dataset)]) .range([height-padding.top-padding.bottom,0]); var yAxis=d3.axisLeft(yScale) .ticks(5); svg.append("g") .attr("transform",`translate(${padding.top},${padding.left})`) .call(yAxis); var xScale=d3.scaleBand() .domain(d3.range(dataset.length)) .rangeRound([0,dataset.length*(rectWidth+(rectPadding/2))]); var xAxis=d3.axisBottom(xScale) .ticks(5); svg.append("g") .attr("transform",`translate(${padding.left},${height-padding.top})`) .call(xAxis); //定義矩形 var g=d3.selectAll("svg") .append("g") .attr("transform",`translate(${padding.top},${padding.left})`); var graph=g.selectAll("rect") .data(dataset) .enter() .append("g"); graph.append("rect") .style("fill","blue") .attr("x",function (d,i) { return (i*rectWidth)+(i+1)*(rectPadding/2); }) .attr("width",rectWidth-rectPadding/2) .attr("y",function (d) { var min=yScale.domain()[0]; return yScale(min); }) .attr("height",function(d,i){ return 0; }) .transition() .duration(2000) .delay(function(d,i){ return i*400; }) //.ease(d3.easeBackOut) .attr("y",function (d,i) { return yScale(d) }) .attr("height",function (d,i) { return height-padding.top-padding.bottom-yScale(d); }) graph.append("text") .style("fill", "pink") .attr("x", function (d, i) { return (i * rectWidth) + (i + 1) * (rectPadding / 2); }) .attr("dx", 10) .attr("y", function (d) { var min = d3.min(dataset); return yScale(min) }) .text(function (d) { return d }) .transition() .duration(2000) .delay(function (d, i) { return i * 400; }) .attr("y", function (d, i) { return yScale(d); })附錄
接下來(lái)會(huì)寫(xiě)進(jìn)階篇的學(xué)習(xí)筆記
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/100135.html
摘要:為了根據(jù)顯示刻度靈活變化寬高,而不是定死,特別是數(shù)據(jù)差異性很大的時(shí)候,我們希望圖表顯示范圍都在畫(huà)布里面,這時(shí)就會(huì)引入比例尺的概念來(lái)進(jìn)行縮放。根據(jù)這些規(guī)則,會(huì)為我們返回一個(gè)比例尺函數(shù)。 這篇文章繼續(xù)介紹d3的基礎(chǔ)知識(shí) 比例尺 在繪制柱狀圖時(shí),我們往往會(huì)定義很大的畫(huà)布,然而我們要可視化的數(shù)據(jù)確很小,這時(shí)會(huì)出現(xiàn)很多留白 的情況。為了根據(jù)顯示刻度靈活變化寬高,而不是定死,特別是數(shù)據(jù)差異性很大的...
摘要:數(shù)據(jù)可視化圖表圖表作為數(shù)據(jù)可視化最常見(jiàn)的表現(xiàn)形式之一,往往被以偏概全的認(rèn)為圖表就是數(shù)據(jù)可視化。嚴(yán)格來(lái)說(shuō),數(shù)據(jù)可視化應(yīng)該是連接數(shù)據(jù)與視覺(jué)的一個(gè)映射關(guān)系,將數(shù)據(jù)映射成人更容易感知其規(guī)律的可視化結(jié)果。 題目中的新一代是個(gè)相對(duì)的概念,事實(shí)上本文即將介紹的方法已經(jīng)有了生產(chǎn)環(huán)境可用的實(shí)現(xiàn)方案(這也側(cè)面佐證了其可行性),但考慮到此方法與現(xiàn)在大部分前端項(xiàng)目中所使用的數(shù)據(jù)可視化方案相比仍有一些優(yōu)勢(shì),因此...
摘要:在文末,我會(huì)附上一個(gè)可加載的模型方便學(xué)習(xí)中文藝術(shù)字渲染用原生可以很容易地繪制文字,但是原生提供的文字效果美化功能十分有限。 showImg(https://segmentfault.com/img/bVWYnb?w=900&h=385); WebGL 可以說(shuō)是 HTML5 技術(shù)生態(tài)鏈中最為令人振奮的標(biāo)準(zhǔn)之一,它把 Web 帶入了 3D 的時(shí)代。 初識(shí) WebGL 先通過(guò)幾個(gè)使用 Web...
摘要:有一些表示常見(jiàn)圖形的對(duì)象稱(chēng)為塊,完整的集合位于。中的繪圖函數(shù)在中,有行標(biāo)簽列標(biāo)簽分組信息。密度圖通過(guò)計(jì)算可能會(huì)產(chǎn)生觀測(cè)數(shù)據(jù)的連續(xù)概率分布的估計(jì)而產(chǎn)生的。在探索式數(shù)據(jù)分析工作中,同時(shí)觀察一組變量的散布圖是很有意義的。 我們?cè)谏弦黄榻B了 pandas,本篇介紹 matplotlib。 繪圖和可視化 一個(gè)用于創(chuàng)建出版質(zhì)量圖表的桌面繪圖包。 Matplotlib API入門(mén) Figure ...
摘要:的一點(diǎn)理解用其官網(wǎng)的話來(lái)說(shuō)是一個(gè)用于數(shù)據(jù)可視化的庫(kù)。其將數(shù)據(jù)與綁定,通過(guò)建立數(shù)據(jù)與元素樣式之間的關(guān)系,來(lái)表現(xiàn)數(shù)據(jù),實(shí)現(xiàn)可視化。它也是上星第多的庫(kù)。 D3的一點(diǎn)理解 D3 用其官網(wǎng)的話來(lái)說(shuō): D3.js is a JavaScript library for manipulating documents based on data. D3 helps you bring data to...
閱讀 2903·2021-09-28 09:45
閱讀 1562·2021-09-26 10:13
閱讀 969·2021-09-04 16:45
閱讀 3751·2021-08-18 10:21
閱讀 1162·2019-08-29 15:07
閱讀 2695·2019-08-29 14:10
閱讀 3215·2019-08-29 13:02
閱讀 2526·2019-08-29 12:31