【R>>ggh4x】ggplot2分面hacks

ggh4x是ggplot2的扩展包,其火星文发音为G-G-hacks。主要功能包括调整分面大小(adjusting the sizes of facets),mapping multiple aesthetics to colors and specifying individual scales for facets。同时还是多个geoms、facets、positions、guides和stats的集合。

安装

#devtools::install_github("teunbrand/ggh4x")

小试牛刀

library(ggh4x)
library(tidyverse)

# 创建示例数据
n <- 200
df <- data.frame(
  x = c(rpois(n, 25),
        rnbinom(n, 5, 0.2),
        rgamma(n, 30, 1.5),
        rchisq(n, 15)),
  distribution = rep(c("Poisson", "Negative Binomial", 
                       "Gamma", "Chi-squared"), each = n),
  type = rep(c("Discrete", "Continuous"), each = 2 * n)
)
head(df)
##    x distribution     type
## 1 24      Poisson Discrete
## 2 27      Poisson Discrete
## 3 26      Poisson Discrete
## 4 23      Poisson Discrete
## 5 33      Poisson Discrete
## 6 14      Poisson Discrete
ggplot(df, aes(x, y = after_stat(count),
               fill = distribution, colour = distribution)) +
  geom_histogram(position = "identity", binwidth = 1, 
                 alpha = 0.3, colour = NA) +
  # One type of theoretical densities for discrete distributions with steps
  stat_theodensity(data = ggsubset(type == "Discrete"),
                   distri = "nbinom", geom = "step",
                   position = position_nudge(x = -0.5)) +
  # Another type for the continuous ones with lines
  stat_theodensity(data = ggsubset(type == "Continuous"),
                   distri = "gamma") +
  scale_colour_discrete(aesthetics = c("colour", "fill"), guide = "none") +
  # Have the facet strips span categories
  facet_nested(~ type + distribution, scales = "free_x") +
  # Precisely control aspect ratio of panels
  force_panelsizes(rows = 1.618, cols = 1, respect = TRUE) 

相关参数

Facets

主要针对常见的wrapgrid布局进行自定义。

  • facet_grid2():Extended grid facets

  • facet_wrap2():Extended wrapped facets

  • facet_nested():Layout panels in a grid with nested strips

  • facet_nested_wrap():Ribbon of panels with nested strips.

接下来这两个参数是Facet helpers函数:

  • force_panelsizes()

  • facetted_pos_scales()

Position guides and scales

添加x轴和y轴的展示细节

  • scale_x/y_dendrogram() :Dendrogram position scales

  • guide_dendro():Dendrogram guide

  • guide_axis_truncated() guide_axis_colour() guide_axis_color(): Axis guide with truncated line

  • guide_axis_minor(): Axis guide with ticks for minor breaks

  • guide_axis_logticks(): Axis guide with ticks for logarithmic breaks

  • guide_axis_nested(): Nested axis guide

Colour scales and guide

两种映射非标准数据的方法

  • guide_stringlegend():String legend

  • scale_fill_multi() scale_colour_multi():Multiple gradient colour scales

  • scale_listed():Add a list of scales for non-standard aesthetics

Stats

数据变换后,对不同图层进行统计。

  • stat_theodensity():Fitted theoretical density

  • stat_difference():Difference ribbon

  • stat_rollingkernel():Rolling Kernel

  • stat_funxy() stat_centroid() stat_midpoint():Apply function to position coordinates

  • stat_rle():Run length encoding

Geoms

几何图层的集合

  • geom_pointpath():Point Paths

  • geom_polygonraster():Polygon parameterisation for rasters

  • geom_rectmargin() geom_tilemargin():Rectangular rugs in the margins

  • geom_text_aimed() :Aimed text

Positions

可添加到图层的位置调整

  • position_disjoint_ranges():Segregrating overlapping ranges

  • position_lineartrans():Linearly transform coordinates

Miscellaneous

杂项

  • help_secondary():Secondary axis helper

  • center_limits():Center limits

特色展示

给每个类别分别赋值进行展示

df <- transform(
  iris,
  Nester=ifelse(Species=="setosa","Short Leaves","Long Leaves")
)

g <- ggplot(df,aes(Sepal.Width,Sepal.Length))+
  theme_classic()+
  theme(strip.background = element_blank())
g <- g + 
  geom_point(aes(SW = Sepal.Width),
             data = ~ subset(., Species == "setosa")) +
  geom_point(aes(PL = Petal.Length),
             data = ~ subset(., Species == "versicolor")) +
  geom_point(aes(PW = Petal.Width),
             data = ~ subset(., Species == "virginica"))
g
library(scales)
g <- g +
  scale_colour_multi(
    aesthetics = c("SW", "PL", "PW"),
    name = list("Blue", "Pink", "Orange"),
    colours = list(
      brewer_pal(palette = "YlGnBu")(6),
      brewer_pal(palette = "RdPu")(6),
      brewer_pal(palette = "YlOrRd")(6)
    ),
    guide = guide_colorbar(barheight = unit(50, "pt"))
  )
g

还可以将重复的分面类型进行合并

g <- g+facet_nested(~Nester+Species,scales = "free",
                    nest_line = TRUE)
g

其实还能给将坐标轴个性化设计

position_scales <- list(
  scale_x_reverse(guide="axis_minor"),
  scale_x_continuous(labels = dollar,guide = "axis_truncated"),
  scale_x_continuous(breaks = c(3,4),expand = c(0,0))
) #对x轴的3端分别自定义
g <- g+facetted_pos_scales(x=position_scales)
g

再仔细看,第3个分面比较大,当然也可以自定义的。

size <- 2/(1+sqrt(5))
g <- g+force_panelsizes(cols = c(1,size,size^2),respect = T)
g

备注

其实ggh4x算是对facets,stat,geoms等方面的调整的一个集合,类似的功能可以在其他包中找到,比如:

  • facetscales:调整row/column的分面

  • egg:设置分面大小

  • lemon:调整坐标轴位置

  • relayer和ggnewscale:对同一图形映射多个颜色

当然ggh4x大部分功能来自ggnomics包,但跟其还是有很大区别的。

参考链接:

ggh4x官方文档(由于简书限制外链,就不放具体链接了,github上搜ggh4x就能找到。)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容

  • 一.基本概念 "一张统计图形就是从数据到几何对象(geometric object, 缩写为geom, 包括点、线...
    apricoter阅读 52,057评论 6 173
  • 写在前面 ggplot2 是一个功能强大且灵活的R包 ,由Hadley Wickham 编写,其用于生成优雅的图...
    Boer223阅读 27,897评论 0 67
  • 最近参加了刘博发起的《R for data Science》的读书会活动,差不多是每周读一个章节。我决定写一些看这...
    城管大队哈队长阅读 588评论 0 1
  • ggplot2绘图理念 图形系统的核心理念是把绘图与数据分离,把数据相关的绘图与数据无关的绘图分离,按图层作图。g...
    毛线东东a阅读 2,012评论 0 12
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 8,520评论 28 53