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

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 .


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


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


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)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.