最近的事情
最近微信公众号很久没更新了, 其实挺对不起我那90个订阅者的.__是的,现在我的微信公众号有90个订阅者了__,但是最近忙于出差,时间都在制作和熟练ppt
中, 要不就是在准备人生大事. 当然这些都是借口, 其实主要的业务时间都是在搞博客.
就是依据github和hugo搭建自己的网页, 之前也曾经用了hexo来搭建自己的博客, 吭哧吭哧弄了好几天, 终于弄的差不多的时候. 发现两个问题.:
- 界面虽然美轮美奂, 各类前端插件弄得是五彩缤纷, 但是最重要的是写文章的界面丑, 可以理解为形式大于内容吧.
- 另外一点, 就是对
rMrakdown
的支持不够, 不方便, 毕竟我还是一个主要的业余兴趣是在R
语言可视化和数据分析上的. 这一点迫使我重新去谷歌了,rmarkdown
如何发布在网上.
最后找到的就是通过blogdown
构建基于hugo
的主题, 后面在hugo的主题官网上, 找到了一个国人开发的主题Nuo
, 在此基础上, 完成了对自己博客的初步搭建.
经过不断的DIY修改, 目前这个blog已经完成了, 并且已经放在github
上托管, 但是域名设置为和微信公众号一样, Abego. 因为我是用markdown写文章, 用rmarkdown写R的文章. 所以在博客中浏览, 游戏体验会极好!
微信我看是堕落了, 毕竟年终奖发的那么多, 可能是觉得尽善尽美了. 作为用户,觉得新的,好的东西越来越少. 微信公众号作为国内应该是最大自媒体平台. 到现在还是不支持markdown, 真不知道都在忙些什么.
– 落后就是要挨打的
进入整体
什么华夫饼图
我也不知道为什么大家要叫这种图为“waffle plot”, 翻译过来就是华夫饼图. 其实我连什么是华夫饼都不是特别确定. 所以我觉得作为一个有同年的人, 我觉得还是叫它“瓷砖图”更有意思点. 就像我们小时候扣的马赛克瓷砖, 但是为了各位能在百度或这个谷歌,乃至微信的搜一搜能快速找到我的这篇文章, 我也觉得还是叫华夫饼图, 其实饼图又是另一种图形的,随意干脆叫华夫图算了.
配置环境
这个华夫饼图是我在twitte
上发现的, 国内的R语言的大环境还是相对薄弱的, 到了twitte
上, 就可以跟全世界各地的人进行学习他们的代码, 和接触优秀的R包和作者.
这个华夫饼图是需要安装R的, 不是对ggplot2
这些已有的R包的脑洞大发 , 而是作者有了这个想法后[1], 发现没有现成的包来做这种事, 就自己写的R, 真是有能力任性啊.
诺, 原文作者的tweet(rmarkdown不支持shortcode,尴尬)
所以我们需要先安装R包waffle
和hrbrthemes
(这是一个主题包, 和之前说的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来拼凑一下吧.