Hide scatola e baffi in geom_boxplot () quando N è piccolo

voti
1

Mi capita spesso di fare i grafici a scatole in cui alcune delle categorie sono piuttosto piccoli e altri hanno dati abbondante, sovrapposti con datapoints prime jittered. Sto cercando un modo affidabile per nascondere la scatola e baffi per le categorie che sono molto piccole (N <5). L'obiettivo è che quei piccoli categorie avrebbero mostrato solo i dati grezzi utilizzando uno strato geom_point (), ma le categorie in cui ha senso otterrebbe il trattamento box-and-whisker. La cosa che sembrava ovvio per me, la mappatura alpha nello strato geom_boxplot () a una variabile fattore sulla base di N, non funziona perché alfa controlla solo il riempimento e forse i valori anomali in geom_boxplot, non la scatola e baffi.

Ho trovato una soluzione kludgey in passato che ha funzionato finché ero disposto a sprecare il parametro colore su questo problema. Tuttavia, pratico utilizzare effettivamente il colore per qualcos'altro, e la mappatura due volte conduce ad uscita nodoso. Un'altra soluzione kludgey che si verifica a me sta usando un sottoinsieme di dati da cui piccole categorie sono stati cancellati - il problema con questo piano è che non gestisce correttamente situazioni in cui queste categorie sono soggetti a position_dodge () (come la Dodge vedrà anche alcune categorie).

esempio minimo sotto.

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))
È pubblicato 10/10/2019 alle 00:44
fonte dall'utente
In altre lingue...                            


2 risposte

voti
0

È possibile utilizzare position_dodge(preserve = "single")in geom_boxplot()per dire ggplot per mantenere una larghezza costante per i grafici a scatole anche con dati mancanti.

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))

entrare descrizione dell'immagine qui

Risposto il 10/10/2019 a 18:53
fonte dall'utente

voti
0

Va bene, non credo che in questo modo è necessariamente meglio di le opzioni attuali, ma ... si potrebbe dividere il df in DFS per il grafico a scatole e la dispersione, e modificare i valori dei dati che desideri venga rimossa dal grafico a scatole a essere modo fuori intervallo (ad esempio, 1000 qui). Poi tracciare sia, e, infine, utilizzare coord_cartesianper ingrandire relativa sezione.

Per creare il df_box, noi del gruppo per groupe sex, e modificare i valori dei gruppi con <5 datapoint a 1000 (in modo che non abbiamo a hard-code in cui i valori per cambiare).

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))

Immagine

Risposto il 10/10/2019 a 01:13
fonte dall'utente

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