最快的黑客:用情节伪造侧面并组合。这需要一些黑客攻击,但它可能仍然比搞乱怪物要少一些:
- 为小平面图创建联合变量。
- 制作假面并与拼布等包装结合。将图的边距减少到负值,这样就真的没有边距了。
- 使相对高度比高得离谱,因此第二个图消失,只剩下小面条。
library(patchwork)
library(tidyverse)
df <- head(mtcars,5)
df <- df %>% mutate(am_carb = factor(paste(am,carb,sep = '_'),
labels = c( ' 1','2','1','4')))
##note!! the blank space in ' 1' label is on purpose!!! this is to make those labels unique, otherwise it would consider both '1' the same category!!
p1 <-
df %>%
ggplot(aes(gear, disp)) +
geom_bar(stat = "identity") +
facet_grid(~am_carb, scales = "free_x") +
theme(panel.spacing.x = unit(0,"cm"),
plot.margin = margin(t = -2),
strip.background = element_rect(colour = "black",fill = "white"),
panel.background = element_rect(colour = "white", fill = "white"),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank())
p2 <-
df %>%
ggplot(aes(gear, disp)) +
geom_blank() +
facet_grid(~ am, scales = "free_x") +
theme(panel.spacing.x = unit(0,"cm"),
axis.text = element_blank(),
axis.ticks = element_blank(),
axis.title = element_blank(),
plot.margin = margin(b = -2),
strip.background = element_rect(colour = "black",fill = "white"),
panel.background = element_rect(colour = "white", fill = "white"),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank())
p2/p1 + plot_layout(heights = c(0.1,100) )
Created on 2020-03-24 by the reprex package https://reprex.tidyverse.org (v0.3.0)
用新数据更新- 一些更复杂的方面。事实上,拼凑在这里很困难。将假面转换为网格对象并更改宽度后,更容易将假面与牛图结合起来。全部在里面cowplot
.
mydat <- structure(list(par = c("Par1", "Par1", "Par1", "Par1", "Par1", "Par1", "Par1", "Par1", "Par1", "Par1", "Par1", "Par1", "Par1", "Par1", "Par1", "Par1", "Par1", "Par1", "Par1", "Par1", "Par1", "Par1", "Par1", "Par1", "Par1", "Par1", "Par1", "Par2", "Par2", "Par2"), channel_1 = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 1L, 1L, 1L), .Label = c("Center", "Left \nFrontal", "Left \nFrontal Central", "Left \nCentral Parietal", "Left \nParietal Ooccipital", "Left", "Right \nFrontal", "Right \nFrontal Central", "Right \nCentral Parietal", "Right \nParietal Ooccipital", "Right"), class = "factor"), freq = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("Alpha", "Beta", "Gamma"), class = "factor"), group = c("a", "b", "c", "a", "b", "c", "a", "b", "c", "a", "b", "c", "a", "b", "c", "a", "b", "c", "a", "b", "c", "a", "b", "c", "a", "b", "c", "a", "b", "c"), m = c(0.488630500442935, 0.548666228768508, 0.0441536349332613, 0.304475866391531, 0.330039488441422, 0.0980622573307064, 0.0963996979198171, 0.301679466108907, 0.240618782227119, 0.35779695722622, 0.156116647839907, 0.0274546218676152, 0.0752501569920047, 0.289342864254614, 0.770518960576786, 0.548130676907356, 0.180158614358946, 0.238520826021687, 0.406326198917495, 0.159739769132509, 0.140739952534666, 0.295427640977557, 0.106130817023844, 0.214006898241167, 0.31081727835652, 0.366982521446529, 0.264432086988446, 0.0761271112139142, 0.0811642772125171, 0.0700455890939194), se = c(0.00919040825504951, 0.00664655073810519, 0.0095517721611042, 0.00657090455386036, 0.00451135146762504, 0.0188625074573698, 0.00875378313351897, 0.000569521129673224, 0.00691447732630984, 0.000241814142091401, 0.0124584589176995, 0.00366855139256551, 0.0072981677277562, 0.0160663614099261, 0.00359337442316408, 0.00919725279757502, 0.040856967817406, 0.00240910563984416, 0.0152236046767608, 0.00765487375180611, 0.00354140237391633, 0.00145468584619171, 0.0185141245423404, 0.000833307847848054, 0.0038193622895167, 0.0206130436440409, 0.0066911922721337, 7.3079999953491e-05, 0.0246233416039572, 0.00328150956514463)), row.names = c(NA, -30L), class = c("tbl_df", "tbl", "data.frame"))
library(tidyverse)
library(cowplot)
#>
#> ********************************************************
#> Note: As of version 1.0.0, cowplot does not change the
#> default ggplot2 theme anymore. To recover the previous
#> behavior, execute:
#> theme_set(theme_cowplot())
#> ********************************************************
mydat <- mydat %>% mutate(par_freq = factor(paste(par,freq,sep = '_'), labels = c('Alpha', 'Beta', 'Gamma', 'Gamma ' )))
p1 <-
mydat %>%
ggplot(aes(channel_1, m, group = group, fill = group, color = group)) +
geom_bar(stat = "identity") +
facet_grid( ~ par_freq, scales = "free_x", space="free_x") +
theme(panel.spacing.x = unit(0,"cm"),
plot.margin = margin(t = -2),
strip.background = element_rect(colour = "black",fill = "white"),
panel.background = element_rect(colour = "white", fill = "white"),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
legend.position = 'none')
p2 <-
mydat %>%
ggplot(aes(channel_1, m, group = group, fill = group, color = group)) +
geom_blank() +
facet_grid(~ par) +
theme(panel.spacing.x = unit(0,"cm"),
axis.text = element_blank(),
axis.ticks = element_blank(),
axis.title = element_blank(),
plot.margin = margin(b = -2),
strip.background = element_rect(colour = "black",fill = "white"),
panel.background = element_rect(colour = "white", fill = "white"),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank())
gt <- cowplot::as_gtable(p2)
gt$widths[5] <- 8*gt$widths[7]
cowplot::plot_grid(gt, p1, align = "v", axis = 'l',nrow = 2, rel_heights = c(5, 100))
# you need to play around with the values unfortunately.
Created on 2020-03-24 by the reprex package https://reprex.tidyverse.org (v0.3.0)
一些额外的想法
我认为人们无法绕过这样的黑客 - 因为原始图的 gtable_layout (具有两个方面变量)显示整个方面条是一个 grob!这个答案证明我错了 - grob 包含两个条带的嵌套表! https://stackoverflow.com/a/40316170/7941188。但由于有一个更简单的解决方案ggnomics
包 - 请参阅我的第二个答案
p_demo <- ggplot(mydat, aes(channel_1, m)) +
geom_bar(stat = "identity") +
facet_grid(~par +freq , space = "free_x", scales = "free_x") +
theme(panel.spacing.x = unit(0,"cm"))
gt <- cowplot::as_gtable(p_demo)
gtable::gtable_show_layout(gt)
Created on 2020-03-24 by the reprex package https://reprex.tidyverse.org (v0.3.0)