F2 圖表系列之 Radial Bar Chart,為圓滿,動起來

F2 圖表系列之 Radial Bar Chart,為圓滿,動起來

來自專欄 AntV

更好的閱讀體驗請移步至:

Radial Bar Chart,為圓滿,動起來 · 語雀?

yuque.com圖標

不知道大家對這張圖是否熟悉,這是 Apple Watch 的健身記錄。

圖片來源於網路

從第一代 Apple Watch 至今,Apple 對健身記錄的可視化方式一直未變,簡單的三個圓環,不用直線進度條,不用數字,也不用任何百分比。

這種可視化設計方式可以說是非常巧妙:

  1. 首先它非常直觀,目標清晰明了,一看就懂,圓弧閉合表示目標達成,沒閉合那麼就繼續努力吧
  2. 它有效得利用了空間,並且視覺醒目。如此小的屏幕,完美得展示了用戶三種健身行為(活動、鍛煉、站立)的進行情況,目標都是你定的咯,千萬別偷懶。
  3. 這和用戶的概念模型非常契合:手錶/時鐘,我們從小就開始學習如何讀手錶不是么?

但是我們冷靜得看的話,其實這就是環形進度條,只是為了有效利用空間,採用俄羅斯套娃的方式將三個環形進度條進行了組合。

圖片來源於網路

而從可視化圖表的角度,這其實是 Radial/Circle Bar Chart, 可直譯為徑向/環形柱狀圖,或者使用我們 AntV 為其賜名的『玉珏圖』,是柱狀圖在極坐標下的表現,用法同普通柱狀圖類似,用於不同類別之間的比較。

圖片來源於網路

更多詳細的介紹見: antv.alipay.com/zh-cn/v

那麼如何使用 F2 進行繪製呢?請耐著性子往下看:

玉珏圖的繪製原理

上文講道,玉珏圖是柱狀圖在極坐標下的表現,那麼它到底是如何從柱狀圖成功變裝為玉珏圖的呢?

(1)首先假設我有一個宏偉目標,就是減重 10 斤,經過三年不懈努力,我終於減掉了 6.18 斤,那麼換算成百分比,我目前的完成度是 61.8%(千萬不要小瞧女人的意志力),將這條信息轉換成數據:

const data = [ { name: 減肥, value: 6.18 } //];

然後先用柱狀圖表示就是:

其中縱軸的最大值是 10

// 代碼片段:圖形語法聲明// interval() 用於聲明圖表類型:柱狀圖// position 用於聲明柱狀圖的 x 軸和 y 軸對應的數據chart.interval().position(name*value);

(2)現在,我們把上述柱狀圖進行轉置,就是將 x 軸和 y 軸進行交換,得到如下的圖。

在圖形語法中,轉置通過坐標系的變換達成,如下:

// 代碼片段: 直角坐標系轉置chart.coord({ transposed: true // 轉置坐標系})

(3)完成以上兩步之後,你是否已經大致猜到了從柱狀圖到玉珏圖的變換原理了呢?對,只要它『彎』下就好了。即將直角坐標系變換至極坐標,坐標系變換之後,我們就將原先的柱狀圖高度轉換成了當前的角度,占整個圓的 61.8%。

在圖形語法中,聲明下坐標系的類型即可。

chart.coord(polar, { transposed: true, innerRadius: 0.5 // 為了美觀,這裡設置了下圓的空心半徑});

到此一個玉珏圖就繪製完成了,通過上面的解釋,不知道大家對玉珏圖的定義:柱狀圖在極坐標下的表現有沒有理解了呢?

完整代碼詳見:codepen

環形進度條

但是它看起來並不像一個環形進度條,為什麼? 一看就知道咯,缺一個閉合的圓弧,強調 100% 的狀態,那很簡單,繪製一個背景圓環就可以了呀~

// 代碼片段,繪製一個輔助圓弧chart.guide().arc({ start: [0, 0], end: [1, 99.98], top: false, style: { lineWidth: 40, stroke: #ccc }});

完整代碼詳見:codepen

進階

漂亮點

為了讓環形進度條更加美觀,漂亮,畢竟彎都彎了。我們可以讓圓弧的頭尾兩端飽滿一點,如下圖所示:

為了實現這個效果,之前我也寫過一篇教程:玩玩 G2 系列之圓角矩形,之前的思路是使用自定義 path 的方式來實現兩端的圓帽,但是!小編我有一天核桃吃多了點,發現了一個新思路: Canvas 2D API 中有一個屬性: lineCap, 指定如何繪製每一條線段末端,有3個可能的值,分別是:butt, round and square :

所以我只要自定義一個 shape,將柱狀圖原本的矩形形狀繪製成一條線(帶線寬),然後為這條線設置 lineCap: round 即可,簡單有效完美!

假設我將這個 shape 命名為 tick, 我只要在圖形語法中聲明下 shape 映射即可:

// 代碼片段chart.interval().position(name*value).shape(tick);

自定義 shape 的詳細說明詳見: antv.alipay.com/zh-cn/f

生動點

到此,為了讓這個環形進度條更富有生命力,我們可以加點動畫。雖然 F2 默認帶有動畫,但是默認的動畫效果並不是很好,它採用的是整體區域的圓形剪切動畫,即從起始角(- Math.PI / 2) 開始逐漸變換至 Math.PI * 1.5。如下如所示:

這樣就會導致頭部的圓帽在出場時被切掉,動畫結束是才出現... 如下所示,這就是為美麗付出的代價。

這時候就體現出了 F2 的強大之處,自定義動畫機制,我們可以直接對圓弧(shape)自定義動畫,原理同上述一樣,進行角度的變化即可,只是這裡的動畫主題是 shape 自身。在動畫的過程中還可以加些小動作,如動態顯示進度,效果如下:

簡直就是完美。

完整的示例代碼詳見: antv.alipay.com/zh-cn/f


至此,一個環形進度條就繪製成功了,掌握了這個,繪製蘋果的三圓環還難么?無非就是豐富下數據,添加下顏色就好了:

該示例的代碼詳見: codepen.io/Sima/pen/qYg

感興趣的讀者可以自己嘗試下。

總結

正所謂美酒雖好,也不能貪杯。雖然在空間有限的情況下,玉珏圖能起到有效利用空間的效果,但是由於玉玦圖是用角度來映射數值大小,當多個類別數據進行比較式,相同的角度下,外環的圓弧長度會明顯大於內環的圓弧長度,進而造成視覺上的欺騙,引起數據的誤讀,所以要謹慎使用哦

不過就本文的場景,如果只是用於獨立展示各個類別的完成度的話,在移動端確實是一個不錯的選擇。


F2 地址:

  • github: github.com/antvis/f2
  • 官網: antv.alipay.com/zh-cn/f

如果本文內容讓您產生愉悅或者略有受益,歡迎訂閱我們的語雀、知乎專欄:

  • 語雀專欄:yuque.com/antv/blog
  • 知乎專欄:zhuanlan.zhihu.com/aiux

我們會定期為您線上可視化上的新鮮資訊。


推薦閱讀:

生男生女預測圖表
專業設計師的 10 個圖表心得,看完就能用 #022
淺談生物學中圖形圖表題的解題策略
一張圖表告訴你,寶寶需要睡多久
六地產假新政一錶速覽 | 圖表秀

TAG:圖表 | 數據可視化 | 移動端 |