一款腦洞大開的表格可視化神器
今天跟大家介紹一款任坤大神寫的新包——formattable。
這個包的功能很簡單,但是卻很具創意性,它顛覆了R語言data.frame數據表的呈現方式,允許在表格內自定義視覺化元素,比如對某一列數據進行字型大小、顏色、背景、以及圖形化處理,整體的版式仍然保留表格的樣式,但是已經具有了表和圖結合的意味。
關於數據框的呈現方式,R語言內目前較好的自定義呈現方式是謝益輝大神的DT包,可以 將靜態表格動態化,進行切片、索引、排序操作。
devtools::install_github("renkun-ken/formattable")install.packages("formattable")library("formattable")library("DT")
自定義百分比顯示格式。
接觸過R語言的都知道R中沒有數值形式的百分比,只有浮點型,如果要在數據框中自定義某一列為百分比,則需要使用文本拼接函數將其格式化,但是這樣格式化之後,該列便會失去數值格式,轉換為字元型變數,無法參數數學運算。
但是formattable包通過擴展內部運算邏輯,不僅可以非常方便的將某一浮點型列自定義為百分比,而且保留其數學運算屬性。
p <- percent(c(0.1, 0.02, 0.03, 0.12))p[1] 10.00% 2.00% 3.00% 12.00%p + 0.01[1] 11.00% 3.00% 4.00% 13.00%max(p)[1] 12.00%mean(p)[1] 6.75%class(p)[1] "formattable" "numeric"
通過查看其S3類發現,formattable格式繼承了numeric屬性,因而保留了數學運算能力。
balance <- accounting(c(1000, 500, 200, -150, 0, 1200))balance[1] 1,000.00 500.00 200.00 (150.00) 0.00 1,200.00balance + 1000[1] 2,000.00 1,500.00 1,200.00 850.00 1,000.00 2,200.00
以上accounting函數可以將輸出向量自定義為會計上使用的數字合適,三維間隔,同時負值加括弧。
class(balance)[1] "formattable" "numeric"
其核心實現方式仍然是通過將其底層S3類繼承numeric來實現保留數學運算功能。
p <- data.frame( id = c(1, 2, 3, 4, 5), name = c("A1", "A2", "B1", "B2", "C1"), balance = accounting(c(52500, 36150, 25000, 18300, 7600), format = "d"), growth = percent(c(0.3, 0.3, 0.1, 0.15, 0.15), format = "d"), ready = formattable(c(TRUE, TRUE, FALSE, FALSE, TRUE), "yes", "no"))p id name balance growth ready1 1 A1 52,500 30% yes2 2 A2 36,150 30% yes3 3 B1 25,000 10% no4 4 B2 18,300 15% no5 5 C1 7,600 15% yes
在數據框中這些特性也依然能夠保留(這是自然地,因為數據框就是由若干個等長的向量組成的)
但是這僅僅是formattable很基礎的功能部分,下面給大家展示它的殺手鐧——針對數據框表格的超強自定義可視化能力。
df <- data.frame( id = 1:10, name = c("Bob", "Ashley", "James", "David", "Jenny", "Hans", "Leo", "John", "Emily", "Lee"), age = c(28, 27, 30, 28, 29, 29, 27, 27, 31, 30), grade = c("C", "A", "A", "C", "B", "B", "B", "A", "C", "C"), test1_score = c(8.9, 9.5, 9.6, 8.9, 9.1, 9.3, 9.3, 9.9, 8.5, 8.6), test2_score = c(9.1, 9.1, 9.2, 9.1, 8.9, 8.5, 9.2, 9.3, 9.1, 8.8), final_score = c(9, 9.3, 9.4, 9, 9, 8.9, 9.25, 9.6, 8.8, 8.7), registered = c(TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE), stringsAsFactors = FALSE)
以上是使用普通的輸出列印出的數據框呈現方式,那麼通過formattable函數格式化之後的數據表格又長什麼樣呢,人讓我們拭目以待。
formattable(df, list( age = color_tile("white", "orange"), grade = formatter( "span", style = x ~ ifelse(x == "A", style(color = "green", font.weight = "bold"), NA) ), area(col = c(test1_score, test2_score)) ~ normalize_bar("pink", 0.2), final_score = formatter( "span", style = x ~ style(color = ifelse(rank(-x) <= 3, "green", "gray")), x ~ sprintf("%.2f (rank: %02d)", x, rank(-x)) ), registered = formatter( "span", style = x ~ style(color = ifelse(x, "green", "red")), x ~ icontext(ifelse(x, "ok", "remove"), ifelse(x, "Yes", "No")) ) ) )
是不是很神奇呀,仔細觀察以上表格中,一共使用了三種自定義可視化類型,分別是字體大小和顏色自定義、字體背景自定義、以及文本自定義。
color_tile函數用於輸出按照數值量級進行顏色背景填充的列。
formatter函數提供字體顯示格式的自定義,grade列自定義了值為A的記錄顯示綠色,並將字體加粗,否則忽略。
test1_score, test2_score兩列通過area函數在對應字體背景位置使用條形圖來代表指標量級大小,顏色填充粉色。
final_score列對指標按照top3顯示綠色,其餘顯示灰色,同時將內容顯示格式自定義為浮點型+(rank:名次)進行顯示。registered列則在對填充顏色按照對應布爾值進行顯示(TRUE顯示綠色、FALSE顯示紅色)之外,在左側添加了對用的icon文本(TRUE顯示綠色對號,FALSE顯示紅色叉號)。是不是很神奇呀,一個小小的包竟然可以做這麼有趣的事情,這種表格在財務數據、營銷數據或者績效數據表中是經常會用到的可視化形式,簡單明了,非常醒目。
DT::datatable(df)
而DT的datatable函數,則僅僅是通過動態交互的形式提供了一個可交互的表格UI環境。
本項目主頁地址:
renkun-ken/formattable推薦閱讀:
※開始做一件事情的最好時刻,是現在
※不識廬山真面目,只緣身在此山中
※胖胖狗的2017年上半年數據分析學習計劃
※數據分析的三板斧
※下一部電影