You can做你通过黑客要求的事情:如果你替换你的空白limits
与第一个值"a"
,ggplot 会将条形图放置在第一次出现的位置,并将接下来的条形图留空:
my.data <-data.frame (x=rep(c("a", "b", "c", "d"),3),
y=c("e", "f", "g"))
ggplot(my.data, aes(x=x, fill = y)) +
geom_bar(position = "fill") +
scale_x_discrete(limits = c("a", "a", "b", "a", "c", "d"))
但是,那right分隔变量的方法是通过分面,这需要一个变量来定义您想要的组,例如
library(dplyr)
# create with your favorite grammar
my.data %>% mutate(grp = case_when(.$x == 'a' ~ 1,
.$x == 'b' ~ 2,
TRUE ~ 3))
#> x y grp
#> 1 a e 1
#> 2 b f 2
#> 3 c g 3
#> 4 d e 3
#> 5 a f 1
#> 6 b g 2
#> 7 c e 3
#> 8 d f 3
#> 9 a g 1
#> 10 b e 2
#> 11 c f 3
#> 12 d g 3
您可以将其传递给 ggplot 进行分面:
my.data %>% mutate(grp = case_when(.$x == 'a' ~ 1,
.$x == 'b' ~ 2,
TRUE ~ 3)) %>%
ggplot(aes(x, fill = y)) +
geom_bar(position = 'fill') +
facet_grid(. ~ grp, space = 'free_x', scales = 'free_x')