D3.js 系列 (一) D3 簡介 + Observable -- D3 在線開發(fā)編輯工具簡介

版權(quán)聲明:本文為博主原創(chuàng)文章橘荠,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議个扰,轉(zhuǎn)載請附上原文出處鏈接和本聲明了嚎。

D3 VS jQuery

剛開始接觸 D3,很容易會聯(lián)想到 jQuery咧七,因為他們在操作元素的語法很相似衰齐。網(wǎng)上有這樣一個問題:What is the difference between D3 and jQuery?

回答:

  • D3 is data-driven but jQuery is not: with jQuery you directly manipulate elements, but with D3 you provide data and callbacks through D3’s unique data(), enter() and exit() methods and D3 manipulates elements.
  • D3 is usually used for data visualization but jQuery is used for creating web apps. D3 has many data visualization extensions and jQuery has many web app plugins.
  • Both are JavaScript DOM manipulation libraries, have CSS selectors and fluent API and are based on web standards which makes them look similar.

粗譯:

  • D3 是數(shù)據(jù)驅(qū)動的,而 jQuery 不是继阻。jQuery 只是操作元素耻涛,D3 不僅可以操作元素,還可以使用其特有的 data(), enter() and exit() 方法提供數(shù)據(jù)和回調(diào)瘟檩。
  • D3 應(yīng)用于數(shù)據(jù)可視化抹缕,jQuery 應(yīng)用于網(wǎng)頁開發(fā)。D3 有很多數(shù)據(jù)可視化擴展插件墨辛,而 jQuery 有很多 web app 插件卓研。
  • 兩者都是 DOM 操作類 JS 庫,都擁有 CSS 樣式選擇器和流暢的 API 且建立在 web 標準上,故而有些相似奏赘。


1. 這里先提示一個小的 error寥闪,也許將來你在開發(fā)中也會遇到:

c-error.png

-- Error: Access to XHTMLHttpRequest at 'file/...' from origin 'null' has been blocked by CORS policy. ......

這個問題的出現(xiàn)是因為使用 file 協(xié)議打開,而 Chrome 不支持這樣訪問磨淌。

解決方案:本地部署 web

  • 安裝 http-server
npm i http-server -g
  • cd 到 index.html 文件的目錄下橙垢,然后執(zhí)行命令:
http-server

啟動成功會顯示如下界面

terminal.png
  • 打開 localhost:8080,可以正常顯示了

2. select(), append(), text() 的使用

新建 HTML 文件伦糯,引入 d3 庫:

<script src="http://d3js.org/d3.v3.min.js"></script>

給個 p 標簽

<p>
  This is a test
</p>

然后我們來使用 d3 的 select(), append(), text() 方法:

// 改變 p 元素的文本
d3.select('p').text('test a is this');

// 選中 body 元素追加一個 p 標簽并添加文本
d3
  .select('body')
  .append('p')
  .text('this is the second one');

頁面顯示:

test a is this

this is the second one

3. 畫布和常見幾何圖形

D3 的坐標軸是這樣的昨登,坐標軸原點在左上角

d3axes.png
// 新建畫布你虹,添加寬度高度,但是畫布在網(wǎng)頁中是透明的像云,只有檢查元素時可以看到它的大小區(qū)域
// 使用 SVG 來作圖
var canvas = d3
  .select('body')
  .append('svg')
  .attr('width', 500)
  .attr('height', 500);

// 畫圓
var circle = canvas
  .append('circle')
  .attr('cx', 250)
  .attr('cy', 250)
  .attr('r', 50)
  .attr('fill', 'blue');

var circle = canvas
  .append('circle')
  .attr('cx', 250) // 圓心在 X 軸的坐標
  .attr('cy', 250) // 圓心在 Y 軸的坐標
  .attr('r', 5) // 半徑
  .attr('fill', '#fff'); // 填充色剂癌,如果不寫淤翔,默認黑色

// 矩形
var rect = canvas
  .append('rect')
  .attr('width', 70)
  .attr('height', 50)
  .attr('fill', 'pink');

// 線,以兩個端點固定線的位置佩谷,分別是 x1, x2, y1, y2
var line = canvas
  .append('line')
  .attr('x1', 49)
  .attr('y1', 49)
  .attr('x2', 250)
  .attr('y2', 250)
  .attr('stroke', 'green') // 顏色
  .attr('stroke-width', 5); // 粗細

額旁壮,畫了個啥?
three.png

4. 如何進階學(xué)習(xí)

Github 有中文 API 文檔谐檀,這里只貼出目錄供參考抡谐,詳細信息請查看 API 文檔
  • Arrays (靜態(tài), 查詢, 變換計算, 直方圖)
  • Axes 基于比例尺提供人類友好的標尺刻度
  • Brushes 使用鼠標或觸摸選擇一維或二維區(qū)域
  • Chords 和弦圖
  • Collections (Objects, Maps, Sets, Nests -- 根據(jù)指定的規(guī)則將數(shù)組重組為層次結(jié)構(gòu))
  • Colors 顏色空間以及轉(zhuǎn)換
  • Color Schemes 用于定量桐猬,序數(shù)和分類比例尺的顏色漸變和調(diào)色板
  • Contours
  • Dispatches 使用命名回調(diào)函數(shù)分離關(guān)注點
  • Dragging 使用鼠標或觸摸輸入拖放 SVG, HTML 或者 Canvas
  • Delimiter-Separated Values 解析和格式化以分隔符隔開的特定格式文件或字符串麦撵,大多數(shù)情況下指 CSV 和 TSV
  • Easings 平滑過渡的過渡函數(shù)
  • Fetches 基于 Fetch API 的更為便捷的獲取數(shù)據(jù)方法
  • Forces 使用速度 Verlet 積分的力模型仿真布局
  • Number Formats 對人類友好的數(shù)值格式化
  • Geographies 地理投影, 形狀以及數(shù)學(xué)計算(Paths, Projections, Spherical Math, Spherical Shapes, Streams, Transforms)
  • Hierarchies 對層次數(shù)據(jù)進行可視化的一些布局算法
  • Interpolators 對數(shù)值、顏色溃肪、字符串免胃、數(shù)組、對象等進行插值
  • Paths 將 Canvas 路徑命令序列化為 SVG 路徑字符串
  • Polygons 二維多邊形的幾何操作
  • Quadtrees 四叉樹, 二維空間遞歸細分
  • Random Numbers 基于多種多樣的分布模型生成隨機數(shù)
  • Scales 將抽象數(shù)據(jù)映射到可視化表示的編碼(Continuous, Sequential, Quantize, Ordinal)
  • Selections 通過選擇元素和綁定數(shù)據(jù)對 DOM 元素進行修改或變換(Selecting, Modifying, Data, Events, Control, Local Variables, Namespaces)
  • Shapes 可視化基本圖元(Arcs 圓形或環(huán)形, Pies 餅圖或者環(huán)形圖, Lines 曲線或折線, Areas 面積圖, Curves 曲線, Links 圓滑三次 Bézier 曲線, Symbols 分類形狀編碼, Stacks 堆疊圖)
  • Time Formats 受 strptime 和 strftime 啟發(fā)惫撰,時間類型的解析個格式化
  • Time Intervals 按照人類對日期的計算方式實現(xiàn)的日期計算
  • Timers 一個高效的可以用來管理上千并發(fā)動畫的隊列
  • Transitions 對 selections 進行動畫過渡
  • Voronoi Diagrams 根據(jù)指定的一組點集計算其泰森多邊形
  • Zooming 使用觸摸鼠標或者觸摸面板縮放 SVG, HTML 或者 Canvas
看到這個目錄確實有點頭痛羔沙,更何況每個模塊又有分項列表,很多方法厨钻。我個人的學(xué)習(xí)路徑是:
  • 略讀一遍所有方法名稱及其用途
  • 將所有模塊按照自己的理解進行分類扼雏,因為方法狠多,全部理解并記住不可行亦無必要莉撇。將模塊再次分類后呢蛤,做到對 D3 的操作有印象,需要用到的時候知道那個類有哪個方法棍郎,再去查閱 API 文檔進行開發(fā)其障。
  • 定好目標,不需要太難涂佃,自己動手做一個 demo 練習(xí)下励翼,這個過程很重要蜈敢,可以鍛煉查閱 API 文檔的能力

這里附上我的分類,僅供參考:

分類 模塊
?? 計算類 Arrays, Collections, Hierarchies, Polygons, Quadtrees, Random Numbers,
?? 數(shù)據(jù)處理類 Dispatches, Delimiter-Separated Values, Fetch, Number Formates, Interpolators, Paths
?? 時間處理類 Time Formates, Time Intervals, Timers
?? DOM 操作類 Selections
?? 動畫類 Easings, Transitions
?? 顏色類 Color, Color Schemes,
?? 鼠標控制 Brushes, Dragging, Zooming
?? 地理類 Geographies
?? 比例調(diào)整類 Axes, Scales,
?? 圖形類 Shapes, Voronoi Diagrams, Contours, Forces, Chords
  • 前五項 ?? 分類是屬于基礎(chǔ)模塊汽抚,也是平時編程會常用(至少有一部分會常用到)的方法抓狭,比如 Arrays, Collections, Fetch... Selection 對應(yīng) jQuery, 動畫類對應(yīng) CSS3. 差不多減少了一半學(xué)習(xí)量。

  • 后面五個 ?? 分類是需要額外學(xué)習(xí)的了造烁,其中鼠標控制類最簡單否过,圖形類最難。

5. 官方畫廊

點開 官方畫廊 的示例惭蟋,發(fā)現(xiàn)下面的代碼根本看不懂

原來 Observable 是一個在線開發(fā)編輯 D3 的工具苗桂,它的語法同我們平時開發(fā)是有些差異的「孀椋快速了解 Observable -- 『干貨|d3創(chuàng)始人又一力作:不僅能在線寫D3.js煤伟,還能讓你寫的更出色 』

另附 Observable: The User Manual 用戶使用手冊

下一篇文章我會介紹 Observable 使用入門

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末木缝,一起剝皮案震驚了整個濱河市便锨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌我碟,老刑警劉巖放案,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異矫俺,居然都是意外死亡卿叽,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門恳守,熙熙樓的掌柜王于貴愁眉苦臉地迎上來考婴,“玉大人,你說我怎么就攤上這事催烘×ぺ澹” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵伊群,是天一觀的道長考杉。 經(jīng)常有香客問我,道長舰始,這世上最難降的妖魔是什么崇棠? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮丸卷,結(jié)果婚禮上枕稀,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好萎坷,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布凹联。 她就那樣靜靜地躺著,像睡著了一般哆档。 火紅的嫁衣襯著肌膚如雪蔽挠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天瓜浸,我揣著相機與錄音澳淑,去河邊找鬼。 笑死插佛,一個胖子當著我的面吹牛偶惠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播朗涩,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼绑改!你這毒婦竟也來了谢床?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤厘线,失蹤者是張志新(化名)和其女友劉穎识腿,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體造壮,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡渡讼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了耳璧。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片成箫。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖旨枯,靈堂內(nèi)的尸體忽然破棺而出蹬昌,到底是詐尸還是另有隱情,我是刑警寧澤攀隔,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布皂贩,位于F島的核電站,受9級特大地震影響昆汹,放射性物質(zhì)發(fā)生泄漏明刷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一满粗、第九天 我趴在偏房一處隱蔽的房頂上張望辈末。 院中可真熱鬧,春花似錦、人聲如沸本冲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽檬洞。三九已至狸膏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間添怔,已是汗流浹背湾戳。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留广料,地道東北人砾脑。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像艾杏,于是被迫代替她去往敵國和親韧衣。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

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

  • Data Visualization with D3 D3: SVG中的jQurey 1. Add Documen...
    王策北閱讀 769評論 0 2
  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi閱讀 7,345評論 0 10
  • **2014真題Directions:Read the following text. Choose the be...
    又是夜半驚坐起閱讀 9,554評論 0 23
  • Here is our training plan. Our agenda for this training m...
    FlyingPeter閱讀 396評論 0 0
  • 溜溜梅低年級“天天圖說”: 時間:3月3日 題目:拔河 小腦袋想一想:什么時間购桑?什么地方畅铭?周圍的環(huán)境怎么樣?圖上都...
    冰魚燕閱讀 253評論 0 0