ggplot2 zachowuje nieużywane poziomy barplot

102

Chcę wykreślić nieużywane poziomy (to znaczy poziomy, których liczba wynosi 0) na moim wykresie słupkowym, jednak niewykorzystane poziomy są pomijane i nie mogę dowiedzieć się, jak je zachować

df <- data.frame(type=c("A", "A", "A", "B", "B"), group=rep("group1", 5))
df$type <- factor(df$type, levels=c("A","B", "C"))

ggplot(df, aes(x=group, fill=type)) + geom_bar()

W powyższym przykładzie chcę, aby C wykreślono z liczbą 0, ale jest całkowicie nieobecne ...

Dzięki za wszelką pomoc Ulrik

Edytować:

Robi to, czego chcę

df <- data.frame(type=c("A", "A", "A", "B", "B"), group=rep("group1", 5))
df1 <- data.frame(type=c("A", "A", "A", "B", "B", "A", "A", "C", "B", "B"), group=c(rep("group1", 5),rep("group2", 5)))

df$type <- factor(df$type, levels=c("A","B", "C"))
df1$type <- factor(df1$type, levels=c("A","B", "C"))
df <- data.frame(table(df))

df1 <- data.frame(table(df1))

ggplot(df, aes(x=group, y=Freq, fill=type)) + geom_bar(position="dodge")
ggplot(df1, aes(x=group, y=Freq, fill=type)) + geom_bar(position="dodge")

Zgadnij, że rozwiązaniem jest obliczenie częstotliwości za pomocą tabeli (), a następnie wykreślenie

Ulrik
źródło

Odpowiedzi:

69

Musisz ustawić drop = FALSE na obu skalach (wypełnienie i x) w następujący sposób:

library(ggplot2)
df <- data.frame(type=c("A", "A", "A", "B", "B"), group=rep("group1", 5))
df1 <- data.frame(type=c("A", "A", "A", "B", "B", "A", "A", "C", "B", "B"), group=c(rep("group1", 5),rep("group2", 5)))
df$type <- factor(df$type, levels=c("A","B", "C"))
df1$type <- factor(df1$type, levels=c("A","B", "C"))

plt <- ggplot(df, aes(x=type, fill=type)) + geom_bar(position='dodge') + scale_fill_discrete(drop=FALSE) + scale_x_discrete(drop=FALSE)
plt1 <-  ggplot(df1, aes(x=type, fill=type)) + geom_bar(position='dodge') + scale_fill_discrete(drop=FALSE) + scale_x_discrete(drop=FALSE)

Edytować:

Jestem prawie pewien, że to działa. Zapomniałem zmienić x na typ zamiast grupy, a pozycja = „unik”! Po prostu wklej i przetestuj. Stat_bin zajmuje się pojemnikami z zerowymi liczbami. Sprawdź dokumenty .

Jarretinha
źródło
Myślę, że to powinna być odpowiedź na pytanie PO. Odpowiedź dotyczy również obniżonego poziomu w legendzie.
SavedByJESUS
kiedy to robię, zmienia kolory moich pasków. Czy jest sposób, aby zachować oryginalne kolory?
morgan121
71

Czy to robi, co chcesz?

ggplot(df, aes(x=type)) + geom_bar() + scale_x_discrete(drop=FALSE)

wprowadź opis obrazu tutaj

smillig
źródło
9

Obniżanie poziomów nie działa. Obniżanie poziomów w pierwszym przykładzie

library(ggplot2)

df <- data.frame(type=c("A", "A", "A", "B", "B"), group=rep("group1", 5))
df$type <- factor(df$type, levels=c("A","B", "C"))

ggplot(df, aes(x=group, fill=type)) + geom_bar(position="dodge") + scale_x_discrete(drop=FALSE) + scale_fill_discrete(drop=FALSE)

wyniki w tym wykresie:

wprowadź opis obrazu tutaj

Rozwiązanie znajduje się w drugim przykładzie, w którym częstotliwości są obliczane ręcznie:

df <- data.frame(type=c("A", "A", "A", "B", "B"), group=rep("group1", 5))
df1 <- data.frame(type=c("A", "A", "A", "B", "B", "A", "A", "C", "B", "B"), group=c(rep("group1", 5),rep("group2", 5)))

df$type <- factor(df$type, levels=c("A","B", "C"))
df1$type <- factor(df1$type, levels=c("A","B", "C"))

df <- data.frame(table(df))
df1 <- data.frame(table(df1))

df$plot = "A"
df1$plot = "B"

df <- rbind(df, df1)

ggplot(df, aes(x=group, y=Freq, fill=type)) + geom_bar(position="dodge", stat="identity") + facet_wrap( ~ plot, scales="free")

Skutkuje to:

wprowadź opis obrazu tutaj

Ta ostatnia jest najbardziej pouczająca, ponieważ miejsce zajmują kategorie, których licznik = 0

Ulrik
źródło
1

możesz też użyć „scale_fill_color” na przykład:

plt <- ggplot(df, aes(x=type, fill=type)) + geom_bar(position='dodge') + scale_x_discrete(drop=FALSE)+
scale_fill_manual(
  values = c(
    "#ff6666",
    "#cc9900",
    "#cc9900",
    ),drop=FALSE)
Yan Zhang
źródło