一款脑洞大开的表格可视化神器
今天跟大家介绍一款任坤大神写的新包——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.00
balance + 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 ready
1 1 A1 52,500 30% yes
2 2 A2 36,150 30% yes
3 3 B1 25,000 10% no
4 4 B2 18,300 15% no
5 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环境。
本项目主页地址:
https://github.com/renkun-ken/formattable
- Go语言并发编程总结
- hdu------(4302)Holedox Eating(树状数组+二分)
- spark2的SparkSession思考与总结2:SparkSession有哪些函数及作用是什么
- GO语言并发编程之互斥锁、读写锁详解
- spark2.2 SparkSession思考与总结1
- 【译】Spring 官方教程:Spring Security 架构
- hdu----(4301)Divide Chocolate(状态打表)
- hdu------(4300)Clairewd’s message(kmp)
- TensorFlow ML cookbook 第一章7、8节 实现激活功能和使用数据源
- Go语言struct类型详解
- spark1.x升级spark2如何升级及需要考虑的问题
- 使用 kubeadm 创建一个 kubernetes 集群
- Oracle 12c 多租户专题|CDB元数据内幕
- 深入分析golang多值返回以及闭包的实现
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 以人为本 | Android 11 的消息通知
- RxJava取消订阅的各种方式的实现
- [- Flutter 基础篇 -] ListView的使用
- Emoji表情在Android JNI中的兼容性问题详解
- 一个吸顶Item的简单实现方法分享
- [- Flutter福利篇 -] Hero转场组件共享 — 附赠-路由动画工具类
- Hue执行多条语句问题
- Android仿抖音列表效果
- com.android.support版本冲突解决方法
- [-Flutter趣玩篇-] 出神入化的Align+动画
- Hive Impala和Hue集成LDAP
- Android仿QQ分组实现二级菜单展示
- Android RecyclerView实现拼团倒计时列表实例代码
- 正则十八式-第一式:直捣黄龙
- 安装Grafana并使用Cloudera Manager DataSource