一款脑洞大开的表格可视化神器

今天跟大家介绍一款任坤大神写的新包——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

原文发布于微信公众号 - 数据小魔方(datamofang)

原文发表时间:2018-03-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏前端布道

为什么是link-visited-hover-active

前言 通常我们在设置链接的一些伪类(link,visited,hover,active)样式时,要让不同的状态显示正确的样式,我们需要按一定的顺序设置这些伪类的...

3555
来自专栏逍遥剑客的游戏开发

M2文件头

1182
来自专栏游戏开发那些事

【python游戏编程之旅】第一篇---初识pygame

本系列博客介绍以python+pygame库进行小游戏的开发。有写的不对之处还望各位海涵。

1312
来自专栏Python爬虫实战

看了《最强大脑》,我决定做这个游戏

今年年初,新一季的《最强大脑》开播了,第一集选拔的时候大家做了一个数字游戏,名叫《数字华容道》,当时何猷君以二十几秒的成绩夺得该项目的冠军,来看一下当时的比赛:

1062
来自专栏深度学习之tensorflow实战篇

绘制动态心形图案::R语言绘制心形图

原始方程源于此贴一楼:直通车 整理修改后: 被窝修改成这样: x<-seq(-1.1,1.1,length = 3000) rep<-30 y<-matri...

4657
来自专栏walterlv - 吕毅的博客

用动画的方式画出任意的路径(直线、曲线、折现)

发布于 2017-11-20 00:49 更新于 2017-11...

902
来自专栏菩提树下的杨过

Metaball(元球)效果学习

几年前就在网上曾看见过这种效果,但一直不知道叫什么名字 ? 前一阵无意在9ria(天地会)论坛上看到了一篇专门讲这个的文章:AS3 元球(Metaball),不...

26310
来自专栏游戏杂谈

as3绘制抛物线

一般做页游的过程中,特效的释放可能是不是固定位置的播放,是需要进行“运动的”(其实就是移动特效这个影响剪辑)。举个例子:步兵射箭,不确定箭发射的方向,事先也不...

1062
来自专栏烙馅饼喽的技术分享

Silverlight像素着色器编写简明指南 附送文字描边效果

      在玩很多flash网页游戏的时候,看到它们都有非常清晰的宋体字,并且有漂亮的描边效果。如图,这是战将传奇的登录界面中的文字。 ? 对比之下,silv...

2017
来自专栏游戏开发那些事

【python游戏编程之旅】第四篇---pygame中加载位图与常用的数学函数。

本系列博客介绍以python+pygame库进行小游戏的开发。有写的不对之处还望各位海涵。

1322

扫码关注云+社区

领取腾讯云代金券