scatterpie:離散餅圖
原創(chuàng):?Y叔?biobabble?2017-04-04
在ggplot上畫餅圖,從來不是個(gè)簡(jiǎn)單的事情,Tyler Rinker在StackOverflow上問的這個(gè)問題,3年沒人解答。
直到他看到我說ggtree有個(gè)subview函數(shù),可以圖上嵌圖之后,他自己跑了試用了一下,把餅圖嵌在于地圖之后,然后推特上AT了我,簡(jiǎn)直是畫面感很強(qiáng),我操,三年了,終于把餅圖畫在地圖上了。
subview嵌圖,這個(gè)當(dāng)然非常好,但這是把圖當(dāng)做raster image來嵌入的,當(dāng)你需要畫一堆餅圖的時(shí)候,render起來就一個(gè)字,慢!然后呢,還不能自己加legend,所以在畫很多餅圖的時(shí)候,一直不是個(gè)很好的方案。
> subview以后會(huì)defunct,因?yàn)槲矣懈玫膶?shí)現(xiàn),以后可以用**ggimage::geom_subview**
ggplot2是沒有原生餅圖支持的,而是通過柱狀圖旋轉(zhuǎn)為極坐標(biāo)從而得到餅圖,這就是之所以很難在平臺(tái)坐標(biāo)上畫出餅圖的原因。
ggforce支持原生餅圖,我們可以在平面坐標(biāo)軸上畫,ggforce的實(shí)現(xiàn)依然有些限制,也就是x-y坐標(biāo)必須要同樣的度量單位,不然餅圖會(huì)變形,因?yàn)榘霃绞侵付ǖ臄?shù)值,但數(shù)值在x-y軸上不一致。更好的實(shí)現(xiàn)應(yīng)該是半徑使用像素/英寸這種圖上固定的單位,而與數(shù)值無關(guān),這樣才能夠不變形。如果使用unit的版本出來的話,那么ggtree上畫餅圖,也更容易,而且可以在極坐標(biāo)里畫,也就是circular/fan layout tree都可以,我們一起期待。
anyway盡管有這樣的缺陷,但在地圖上,坐標(biāo)軸單位是一致的,畫在地圖上是不會(huì)變形的,ggforce的餅圖提供了一個(gè)非常好的地圖上畫餅圖方法,站在別人的肩膀上好做事啊,我大概花了兩個(gè)小時(shí),寫了個(gè)geom_scatterpie的圖層,打包在scatterpie (https://github.com/GuangchuangYu/scatterpie)里,讓同時(shí)畫很多很多的餅圖只在一瞬間。
假設(shè)有下面這個(gè)數(shù)據(jù):
指定了long, lat做x-y軸坐標(biāo),ABCD是拿來畫餅圖的數(shù)據(jù),餅圖瞬間出來:
還可以隨意指定餅圖的大小:
畫在地圖上,當(dāng)然沒問題喲:
餅圖大小是可以通過geom_scatterpie_legend加上圖例,并且現(xiàn)在通過labeller參數(shù)支持自定義半徑所對(duì)應(yīng)的實(shí)際值。