最近的事情

最近微信公众号很久没更新了, 其实挺对不起我那90个订阅者的.__是的,现在我的微信公众号有90个订阅者了__,但是最近忙于出差,时间都在制作和熟练ppt中, 要不就是在准备人生大事. 当然这些都是借口, 其实主要的业务时间都是在搞博客.

就是依据githubhugo搭建自己的网页, 之前也曾经用了hexo来搭建自己的博客, 吭哧吭哧弄了好几天, 终于弄的差不多的时候. 发现两个问题.:

  • 界面虽然美轮美奂, 各类前端插件弄得是五彩缤纷, 但是最重要的是写文章的界面丑, 可以理解为形式大于内容吧.
  • 另外一点, 就是对rMrakdown的支持不够, 不方便, 毕竟我还是一个主要的业余兴趣是在R语言可视化和数据分析上的. 这一点迫使我重新去谷歌了, rmarkdown如何发布在网上.

最后找到的就是通过blogdown构建基于hugo的主题, 后面在hugo的主题官网上, 找到了一个国人开发的主题Nuo, 在此基础上, 完成了对自己博客的初步搭建.

经过不断的DIY修改, 目前这个blog已经完成了, 并且已经放在github上托管, 但是域名设置为和微信公众号一样, Abego. 因为我是用markdown写文章, 用rmarkdown写R的文章. 所以在博客中浏览, 游戏体验会极好!

微信我看是堕落了, 毕竟年终奖发的那么多, 可能是觉得尽善尽美了. 作为用户,觉得新的,好的东西越来越少. 微信公众号作为国内应该是最大自媒体平台. 到现在还是不支持markdown, 真不知道都在忙些什么.

– 落后就是要挨打的

进入整体

开始正题 creat the waffle plot

什么华夫饼图

我也不知道为什么大家要叫这种图为“waffle plot”, 翻译过来就是华夫饼图. 其实我连什么是华夫饼都不是特别确定. 所以我觉得作为一个有同年的人, 我觉得还是叫它“瓷砖图”更有意思点. 就像我们小时候扣的马赛克瓷砖, 但是为了各位能在百度或这个谷歌,乃至微信的搜一搜能快速找到我的这篇文章, 我也觉得还是叫华夫饼图, 其实饼图又是另一种图形的,随意干脆叫华夫图算了.

配置环境

这个华夫饼图是我在twitte上发现的, 国内的R语言的大环境还是相对薄弱的, 到了twitte上, 就可以跟全世界各地的人进行学习他们的代码, 和接触优秀的R包和作者.

这个华夫饼图是需要安装R的, 不是对ggplot2这些已有的R包的脑洞大发 , 而是作者有了这个想法后[1], 发现没有现成的包来做这种事, 就自己写的R, 真是有能力任性啊.

诺, 原文作者的tweet(rmarkdown不支持shortcode,尴尬)

所以我们需要先安装R包wafflehrbrthemes(这是一个主题包, 和之前说的bbc_style是一样的).

# devtools::install_github("hrbrmstr/waffle")
# devtools::install_github("hrbrmstr/hrbrthemes")
# install.packages("tidyverse")

library(hrbrthemes)
library(waffle)
library(tidyverse)
library(DT)

需要一个数据

xdf <- tibble(
              parts = factor(rep(month.abb[1:3], 3), levels=month.abb[1:3]),
              values = c(10, 20, 30, 6, 14, 40, 30, 20, 10),
              fct = c(rep("Thing 1", 3), rep("Thing 2", 3), rep("Thing 3", 3))
              )

我们可以先看看这个数据的格式[2]:

开始画图

可以看到xdf这个数据是有3col,和9row的数据框, 其中有数字(value),是连续型变量, 在华夫饼图中,这就是瓷砖的个数, 另外的parts和fct就是因子了, 问题是这里有两个变量因子, 这部分我们就需要通过分面和颜色的变量来表示的. 当然也可以直接分选出来一个变量.

挑选两个变量作图

例如:我们取事件1作为颜色标注, values作为y轴画图.

xdf %>% filter(fct == "Thing 1") -> xdf_1
ggplot(xdf_1, aes(fill=parts, values=values)) +
  geom_waffle(color = "white", size=1, n_rows = 6) + # color规定border边界颜色, size规定大小, n_rows规定瓷砖的排布
  scale_x_discrete(expand=c(0,0)) +
  scale_y_discrete(expand=c(0,0)) +
  ggthemes::scale_fill_tableau(name=NULL) +
  coord_equal() +
  labs(
    title = "Faceted Waffle Geoms",
    subtitle = "a amazing plot"
    )

挑选多个变量作图(三个)

很显然, 三个变量最好的方法就是分面, 如果四个变量就是横纵坐标一起分面.如下:

ggplot(xdf, aes(fill=parts, values=values)) +
  geom_waffle(color = "white", size=1.125, n_rows = 6) +
  facet_wrap(~fct, ncol=1) +
  scale_x_discrete(expand=c(0,0)) +
  scale_y_discrete(expand=c(0,0)) +
  ggthemes::scale_fill_tableau(name=NULL) +
  coord_equal() +
  labs(
    title = "Faceted Waffle Geoms"
  ) +
  theme_ipsum_rc(grid="") +
  theme_enhance_waffle()

一个变量画图

多个变量需要用到上述的ggplot2, 还要修改主题和几何构象geom_waffle, 真是麻烦. 那如果就一个变量呢, 问题就变得简单多了.

parts <- c(80, 30, 20, 10)#构建一个向量
parts
## [1] 80 30 20 10
waffle(parts, rows = 8)

当然有时候我们也需要规定行名和列名, 这个时候需要构建一个数据框,如下:

parts <- data.frame(     
           names = LETTERS[5:8],
           vals = c(80, 30, 20, 10)
           )
waffle(parts)

构建一个因子型向量也是可以的

parts <- c('Un-breached\nUS Population' = (318 - 11 - 79), 'Premera' = 11, 'Anthem' = 79)
waffle(
  parts, rows = 8, size = 1, 
  colors = c("#969696", "#1879bf", "#009bda"), legend_pos = "bottom"
  )

高级的玩法

其实作者提供了一个ggplot2的几何对象geom_waffle, 自然就是给予很大的可能性. 我们可以在此基础上来点有意思的.

掰弯它![3]

waffle(parts, rows=8) + coord_polar()

多重几何构象

geom_waffle是将瓷砖代表点来做图形的可视化, 但这个也意味着,其实本来而言, 他可以代替点来展现数据. 但是更高级的玩法可能还要各位开一开脑洞. 目前官方推荐的就是这样的一个瓷砖柱形图. 这个用处很大, 因为比传统的堆积图应该好看和更高大上一点. 值得玩一玩

推荐组学数据: 16s堆积图, 上下调基因, 转录因子家族数目比例

p1 <- ggplot(xdf, aes(fill = fct, values = values)) + 
      geom_waffle(color = "white", size = .25, n_rows = 3, flip = TRUE) +
      facet_wrap(~parts, nrow = 1, strip.position = "bottom")
p2 <- p1 + scale_x_discrete() + 
            scale_y_continuous(labels = function(x) x * 3, expand = c(0,0))
p3 <- p2 + ggthemes::scale_fill_tableau(name=NULL) +
        coord_equal() +
        labs(
          title = "我也不知道啥意思",
          subtitle = "数据来自瞎弄",
          x = "Month",
          y = "Count"
        ) +
        theme_minimal(base_family = "Roboto Condensed") +
        theme(panel.grid = element_blank(), axis.ticks.y = element_line()) +
        guides(fill = guide_legend(reverse = TRUE))
print(p3)

# 图片的合并

这个华夫饼图的R, 本身就带了一个合并图层的函数iron, 挺有意思的, 但是结果并不是特别完善, 单个华夫饼图拼凑在一起结果还可以, 但是如果是复杂的就不行了.

用兴趣的可以试试iron(p1, p2, p3),看看效果.

我还是用cowplot来拼凑一下吧.