成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

d3入門(mén)篇(四):繪制完整柱狀圖添加過(guò)渡效果

Jason / 3472人閱讀

摘要:這篇學(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è)標(biāo)簽下,哪些元素是嵌套關(guān)系;

如果不采用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)行繪圖:
    
        //將x軸包裹在一個(gè)g標(biāo)簽下
        
        //將y軸包裹在一個(gè)g標(biāo)簽下
        
        //將整個(gè)柱狀圖的矩形及文字包裹在一個(gè)g標(biāo)簽下
        
            //將柱形圖的每個(gè)矩形與它相應(yīng)的值包裹在一個(gè)g標(biāo)簽下
            
                
                
            
        
    
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)簽下,所以繪制文字與繪制矩形的方法相同,在標(biāo)簽下添加標(biāo)簽,同時(shí)需要設(shè)定:
(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

相關(guān)文章

  • d3入門(mén)(三):比例尺坐標(biāo)軸

    摘要:為了根據(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ù)差異性很大的...

    tomato 評(píng)論0 收藏0
  • 聲明式與響應(yīng)式——前端新一代數(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ì),因此...

    xuhong 評(píng)論0 收藏0
  • SegmentFault 技術(shù)周刊 Vol.35 - WebGL:打開(kāi)網(wǎng)頁(yè)看大片

    摘要:在文末,我會(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...

    objc94 評(píng)論0 收藏0
  • 【數(shù)據(jù)科學(xué)系統(tǒng)學(xué)習(xí)】Python # 數(shù)據(jù)分析基本操作[三] matplotlib

    摘要:有一些表示常見(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 ...

    BDEEFE 評(píng)論0 收藏0
  • D3的一點(diǎn)理解

    摘要:的一點(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...

    ideaa 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<