Angenommen, ich habe einen Datenrahmen mit einigen fehlenden Werten:entfernen Legende Einträge und Facetten, wenn alle Daten sind NA
df <- data.frame(
group = rep(c("A", "B", "C"), each = 3),
x = runif(9),
y = c(runif(6), NA, NA, NA)
)
Und ich will es plotten einer ästhetischen Mapping und/oder eine Facette:
ggplot(df, aes(x, y)) +
geom_point(aes(color = group)) +
facet_grid(.~group, drop = T) +
theme_bw()
Welche die folgende Warnmeldung und Grafik erzeugt:
Warning message:
Removed 3 rows containing missing values (geom_point).
Wie Sie sehen können, gibt es in der C-Gruppe keine Beobachtungen für y, was bedeutet, dass keine Daten für die Gruppe geplottet werden können. Ggplot erstellt jedoch immer noch eine leere C-Facette und einen C-Legendeneintrag. Gibt es eine Möglichkeit, ggplot zu erkennen, dass alle Daten aus Gruppe C gelöscht werden und der entsprechende Facetten- und Legendeneintrag entfernt wird?
Eine Lösung besteht offensichtlich darin, diese Zeilen aus den zugrunde liegenden Daten zu entfernen. Allerdings hat mein nicht vereinfachter Datenrahmen Dutzende von Spalten, die als Gruppen- oder Achsenvariablen verwendet werden könnten, mit Blöcken von NA-Werten, die überall verstreut sind. Dies bedeutet, dass ich die Daten für jedes Diagramm, das ich erstellen möchte, unterschiedlich unterteilen muss. Ich hoffe auf eine einfachere Lösung.
Ich habe verwandte Fragen zu unused factors in single facets und subsets of data gesehen, aber die dort vorgestellten Lösungen scheinen aufgrund der NA-Werte nicht mit fehlenden Daten zu funktionieren.
EDIT, um zusätzliche Komplexität zu klären: die Daten an der Spitze sind vereinfacht, und schlagen eine einfache Lösung wie na.omit()
vor. Allerdings sehen meine realen Daten etwas mehr wie diese (noch vereinfacht, natürlich):
df <- data.frame(
group = rep(c("A", "B", "C"), each = 3),
v = c(runif(3), rep(NA, 6)),
w = c(NA, NA, NA, runif(6)),
x = runif(9),
y = c(runif(6), NA, NA, NA),
z = runif(9)
)
ich viele verschiedene Diagramme erstellen möchten, die die Beziehungen zwischen den verschiedenen Variablen zeigt. Also, wenn ich x gegen z grafisch darstellen möchte, würde ich alle drei Facetten und Legendeneinträge zeigen, während wenn ich w gegen y grafisch darstellen würde, würde ich nur B anzeigen. Das Ausführen von na.omit()
auf diesem Datenrahmen löscht jede Zeile.
Offensichtlich konnte ich den Datenrahmen nur auf die Spalten setzen, die ich für die grafische Darstellung verwenden werde, und dann NA-Zeilen entfernen. Dazu muss ich jedoch für jeden Graphen einen neuen Datenrahmen erstellen, der langwierig und unelegant erscheint. Aus diesem Grund hoffe ich auf eine spezifischere ggplot-basierte Lösung. (Natürlich werde ich eine Antwort wie "es gibt keine ggplot Lösung, Sie müssen einen neuen Datenrahmen für jede Grafik erstellen" akzeptieren, wenn dies tatsächlich der Fall ist).
Verwenden 'na.omit (df)' statt 'df' in Sie' ggplot' rufen: 'ggplot (na. Auslassen (df), aes (x, y)) + ... 'wird Ihnen das gewünschte Ergebnis geben. – Jaap
@ProcrastinatusMaximus siehe oben Bearbeiten für warum Ihr Vorschlag nicht funktioniert (zumindest in der aktuellen Form). Obwohl die Frage, auf die Sie sich bezogen haben, die Grundlage für eine praktikable Lösung enthält, glaube ich nicht, dass es sich um ein Duplikat handelt, da ich nach einem deutlich anderen Verhalten frage, das möglicherweise eine alternative, einfachere Lösung bietet. – Joe
Ok, ich habe wieder geöffnet und eine Lösung gepostet. HTH. – Jaap