Quero usar facet_wrap para traçar valores diferentes no eixo x para grupos diferentes. Porém, ao usar scale = "free_x"
, mostra valores únicos dentro de cada grupo. Veja exemplo abaixo:
library(ggplot2)
set.seed(1234)
nb = rep(LETTERS[1:3],4)
expand.grid(LETTERS[1:3], 1:3)
df = data.frame(ps = paste(rep(c("ps1","gc1"),6)),
cr = rep(LETTERS[1:3],4),
id = rep(x = month.abb[1:4], each = 3));df
df = df[order(df$ps),]
df[df$ps == "ps1","cr"] <- sample(LETTERS[4:6], size = 6, replace = TRUE)
df.all = rbind(df,df,df,df,df,df)
df.all$val = rnorm(n = nrow(df.all))
ggplot(df.all,
aes(x = cr,
y = val)) +
geom_violin() +
facet_wrap(vars(ps, id),
scales = "free_x",
ncol = 4) +
geom_point(position = position_jitter(width = 0.1, height = 0.1),
alpha= .3)
Na imagem aqui (que é a saída do código acima), adicionei os níveis que faltavam. Basicamente, existe o grupo "gc1" onde eu gostaria que os níveis não caíssem. Mas também não quero que os níveis do "ps1" apareçam no "gc1". Então, no final, gc1 deve mostrar apenas os níveis A, B, C e ps1 deve mostrar apenas D, E e F. Existe uma maneira de fazer isso?
Você pode alcançar o resultado desejado usando o
ggh4x
pacote queggh4x::facetted_pos_scales
permite definir as escalas para cada faceta individualmente, por exemplo, para o seu caso, você poderia fazer:EDIT Aqui está uma abordagem para criar as escalas dinamicamente a partir dos dados que percorrem os
ps
grupos e usamreformulate
para criar osformula
s forfacetted_pos_scales
:Aqui está uma solução alternativa: