我的名字和我的姓氏
大量的生信公众号在各种linux入门、perl入门、python入门、R入门、软件安装、跑跑示例代码、流程。我自己平时根本不会去看这些生信号,在《s01 - Counting DNA Nucleotides》一文发出去后,就被爪哥说不能跟着走低端路线,囧rz…
还好我多半写的是自己的东西,目前还没有掉进「低端」的坑里,今天继续画图,唯有赏心悦目的图能抚慰人心。
我写了一个包叫《ggimage:ggplot2中愉快地使用图片》,从此图上嵌图(ggplot对象)或图片变得轻而易举。某一天写着玩,写了个《geom_pokemon: 使用pokemon画图》的图层,引起了人民群众的尖叫,国外有妹纸用来可视化NBA数据《大开眼界+多图慎点:Pokémon x NBA and other fun with ggimage》,国内有汉子用来可视化复旦大学考研的报考专业《你的专业是那一只Pokémon神兽?》。
画图好比在创作,脑洞是非常重要的,geofacet这个包,《按地理位置分面》,虽然是用于画地理的,但当我看到它的时候,我就知道它可以拿来拼图,《ggplot2分面之像素艺术》这一篇文章,通过一个实例,介绍了我的这一想法,拼出了一只火鸡。但这还不够,我还拼出了一个烂苹果:《你所没见过的苹果》,这一篇烂苹果,我也提到了其实我们不用geofacet照样可以拼,看问题要看到本质。
今天继续玩一下Pokémon,用来拼图,拼出一个YGC,有了ggimage包,我可以拿我的照片,拼出我的名字来,你们也可以,这是照片墙的花式玩法。当然照片不轻易爆,这里用的是Pokémon。
require(ggplot2)
require(ggimage)
require(geofacet)
code <- paste0('ygc_', 1:51)
ygc <- structure(list(row = c(1L, 1L, 2L, 2L, 3L, 3L, 4L, 5L, 6L, 7L,
2L, 3L, 1L, 2L, 1L, 1L, 2L, 3L, 4L, 5L, 6L, 1L, 7L, 1L, 4L, 7L,
1L, 4L, 7L, 1L, 2L, 4L, 5L, 6L, 7L, 1L, 2L, 3L, 4L, 5L, 6L, 1L,
7L, 1L, 7L, 1L, 7L, 1L, 2L, 5L, 6L), col = c(1, 2, 2, 3, 3, 4,
4, 4, 4, 4, 5, 5, 6, 6, 7, 8, 8, 8, 8, 8, 8, 9, 9, 10, 10, 10,
11, 11, 11, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 14,
14, 15, 15, 16, 16, 17, 17, 17, 17), code = code, name=code),
.Names = c("row", "col", "code", "name"), row.names = 1:51, class = "data.frame")
pkm <- list.pokemon()[1:nrow(ygc)]
d <- data.frame(x=1, y=1, pokemon=pkm, code = ygc$code)
pg <- ggplot(d, aes(x, y)) +
geom_pokemon(aes(image=pokemon), size=Inf) +
facet_geo(~code, grid=ygc)
我们可以通过theme,去掉不想要的元素,于是产生:
pg2 <- pg + theme_void() + theme(strip.text=element_blank())
ggsave(pg2, file="pokemon_ygc_v2.png", width=13.5, height=8.5)
reproduce the figure without geofacet
正如我在《你所没见过的苹果》一文中所提到的,没有geofacet照常可以拼,比如上面的图,也可以由下面的代码产生,这里主要的功劳要归结于我的《ggimage:ggplot2中愉快地使用图片》包,有了ggimage,做图玩出花样不是难事。
ygc$pokemon <- pkm
ggplot(ygc, aes(col, -row)) + geom_pokemon(aes(image=pokemon))
看到这里,难道你没产生一个问题,我的ggimage太好用了,画这样的图分分钟的事情,但要拼出YGC三个字母,首先得有这三个字母的坐标啊,我告诉你们我是搞十字绣的,你们信么!坐标很容易产生,我以前已经讲过了,只是你们视而不见而已,请用力戳这里:《clifun: 在R里装装逼》。