查看原文
其他

Y叔的新玩意--yyplot

2017-06-21 徐洲更 生信媛

理论上这篇文章是应该是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表示数据。

由此,我需要学习并熟练掌握ggplot2tidyr包。

文后放上Y叔的公众号,去学习更多关于可视化的知识。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存