查看原文
其他

Y叔的新玩意--yyplot

2017-11-25 徐洲更 biobabble

本文转载自《生信媛》,已获得授权。

最近刚好有人问,有没有办法用R画二维码,想起这篇,被洲更抢发的文章,里面比如配合ggimage这些例子都是我展示给他的,此处尴尬地笑一下。

这个可以说是三步曲,一气呵成:

  1. 画logo: 《reproducible logo generated by ggtree

  2. 画二维码,也就是本文啦

  3. 画横幅:《纯代码生成banner


当然这篇文章还同时回答了《pubmed年度趋势,你的开题报告需要它!》这一文中讲到的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 <- xy$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叔的公众号,去学习更多关于可视化的知识。

看到最后的才是真爱,R里面好玩的东西,真的是那那都有我的身影。据说周四是感恩节,是不是不重要,反正我也不过,不过跟老婆讲一句「感谢有你」还是很有必要的。还记得之前的《clifun: 在R里装装逼》吗?像这种节日,装逼利器。文章中有一招是改一下启动配置,每次打开R都可以装逼,嗯,似乎看到了妹纸打开R,可以看你到想对她说的一句话,这种可能性和场景了,我已经为你们铺垫好了,只能讲这么多🙊


cowsay这个包,我也是作者之一,真的要被自己感动哭!

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

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