d3.js 進階

2016-04-14

本篇文章談?wù)?d3 的動畫、svg 圖形生成器以及 d3 提供的 layout

一、動畫

1. 鼠標 hover ,顯示當前坐標

  • 使用 .on() 為圖表添加交互
  • 當前 this 指向的 d3 對象:d3.select(this)
  • 事件對象:d3.event
  • 常用事件 'mouseover', 'mouseout'

2. 為圖表添加動畫

散點圖-動畫.png

代碼如下:

circles.transition()

    // 為每個結(jié)點按序增加延遲時間,達成依次出現(xiàn)的效果
    .delay(function(d, i){
        return i * 10;
    })

    // 動畫總時長
    .duration(100)

    // 更新樣式
    .attr(circleAttrs);

更新樣式:

  1. 坐標 從原點移至 x, y
  2. 半徑 從小變大

3. 新增結(jié)點,動態(tài)更新比例尺

散點圖-animate2.png
  • 返回當前鼠標坐標:var coods = d3.mouse(this);
  • 反向獲取比例尺的值:xScale.invert()
  • 更新 data 數(shù)組 data.push(obj);
  • 更新比例尺的 domain 區(qū)間
  • 更新坐標軸 重新 .call(xAxis)

二、Layout

什么是 layout?

layout 的作用是將數(shù)據(jù)轉(zhuǎn)成適合繪圖的結(jié)構(gòu),d3 提供了多種 layout, 如:Pie, Tree, Force, Partition, Cluster, Bundle 等等。更多介紹...

下面以繪制樹形圖為例:

{% highlight javascript %}
var tree = d3.layout.tree().size([degree, radius]);

// 得到結(jié)點數(shù)據(jù)
var nodeData = tree.nodes(data);

// 得到連線數(shù)據(jù)
var linkData = tree.links(nodeData);
{% endhighlight %}

1. 數(shù)據(jù)轉(zhuǎn)換

tree-console出來的數(shù)據(jù)格式.png

parentchildren 指針,聯(lián)系著各個對象。

tree-layout.png

2. 生成曲線

{% highlight javascript %}
var diagonal = d3.svg.diagonal.radial()
// 點變換器
.projection(function(d){
return [d.y, d.x/180* Math.PI];
});

{% endhighlight %}

設(shè)置結(jié)點之間連線的形式,d3.svg.diagonal.radial() 調(diào)用徑向?qū)蔷€生成器。

對角線生成器:輸入兩個頂點坐標,生成一條貝塞爾曲線。

3. 移動

由于繪制后的樹形圖是以左上角為原點,向上展開的。故定位時需要做旋轉(zhuǎn)。

tree-位移過程.png

translate()rotate()

  1. 初始化時,位于左上角;
  2. 整體 y 軸向下移動;
  3. 結(jié)點右移,注意到此時葉子結(jié)點是重合的(即 “曹丕”、“曹植”);
  4. 整體順時針旋轉(zhuǎn);
  5. 結(jié)點逆時針旋轉(zhuǎn),回到水平線。

補充:

其中 .size([degree, radius] 設(shè)定范圍,通過設(shè)置樹形開口的角度以及延伸半徑長度。

a. 角度

角度不同.png

b. 半徑

半徑不同.png

c. 為啥要叫 “半徑”?設(shè)置角度為 360 度后,便一目了然了

tree-360-250.png

三、圖形生成器

圖形生成器是 d3 提供的一個非常好用的功能,通過輸入數(shù)據(jù),生成繪制 SVG 圖形所需要的格式。

如以折線舉例:

折線圖.png

圖中 7 個點數(shù)據(jù)如下:

折線圖數(shù)據(jù)映射.png

使用 d3 提供的 line 生成器,d3.svg.line(), 便可把數(shù)據(jù)整合成繪制 path 所要的格式了,即添加 M, L, Z 等。

<path
    d="M0,500 L125,500 L250,500 L375,500 L500,500 L625,500 L750,500 L750,0 L625,125 L500,187.5 L375,237.5 L250,262.5 L125,312.5 L0,375Z" >
</path>

常用圖形生成器有:

// 折線

d3.svg.line()
    .x()
    .y()

// 區(qū)域

d3.svg.area()
    .x0()
    .x1()
    .y0()
    .y1()

// 坐標軸

d3.svg.axis()
    .scale()
    .orient()
    .ticks()

// 弧形

d3.svg.arc()
    .innerRadius()
    .outerRadius()

四、其他

發(fā)現(xiàn)的一些技巧

  • 使用 tickSize(-config.height) 來繪制分割細線;
  • shape-rendering: crispEdges; 使得數(shù)軸和刻度線精確到像素級
  • 一種簡化寫法
    • '(' + [margin.left, margin.top] + ')' 強制類型轉(zhuǎn)換時,自動會轉(zhuǎn)成 '( margin.left, margin.top )' 形式;
  • 最佳實踐: 設(shè)置屬性應(yīng)當與設(shè)置動畫分離開來

五、資料

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,501評論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,673評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,610評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,939評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,668評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,004評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,001評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,173評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,705評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,426評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,656評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,139評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,833評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,247評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,580評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,371評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,621評論 2 380

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

  • B樹的定義 一棵m階的B樹滿足下列條件: 樹中每個結(jié)點至多有m個孩子。 除根結(jié)點和葉子結(jié)點外,其它每個結(jié)點至少有m...
    文檔隨手記閱讀 13,289評論 0 25
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,761評論 25 708
  • 本節(jié)內(nèi)容將描述餅狀圖、力導(dǎo)向圖、弦圖、集群圖、樹狀圖、打包圖、分區(qū)圖、圓形分區(qū)圖、直方圖、捆圖、堆棧圖、矩陣樹圖、...
    笨笨的笨小孩閱讀 6,551評論 0 2
  • 《一》 姑娘說“今天太閑了,就想鬧人。” “真好。”我一邊聽著一邊音樂,一邊快速敲打著“真羨慕你。有人寵的孩子” ...
    西樓不寒閱讀 777評論 2 2
  • 文|鳴鳳在竹 本文參加【六專題】八月征文《月圓之夜》+月圓之夜,誰人未眠? 我失戀了。他給我的理由是,他的父母反對...
    鳴鳳喬閱讀 866評論 60 45