Y叔的新玩意--yyplot
理论上这篇文章是应该是Y叔自己介绍他写的新玩意,yyplot
。不过谁让我的时间多,写字数据快呢。
什么是yyplot
yyplot
是估计是Y叔打算整合自己所有常用的工具所创建的包。其中的ggqrcode是基于ggplot2绘制二维码的R包。二维码就是我们每天都会扫的那个了,一般使用验证付款,网页跳转等功能上。前一段时间,一直用的网页工具把公众号文章链接转成二维码,但是Y叔建议用R包减轻一下负担。于是写了一个ggqrcode
给我用。
如何安装
在安装yyplot
之前你需要安装以下几个包
install.packages("ggimage")
install.packages("devtools")
install.packages("qrcode")
由于yyplot
存放在github上,所以你需要用devtools进行安装
devtools::install_github("GuangchuangYu/yyplot")
如何使用
首先你需要加载一些必须包,比如说绘图所需要的ggplot2, 然后组合图片所需要的ggimage,以及今天的主角yyplot
require(ggplot2)
require(ggimage)
require(yyplot)
基本玩法
我们可以把链接变成二维码, 随便拿了一篇Y叔的公众号文章做一下示例。
ggqrcode("https://mp.weixin.qq.com/s/TMmsOsEn0wV9yXKOLma3Rw")
有时候,你想和朋友(无论同性或异性)告白,不知道怎么开口,你可以发一个二维码给她呀。就是不知道效果如何。
ggqrcode("I love you")
高级玩法
二维码本质上是构建了01的矩阵,所以我们其实在上面的图上加一些自定义的内容。
比如说实现下图的效果:
其实就是降低了二维码部分的透明度,然后在背后添加其他图片。
首先构建一个包含图像地址的ggplot对象,其中图片层为geom_image, 背景主题为无,也就是theme_void().
d <- data.frame(x=1, y=1,
img="http://kemono-friends.jp/wp-content/themes/kemono-friends/assets/zoo/img/detail/001/chara.png")
p <- ggplot(d, aes(x,y)) + geom_image(aes(image=img), size=Inf) + theme_void()
然后我们在此基础上,添加上二维码的图层,颜色为蓝色,透明度为80%,就大功告成了。
p2 <- ggqrcode("http://mp.weixin.qq.com/s/oLgpTGdQgcka-OD757_3lA", "blue", alpha=.8)
p + geom_subview(p2, width=Inf, height=Inf, x=1, y=1)
那么我们如何在二维码中间加上logo呢,如下图这样子呢:
其实也就是将我们的logo直接用ggimage添加到二维码的中心了。
pg <- ggqrcode("https://mp.weixin.qq.com/s/TMmsOsEn0wV9yXKOLma3Rw")
d <- data.frame(x=15, y=15,
img="https://guangchuangyu.github.io/blog_images/gc.png")
pg + geom_image(aes(x,y, image=img), data=d, size=.2)
就是这么简单,就是那么轻松,不去玩一把么?
读读源码
当然光会用R包还是不够的,我们还应该学Y叔写R包。其实源代码的ggqrcode
就是如下几行:
ggqrcode <- function(text, color="black", alpha=1) {
pkg <- "qrcode"
require(pkg, character.only = TRUE)
x <- qrcode_gen(text, plotQRcode=F, dataOutput=T)
x <- as.data.frame(x)
y <- x
y$id <- rownames(y)
y <- gather_(y, "key", "value", colnames(y)[-ncol(y)])
y$key = factor(y$key, levels=rev(colnames(x)))
y$id = factor(y$id, levels=rev(rownames(x)))
ggplot(y, aes_(x=~id, y=~key)) + geom_tile(aes_(fill=~value), alpha=alpha) +
scale_fill_gradient(low="white", high=color) +
theme_void() + theme(legend.position='none')
}
Y叔首先调用qrcode
包产生二维码的01矩阵
x <- qrcode_gen(text, plotQRcode=F, dataOutput=T)
x <- as.data.frame(x
然后利用tidy
包的gather_
函数对数据框结构进行整理清洗,变成ggplot2绘图所需要的数据格式
y <- x
y$id <- rownames(y)
y <- gather_(y, "key", "value", colnames(y)[-ncol(y)])
y$key = factor(y$key, levels=rev(colnames(x)))
y$id = factor(y$id, levels=rev(rownames(x)))
因为二维码从本质上可以看成一种热图,所以Y叔用geom_tile
表示数据。
由此,我需要学习并熟练掌握ggplot2
和tidyr
包。
文后放上Y叔的公众号,去学习更多关于可视化的知识。