Ocultar a caixa de bigodes e em geom_boxplot () Quando N é pequeno

votos
1

I freqüentemente fazem boxplots onde algumas das categorias são bastante pequeno e os outros têm dados abundantes, sobrepostas com datapoints matérias Jittered. Eu estou procurando uma maneira confiável para ocultar a caixa e bigodes para categorias que são muito pequenos (N <5). O objetivo é que essas pequenas categorias iria mostrar apenas os dados brutos usando uma camada geom_point (), mas as categorias em que faz sentido iria receber o tratamento box-and-whisker. A única coisa que parecia óbvio para mim, mapeamento alfa na camada geom_boxplot () a uma variável fator com base em N, não funciona porque alpha só controla o preenchimento e talvez os valores atípicos em geom_boxplot, não a caixa e bigodes.

Eu encontrei uma solução kludgey no passado que trabalhou enquanto eu estava disposto a desperdiçar o parâmetro de cor sobre este problema. No entanto, muitas vezes eu quero realmente usar cor para outra coisa, e mapeá-lo duas vezes leva à saída gnarly. Outra solução kludgey que me ocorre é usando um subconjunto de dados a partir do qual foram excluídos pequenas categorias - o problema com este plano é que ele não vai lidar corretamente com situações em que essas categorias estão sujeitas a position_dodge () (como o Dodge vai ver poucas categorias).

exemplo mínimo abaixo.

df <- data.frame(group=factor(sample(c(A,B), size=110, replace=TRUE)),
                 sex=factor(c(rep(M,50), rep(F, 50), rep(NB, 10))),
                 height=c(rnorm(50, 70, 6), rnorm(50, 63, 6), rnorm(10, 65, 6)))

dfsub <- filter(df, !(sex==NB & group==A))

ggplot(df, aes(x=group, y=height, colour=sex)) +
  geom_boxplot(data=dfsub) +
  geom_point(position=position_jitterdodge(jitter.width=0.2))
Publicado 10/10/2019 em 00:44
fonte usuário
Em outras línguas...                            


2 respostas

votos
0

Você pode usar position_dodge(preserve = "single")em geom_boxplot()dizer a ggplot para manter uma largura constante para boxplots mesmo com falta de dados.

require(tidyverse)

df <- data.frame(group = factor(sample(c("A", "B"), size = 110, replace = TRUE)),
                 sex = factor(c(rep("M", 50), rep("F", 50), rep("NB", 10))),
                 height = c(rnorm(50, 70, 6), rnorm(50, 63, 6), rnorm(10, 65, 6)))

n <- df %>% #calculate sample sizes
  group_by(group, sex) %>%
  summarize(n = n())

df <- left_join(df, n) %>% #join sample sizes to df
  #make second height column to use for boxplots: NA values if n is too small
  mutate(boxplot_height = ifelse(n < 5, NA, height)) 


ggplot(df, aes(x = group, colour = sex)) +
  #use height column that has groups with n < 5 coded as NA to plot boxplots
  geom_boxplot(aes(y = boxplot_height),
               #preserve = "single" maintains constant width of boxes 
               position = position_dodge(preserve = "single")) +
  geom_point(aes(y = height), #use all height data as y variable for points
             position = position_jitterdodge(jitter.width = 0.2))

digite descrição da imagem aqui

Respondeu 10/10/2019 em 18:53
fonte usuário

votos
0

Ok, eu não penso dessa forma é necessariamente melhor do que as opções atuais, mas ... Você poderia dividir o seu df em dfs para o boxplot ea dispersão, e modifique os valores dos dados que você deseja remover do boxplot para ser caminho para fora do intervalo (por exemplo, 1000 aqui). Em seguida, traçar ambos, e finalmente usar coord_cartesianpara aumentar o zoom na seção relevante.

Para criar a df_box, nós grupo, groupe sex, e alterar os valores dos grupos com <5 pontos de dados a 1000 (de modo que não temos a codificar em que valoriza a alterações).

df <- data.frame(group=factor(sample(c("A","B"), size=110, replace=TRUE)),
                 sex=factor(c(rep("M",50), rep("F", 50), rep("NB", 10))),
                 height=c(rnorm(50, 70, 6), rnorm(50, 63, 6), rnorm(10, 65, 6)))

df_box <- df %>%
    group_by(group, sex) %>%
    mutate(temp = ifelse(n() < 5, 1000, 1)) %>%
    ungroup() %>%
    mutate(height = ifelse(temp == 1000, 1000, height)) %>%
    select(-temp)

ggplot(df, aes(x=group, y=height, colour=sex)) +
    geom_boxplot(data=df_box) +
    geom_point(position=position_jitterdodge(jitter.width=0.2)) +
    coord_cartesian(ylim=c(50,90))

imagem

Respondeu 10/10/2019 em 01:13
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more