d3.js學(xué)習(xí)筆記

使用D3查詢SVG

  • d3.select(...)
d3.select('#rect1')
d3.select('#maingroup rect')
  • d3.selectAll(...)
d3.selectAll('.rect1')
d3..selectAll('rect')
d3.selectAll('#maingroup rect'')

使用D3設(shè)置SVG中的屬性

  • element.attr(‘a(chǎn)ttr_name’, ‘a(chǎn)ttr_value’)
  • 常見的屬性:
    id牍蜂,class,
    x蜂奸, y浸剩, cx符喝, cy杠氢,
    fill沪饺, stroke者甲,
    width怜姿,height慎冤,r,
    transform -> translate, rotate, scale
<rect id="test" class="test" stroke="black" width="60" height="60" fill="#000" x="300" y="300"></rect>
// 設(shè)置元素屬性
d3.select('.test').attr('x', '100');
// 鏈式調(diào)用沧卢,.attr(…)返回的是選擇的圖元本身
d3.select('svg').attr('width', '100').attr('height', '100').attr('x', '300').attr('y', '300');
// 獲取元素屬性
const svgWidth = d3.select('svg').attr('width');
  • 修改組屬性:
d3.select('#group').attr('transform', 'translate(100, 100)');

使用D3添加&刪除SVG中的屬性

  • element.append(...)
const myRect = d3.select('#test').append('rect').attr('x', '100');
const wrap = d3.select('#wrap').append('g').attr('id', 'group');
// 鏈式調(diào)用
const myRect = d3.select('.wrap').append('g').attr('id', 'group')
.append('rect').attr('fill', 'black').attr('width', '100').attr('height', '100');
  • element.remove(...)
d3.select('rect').remove()

D3數(shù)據(jù)讀取- csv數(shù)據(jù)

  • d3.csv(...) 是異步函數(shù)
d3.csv('test.csv').then(res => {
  console.log(data)
})

D3數(shù)值計算

  • d3.max(array) // 返回數(shù)組中的最大值
  • d3.min(array) // 返回數(shù)組中的最小值
  • d3.extent(array) // 同時返回最小值與最大值蚁堤,以數(shù)組的形式
d3.max([1, 2, 3, 5, 4]) // 5
d3.min([1, 2, 3, 5, 4]) // 1
d3.extent([1, 2, 3, 5, 4]) // [1, 5]
const arr = [
  {
      name: 'zhangsan',
      age: 20
    },
    {
      name: 'lisi',
      age: 30
    },
    {
      name: '王五',
      age: 40
    },
  ]

  // 回調(diào)函數(shù)形式
  const maxAge = d3.max(arr, d => d.age) // 40
  const minAge = d3.min(arr, d => d.age) // 20
  const ageArange = d3.extent(arr, d => age) // [20, 40]

D3線性比例尺

  • 比例尺用于把實際數(shù)據(jù)空間映射到屏幕(畫布)空間,即兩個空間的轉(zhuǎn)化
  • d3.scaleLinear():
    1但狭、 定義一個線性比例尺披诗,返回的是一個函數(shù)。
    2立磁、eg: let scale = d3.scaleLinear(); // scale為函數(shù)
  • scale.domain([min_d, max_d]).range([min, max]):
    1呈队、設(shè)置比例尺的定義域與值域。
    2唱歧、線性比例尺的定義域和值域都是連續(xù)的宪摧,需分別給出最大值與最小值。
    3迈喉、const scale = d3.scaleLinear().domain([0, 100]).range([0, 1000]);
  • 比例尺本質(zhì)上是一個函數(shù):
const scale = d3.scaleLinear().domain([0, 100]).range([0, 1000]);
console.log(scale(50)) // 500
console.log(scale(70)) // 700
  • 常結(jié)合讀取的數(shù)據(jù)與d3.max等接口連用:
  const arr = [
    {
      name: 'zhangsan',
      age: 20
    },
    {
      name: 'lisi',
      age: 30
    },
    {
      name: '王五',
      age: 40
    },
  ]

  const xScale = d3.scaleLinear()
    .domain([0, d3.max(arr, d => d.age)])
    .range([0, innerWidth])

D3Band比例尺

  • d3.scaleBand():
    1绍刮、定義一個‘條帶’比例尺,返回的是一個函數(shù)挨摸。
    2孩革、eg: let scale = d3.scaleBand();
  • scale.domain(array).range([min, max]):
    1、設(shè)置比例尺的定義域與值域得运。
    2膝蜈、Band比例尺的定義域是離散的,值域是連續(xù)的熔掺。
const scale = d3.scaleBand().domain(['test1'饱搏,'test2', 'test3']).range([0, 120]);
console.log(scale('test2')) // 40
console.log(scale('test3')) // 80
  • 常結(jié)合array.map接口一起使用:
  const arr = [
    {
      name: 'zhangsan',
      age: 20
    },
    {
      name: 'lisi',
      age: 30
    },
    {
      name: '王五',
      age: 40
    },
  ]

  const yScale = d3.scaleBand()
    .domain(arr.map(d => d.name))
    .range([0, innerHeight])
    .padding(0.1)

坐標(biāo)軸

  • 定義坐標(biāo)軸(獲得結(jié)果仍是函數(shù))
    1置逻、const yAxis = d3.axisLeft(yScale);
    2推沸、const xAxis = d3.axisBottom(xScale);
    3、axisLeft:左側(cè)坐標(biāo)軸
    4鬓催、axisBottom:底側(cè)坐標(biāo)軸肺素。
    5、坐標(biāo)軸的刻度對應(yīng)比例尺的定義域宇驾。
    5倍靡、坐標(biāo)軸在畫布的繪制對應(yīng)比例尺的值域。
  • 繪制坐標(biāo)軸:
    1课舍、const yAxisGroup = g.append('g').call(yAxis);
    2塌西、const xAxisGroup = g.append('g').call(xAxis);
  • 任何坐標(biāo)軸在初始化之后會默認放置在坐標(biāo)原點,需要進一步的平移

引入坐標(biāo)軸 - Margin

const margin = {top: 60, right: 30, bottom: 60, left: 200}
const innerWidth = width - margin.left - margin.right;
const innerHeight = height - margin.top - margin.bottom;
const g = svg.append('g').attr('id', 'maingroup')
.attr('transform', `translate(${margin.left}, ${margin.top})`);

Data-Join

  • 本質(zhì)上是將數(shù)據(jù)與圖元進行綁定
  • data(…)只考慮數(shù)據(jù)和圖元數(shù)目相同的情況
  • 調(diào)用形式:d3.selectAll(‘.class’).data(myData).join(‘圖元’).attr(d => …).attr((d, i) => …)
  • .join(…)會根據(jù)數(shù)據(jù)的條目補全or刪除圖元筝尾。
  • 若有新增的數(shù)據(jù)捡需,則會自動增加對應(yīng)圖元。
  • 若有修改的數(shù)據(jù)筹淫,則會自動更新對應(yīng)圖元栖忠。
  • 若有刪除的數(shù)據(jù),則會自動移除對應(yīng)圖元贸街。

Data-Join – 用函數(shù)設(shè)置圖元屬性

  • 通過值設(shè)置屬性
d3.select('rect').attr('attrbuteName', 'value')
  • 通過函數(shù)設(shè)置屬性,函數(shù)的輸入為綁定的數(shù)據(jù)狸相,返回值為圖元得到的屬性值
d3.selectAll('rect').attr('width', (d, i) => d.age * 1000 )
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末薛匪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子脓鹃,更是在濱河造成了極大的恐慌逸尖,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瘸右,死亡現(xiàn)場離奇詭異娇跟,居然都是意外死亡,警方通過查閱死者的電腦和手機太颤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門苞俘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人龄章,你說我怎么就攤上這事吃谣。” “怎么了做裙?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵岗憋,是天一觀的道長。 經(jīng)常有香客問我锚贱,道長仔戈,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮监徘,結(jié)果婚禮上晋修,老公的妹妹穿的比我還像新娘。我一直安慰自己耐量,他們只是感情好飞蚓,可當(dāng)我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著廊蜒,像睡著了一般趴拧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上山叮,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天著榴,我揣著相機與錄音,去河邊找鬼屁倔。 笑死脑又,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的锐借。 我是一名探鬼主播问麸,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼钞翔!你這毒婦竟也來了严卖?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤布轿,失蹤者是張志新(化名)和其女友劉穎哮笆,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體汰扭,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡稠肘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了萝毛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片项阴。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖笆包,靈堂內(nèi)的尸體忽然破棺而出鲁冯,到底是詐尸還是另有隱情,我是刑警寧澤色查,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布薯演,位于F島的核電站,受9級特大地震影響秧了,放射性物質(zhì)發(fā)生泄漏跨扮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望衡创。 院中可真熱鬧帝嗡,春花似錦、人聲如沸璃氢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽一也。三九已至巢寡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間椰苟,已是汗流浹背抑月。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留舆蝴,地道東北人谦絮。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像洁仗,于是被迫代替她去往敵國和親层皱。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內(nèi)容