Hide box a whiskery v geom_boxplot (), kde N je malý

hlasů
1

Často jsem dělat krabicové diagramy, kde některé z těchto kategorií jsou poměrně malé, a jiní mají bohaté údaje, navrstvené s jittered syrové datových bodů. Já jsem hledal spolehlivý způsob, jak skrýt box a vousy pro kategorie, které jsou velmi malé (N <5). Cílem je, aby tyto malé kategorie ukáže jen nezpracovaná data pomocí geom_point () vrstvu, ale položky, kde to dává smysl, by se léčba box-a-chlup. To, co se zdálo mi jasné, mapování alpha v geom_boxplot () vrstvě na faktor proměnné založené na N, nefunguje, protože alfa řídí pouze výplň a možná i velkou odchylku ve geom_boxplot, nikoli krabice a vousy.

Zjistil jsem, že kludgey řešení v minulosti, který pracoval tak dlouho, jak jsem byl ochoten ztrácet základních barevných složek na tomto problému. Nicméně, často chci vlastně použít barvu na něco jiného, ​​a mapování dvakrát vede k drsný výstup. Dalším kludgey řešení, které mě napadá, je pomocí datového podmnožinu z nichž byly malé kategorie odstraněné - problém s tímto plánem je, že nebude správně zpracovat situace, kdy se tyto kategorie jsou předmětem position_dodge () (jak Dodge bude „vidět příliš málo kategorií).

Minimální níže uvedený příklad.

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))
Položena 10/10/2019 v 00:44
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
0

Můžete použít position_dodge(preserve = "single")v geom_boxplot()říci ggplot udržovat stálou šířku Boxplots i při chybějících údajů.

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

zadejte popis obrázku zde

Odpovězeno 10/10/2019 v 18:53
zdroj uživatelem

hlasů
0

Dobře, já si nemyslím, že tento způsob je nutně lepší než vaše současné možnosti, ale ... Dalo by se rozdělit do df DFS pro boxplot a Scatterplot a upravit hodnoty dat, kterou chcete odebrat z boxplot do bude cesta ven z rozsahu (např 1000 zde). Pak plot obou, a konečně použít coord_cartesianpro zvětšení na příslušném úseku.

Chcete-li vytvořit df_box, GROUP by groupa sex, a změnit hodnoty skupin <5 datových bodů na 1000 (takže nemáme na hard-kódu, ve které váží ke změně).

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

obraz

Odpovězeno 10/10/2019 v 01:13
zdroj uživatelem

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