疊嶂圖的前世今生
1979年,英國樂隊快樂小分隊(Joy Division)發行了自己的首張唱片《Unknown Pleasuers》,這張專輯發行兩周內就賣了5000份,但問題是……印了10000份。然而,當樂隊的單曲《Transmission》發布後,這張後朋克唱片很快銷售一空。作為一個樂盲,我是沒搞懂這歌的意思(好像對收音機很不滿)。整個70年代不斷衰落的英國社會催生了朋克運動,青少年們對現實極度不滿,採取了一些很極端的表現形式來抒發感情。有意思的是這個專輯在2017年又重新流行了,倒不是因為社會衰落,而是那個設計極為特殊的封面。
這裡說的封面流行是指在數據可視化領域裡,其實它本就很流行……在流行文化里。很多人用這個類似波譜的圖來指征一種波動、起伏的感受,恰恰應和《Unknown Pleasuers》中那種迷茫而強烈的情感,同時封面設計師又開放了版權,所以我們可以看到其在很多場景中的再現。例如 3D 列印版、服裝版、電影版等。甚至有人製作了一個網站來用滑鼠生成類似風格的圖。不過當我看這個圖時是覺得很有問題的:坐標軸是啥?線的間隔是固定的嗎?有什麼意義?這圖怎麼做出來的?
冤有頭債有主,《科學美國人》曾經對這張封面的源頭進行過探索,封面設計師 Peter Saville 是從 1977 年出版的《The Cambridge Encyclopaedia of Astronomy》上面一副關於脈衝星 CP1919 所發出的脈衝波疊加圖(不是山峰,也不是波浪)上獲取靈感的,但這靈感實質上就是把顏色做了反轉還去掉了坐標軸。不過這就說明源頭是這本書嗎?不,順著這本書,有人可以追溯到1971年1月刊的《科學美國人》,而1974年《Graphis diagrams: The graphic visualization of abstract data》上也出現了這幅圖。
那麼《科學美國人》又是哪裡搞到這幅圖的呢?事實上1971年的文章之所以要用這幅圖,是因為要介紹脈衝星這個上世紀60年代的重大發現,而這個發現的確切時間是1967年,也就是說這個圖的出生日期就在1967年與1971年之間。然後我們就找到了 Harold D. Craft, Jr. 在康奈爾大學的博士論文《Radio Observations of the Pulse Profiles and Dispersion Measures of Twelve Pulsars》,到這個時候真正的源頭才出現。
當《科學美國人》聯繫到 Harold D. Craft, Jr. 時,他順道也說了下這幅圖背後的故事。剛開始在脈衝星在劍橋被發現後,他所在的團隊就意識到自己其實擁有當時世界上最好的測量脈衝星的設備,也就是電子設備。然後,從測量結果上他們很快就發現脈衝星的脈衝存在一些漂移,也就是大脈衝里有小脈衝,這個結果發表在《自然》上。但他們覺得需要一個更直觀的方式來觀察這些脈衝的模式,然後就做了一些疊加圖,很快就發現這種圖並不滿意,前後的遮擋太過嚴重。作為一個程序員,遮擋問題其實就是一個漂移問題,所以他操起鍵盤做出了一個漂移版,這樣當峰強度足夠時才會出現遮擋,而這類峰正是我們想看的模式。不過不要高估那個年代的技術,他還得再找人用印度墨水(其實就是中國墨汁)重新勾描一遍才能清晰的放到博士論文里。不過他顯然不是流行文化愛好者,因為直到他同事有天閑逛時發現後告訴他他才發現自己的圖這麼流行,然後他毫不猶豫的買了下來這個專輯與海報:
it』s my image, and I ought to have a copy of it.
我能想像很多人要考慮版權問題了,說實話我也沒搞清楚,不過看起來創作者並不在意,而封面設計者也不在意,也許正是不在意促進了某些文化的流行。好了,前世就這樣了,那麼今生呢?
這事要從7月份說起,twitter 上突然出了這麼一張圖
由於 @hnrklndbrg 給出了 R 源碼,一時間大家都開始紛紛回復轉發,做出了自己的版本。當然 joyplot 的名字也伴隨這條推文開始走紅。據說 是 Jenny Bryan 首先提出的這個名字並聯繫到了上面所說的快樂小分隊的專輯封面。
跟專輯還有脈衝星就沒關,這個圖在增加了坐標軸後的突然流行其實跟最近在可視化里要求展示大量原始數據的需求不謀而合。我們現在考慮這樣一個場景,有十組數據,每組1000個數值,如果進行比較,用什麼來可視化?
group1 <- cbind(rnorm(1000),1)group2 <- cbind(rbeta(1000,2,8),2)group3 <- cbind(runif(1000,min = -1,max = 1),3)group4 <- cbind(c(rep(1,500),rep(-1,500)),4)group5 <- cbind(c(rnorm(500,1),rnorm(500,-1)),5)data <- rbind.data.frame(group1,group2,group3,group4,group5)
可能最簡單的就是條形圖了吧,用條形長度表示均值,然後用標準誤或標準差表示變異程度。這裡需要說明的是這種作圖方法如果倒退到快樂小分隊那個年代是很有必要的,因為那個年代作圖不能太過複雜,畢竟有時還要描邊,屬於純體力活。在這種大環境下你是可以用統計量例如均值來表示數據整體的,甚至 Edward Tufte 都提出了類似奧卡姆剃刀原則的數據墨水比來表示數據的展示要盡量簡潔。
但是抽象程度越高,細節信息丟失就越嚴重,如果我們僅用均值來展示上面的數據會是下面這樣:
library(tidyverse)data %>% group_by(V2) %>% summarise(mean = mean(V1)) %>% ungroup() %>% ggplot(aes(x=V2, y=mean)) + geom_bar(stat = identity)
簡潔是有了,數據細節幾乎完全丟失。當前的趨勢是儘可能少對數據做假設,所以要儘可能多的展示細節。那麼有人可能就說我用盒式圖行不行?
data %>% ggplot(aes(x=factor(V2), y=V1)) + geom_boxplot()
只能說好了一點,因為雖然我們現在有了分位數,但其分布還是看不出來。那麼此時有人就說我用提琴圖怎麼樣?畢竟前兩天 xkcd 還畫了這個圖。
data %>% ggplot(aes(x=factor(V2), y=V1)) + geom_violin()
我只能說已經有點意思了,因為數據本身的特點正在展示出來。其實我們也可以直接用抖動散點圖來展示。
data %>% ggplot(aes(x=factor(V2), y=V1)) + geom_jitter()
不過這裡的問題是點在1000這個量級還好,如果多了就只能通過設置顏色透明度來展示了。但 joyplot 卻十分適合這個場景:
library(ggridges)data %>% ggplot(aes(y=factor(V2), x=V1)) + geom_density_ridges()
你可以把 joyplot 看成提琴圖砍掉一半的樣子,但因為有共同基線,所以視覺上比較起來特別方便。你甚至可以用類似直方圖的模式來展示分布:
data %>% ggplot(aes(y=factor(V2), x=V1),height = ..density..) + geom_density_ridges(stat = binline)
也就是說 joyplot 在展示原始數據狀態時屬於比較直觀的,猶如重山疊嶂,不論是對比峰值還是對比特定數值上概率密度都很簡單。
故事還沒完,你也注意到了,現在 joyplot 又改名了。新的英文名叫做 ridgeline,中文名暫時就叫疊嶂圖吧。原因還是出在快樂小分隊上,快樂小分隊其實是納粹集中營里提供性服務的猶太婦女團體,而這個樂隊起名的時候就是用的這個典故,這樣的黑歷史在西方世界乃至全世界都是不願意提及的,所以很快可以畫疊嶂圖的 ggjoy 包退休,功能完全一致的 ggridges 閃亮登場。
這就是疊嶂圖的前世今生了,前前世比較黑暗,前世是流行文化,今生則是可視化領域的新貴。可能還是有人覺得這個圖沒啥特殊的,我這裡用真實數據來展示下其作用:
library(tidypvals)aj1 = anti_join(head2015,chavalarias2016)aj2 = anti_join(chavalarias2016,head2015)sj1 = semi_join(head2015,chavalarias2016)allp = rbind(aj1,aj2,sj1)allp = rbind(allp,brodeur2016)allp %>% filter(!is.na(field)) %>% ggplot(aes(y=field, x=pvalue)) + geom_density_ridges() + xlim(0,0.25)
這組數據收集了348414份期刊論文里的3623355個p值,橫跨28個學科,現在我問你:哪個學科最有可能在p值上造假或者有發表歧視?你又有沒有更好的可視化方法呢?
推薦閱讀:
※Seaborn入門系列(三)——boxplot和violinplot
※KB01:DataMapA教程-安裝和更新、卸載
※Matplotlib中將兩條不同曲線共軸
※Matplotlib中關於坐標軸的控制
※運動軌跡熱力圖中的台灣導彈基地安全隱患