ggplot2
的默认分面功能功能不够强大,支持的自定义参数也比较少,今天介绍的这个包可以对分面进行超多改头换面的操作!
- 安装
- 使用
- facet_wrap2()/facet_grid2()
- facet_nest()
- facet_manual()
- 分面的条带设置
安装
代码语言:javascript复制install.packages("ggh4x")
# install.packages("devtools")
devtools::install_github("teunbrand/ggh4x")
使用
首先我们建立一个默认的分面图形。
代码语言:javascript复制library(ggplot2)
p <- ggplot(mpg, aes(displ, hwy, colour = as.factor(cyl))) geom_point()
labs(x = "Engine displacement", y = "Highway miles per gallon")
guides(colour = "none")
p facet_wrap(~ class)
plot of chunk unnamed-chunk-2
默认的分面是上面这样的,而今天要介绍的ggh4x
提供了更加强大的函数gacet_wrap2()
。
facet_wrap2()/facet_grid2()
默认情况下和facet_wrap()
函数完全相同:
library(ggh4x)
p facet_wrap2(vars(class))
plot of chunk unnamed-chunk-3
支持为每一个分面图增加坐标刻度,并支持移除或保留x轴或者y轴的标签:
代码语言:javascript复制p facet_wrap2(vars(class), axes = "all", remove_labels = "x")
plot of chunk unnamed-chunk-4
支持更加强大的分面图形布局,还可以进行留白:
代码语言:javascript复制p facet_wrap2(vars(class), nrow = 4, ncol = 4, trim_blank = F)
plot of chunk unnamed-chunk-5
facet_wrap()
是针对一个变量进行分面的,facet_grid()
是针对两个变量进行分面的,所以ggh4x
也提供了facet_grid2()
函数扩展其功能!
p facet_grid2(vars(year), vars(drv), axes = "all", remove_labels = "y")
plot of chunk unnamed-chunk-6
默认的facet_grid()
函数中的scales
参数,只能控制整体的x轴或者y轴,但是facet_grid2()
函数提供了额外的independent
参数,可以让所有分面的坐标都自行调节(不明白的可以用默认的facet_grid画图比较下)。
p facet_grid2(vars(year), vars(drv), scales = "free_x", independent = "x")
plot of chunk unnamed-chunk-7
facet_nest()
嵌套分面,可以实现以下效果,非常实用。
代码语言:javascript复制new_iris <- transform(
iris,
Nester = ifelse(Species == "setosa", "Short Leaves", "Long Leaves")
)
iris_plot <- ggplot(new_iris, aes(Sepal.Width, Sepal.Length))
geom_point()
iris_plot
facet_nested(~ Nester Species) # 分面在一起,嵌套
plot of chunk unnamed-chunk-8
还可以对嵌套分面进行各种细节调整:
代码语言:javascript复制iris_plot
facet_nested(~ Nester Species, nest_line = element_line(linetype = 2)) # 线型
theme(strip.background = element_blank(),
ggh4x.facet.nestline = element_line(colour = "blue")) # 颜色
plot of chunk unnamed-chunk-9
可以把分面标签放在下面:
代码语言:javascript复制iris_plot
geom_point(data = ~ transform(.x, Species = NULL, Nester = "All")) # 添加一个包含所有点的分面
facet_nested(~ Nester Species, switch = "x") # 放在下面
plot of chunk unnamed-chunk-10
还提供了facet_nested_wrap()
函数,作为facet_wrap()
的变体:
p
facet_nested_wrap(
vars(cyl, drv), dir = "v", strip.position = "left",
axes = "all", remove_labels = "x"
)
theme(strip.placement = "outside")
plot of chunk unnamed-chunk-11
facet_manual()
为分面图形提供更加强大的布局,支持自定义各种复杂的自定义布局。
代码语言:javascript复制design <- matrix(c(1,2,3,2), 2, 2)
p facet_manual(vars(factor(drv)), design = design)
plot of chunk unnamed-chunk-12
也支持使用类似patchwork::plot_layout()
风格的布局参数:使用连续的字母代替图形,不同的行数代表行,#代表占位符:
design <- "
A##
AB#
#BC
##C
"
p facet_manual(vars(drv), design = design)
plot of chunk unnamed-chunk-13
使用heights/widths
参数控制布局中每行和每列的高度和宽度:
p facet_manual(
vars(drv), design = design,
heights = 4:1, # 4行,每行的高度依次是4,3,2,1
widths = unit(1:3, "cm") # 3列,每列的宽度依次是1,2,3
)
plot of chunk unnamed-chunk-14
只要给出合适的布局,重叠也是可以的:
代码语言:javascript复制design <- "
AA#
ACB
#BB
"
p facet_manual(vars(drv), design = design)
plot of chunk unnamed-chunk-15
分面的条带设置
提供了strip_vanilla()/strip_themed()/strip_nested()
函数用以控制strip的诸多细节。
p2 <- p
theme(strip.background = element_rect(colour = "black", size = 2),
axis.line.y = element_line(colour = "black", size = 2))
p2
plot of chunk unnamed-chunk-16
代码语言:javascript复制p2 facet_wrap2(vars(year), strip = strip_vanilla(clip = "on"))
ggtitle('clip = "on"')
plot of chunk unnamed-chunk-16
代码语言:javascript复制p2 facet_wrap2(vars(year), strip = strip_vanilla(clip = "off"))
ggtitle('clip = "off"')
plot of chunk unnamed-chunk-16
代码语言:javascript复制df <- data.frame(
long = paste("A long title that is going to make then",
"smaller title take up too much space"),
short = LETTERS[1:3],
x = 1:3, y = 1:3
)
p2 <- ggplot(df, aes(x, y))
geom_point()
theme(strip.text.y.left = element_text(angle = 0),
strip.placement = "outside",
plot.title.position = "plot")
p2
plot of chunk unnamed-chunk-17
代码语言:javascript复制p2 facet_grid2(long short ~ ., switch = "y",
strip = strip_vanilla(size = "constant"))
ggtitle('size = "constant"')
plot of chunk unnamed-chunk-17
代码语言:javascript复制p2 facet_grid2(long short ~ ., switch = "y",
strip = strip_vanilla(size = "variable"))
ggtitle('size = "variable"')
plot of chunk unnamed-chunk-18
代码语言:javascript复制ridiculous_strips <- strip_themed(
# Horizontal strips
background_x = elem_list_rect(fill = c("limegreen", "dodgerblue")),
text_x = elem_list_text(colour = c("dodgerblue", "limegreen"),
face = c("bold", "bold")),
by_layer_x = TRUE,
# Vertical strips
background_y = elem_list_rect(
fill = c("gold", "tomato", "deepskyblue")
),
text_y = elem_list_text(angle = c(0, 90)),
by_layer_y = FALSE
)
p facet_grid2(class ~ drv year, strip = ridiculous_strips)
plot of chunk unnamed-chunk-19
代码语言:javascript复制p facet_grid2(
. ~ drv year,
strip = strip_themed(
background_x = list(NULL, element_rect(colour = "black"), element_blank(),
element_rect(fill = "black")),
text_x = list(NULL, NULL, NULL, element_text(colour = "white"))
)
)
plot of chunk unnamed-chunk-20
代码语言:javascript复制p facet_wrap2(
vars(cyl, drv), ncol = 4,
strip = strip_nested(bleed = FALSE)
)
ggtitle('bleed = FALSE')
plot of chunk unnamed-chunk-21
代码语言:javascript复制p facet_grid2(
cols = vars("Outer label", "Inner label"),
switch = "x", strip = strip_vanilla()
)
ggtitle("strip_vanilla()")
plot of chunk unnamed-chunk-22
代码语言:javascript复制p facet_grid2(
cols = vars("Outer label", "Inner label"),
switch = "x", strip = strip_nested()
)
ggtitle("strip_nested()")
plot of chunk unnamed-chunk-22
以上就是今天的内容,希望对你有帮助哦!