ggplot2 behalte nicht verwendete Levels als Barplot

94

Ich möchte nicht verwendete Ebenen (dh Ebenen mit einer Anzahl von 0) in meinem Balkendiagramm darstellen. Nicht verwendete Ebenen werden jedoch gelöscht, und ich kann nicht herausfinden, wie sie beibehalten werden sollen

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

Im obigen Beispiel möchte ich C mit einer Zählung von 0 zeichnen sehen, aber es fehlt vollständig ...

Danke für jede Hilfe Ulrik

Bearbeiten:

Das macht was ich will

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

Vermutlich besteht die Lösung darin, die Frequenzen mithilfe von table () zu berechnen und dann zu zeichnen

Ulrik
quelle

Antworten:

60

Sie müssen drop = FALSE auf beiden Skalen (fill und x) wie folgt einstellen:

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)

Bearbeiten:

Ich bin mir ziemlich sicher, dass das funktioniert. Ich habe vergessen, x in Typ anstelle von Gruppe zu ändern und die Position = 'Ausweichen'! Einfach einfügen und testen. Der stat_bin behandelt Bins mit Nullzählungen. Überprüfen Sie die Dokumente .

Jarretinha
quelle
Ich denke, dies sollte die Antwort auf die Frage des OP sein. Die Antwort kümmert sich auch um das gesunkene Level in der Legende.
SavedByJESUS
Wenn ich das mache, ändert es die Farben meiner Balken. Gibt es eine Möglichkeit, die Originalfarben beizubehalten?
RAB
70

Macht das was du willst?

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

Geben Sie hier die Bildbeschreibung ein

smillig
quelle
9

Das Löschen von Levels funktioniert nicht. Ablegen von Levels im ersten Beispiel

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)

Ergebnisse in dieser Handlung:

Geben Sie hier die Bildbeschreibung ein

Die Lösung ist im zweiten Beispiel, wo die Frequenzen manuell berechnet werden:

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

Ergebnisse in diesem:

Geben Sie hier die Bildbeschreibung ein

Der letzte ist am informativsten, da der Platz von den Kategorien dort belegt wird. Count = 0

Ulrik
quelle
1

Sie können auch "scale_fill_color" verwenden, zum Beispiel:

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
quelle