web-dev-qa-db-fra.com

Supprimer les niveaux de facteur inutilisés d'un graphique à barres ggplot

Je veux faire l'opposé de cette question , et en quelque sorte l'opposé de cette question , bien qu'il s'agisse de légendes, pas de l'intrigue elle-même.

Les autres SO questions semblent demander comment garder niveaux de facteurs inutilisés. J'aimerais que le mien soit retiré. J'ai plusieurs variables de nom et plusieurs colonnes (format large) d'attributs de variable que j'utilise pour créer de nombreux graphiques à barres. Voici un exemple reproductible:

library(ggplot2)
df <- data.frame(name=c("A","B","C"), var1=c(1,NA,2),var2=c(3,4,5))
ggplot(df, aes(x=name,y=var1)) + geom_bar()

J'ai compris:

enter image description here

Je voudrais seulement les noms qui ont le var correspondantns'affiche dans mon graphique à barres (comme dans, il n'y aurait pas d'espace vide pour B).

La réutilisation du code de tracé de base sera assez facile si je peux simplement changer le nom de mon fichier de sortie et le bit y=var. Je ne voudrais pas avoir à sous-définir ma trame de données juste pour utiliser des droplevels sur le résultat pour chaque tracé si possible!


Mise à jour basée sur la suggestion na.omit()

Considérons un ensemble de données révisé:

library(ggplot2)
df <- data.frame(name=c("A","B","C"), var1=c(1,NA,2),var2=c(3,4,5), var3=c(NA,6,7))
ggplot(df, aes(x=name,y=var1)) + geom_bar()

J'ai besoin d'utiliser na.omit() pour tracer var1 Car il y a un NA présent. Mais puisque na.omit s'assure que les valeurs sont présentes pour toutes les colonnes, le tracé supprime également A car il a un NA dans var3. C'est plus analogue à mes données. J'ai 15 réponses au total avec NAs parsemé. Je veux seulement supprimer les niveaux de facteur qui n'ont pas de valeurs pour le vecteur y actuel, pas ceux qui ont des NA dans n'importe quel vecteur dans la trame de données entière .

19
Hendy

Une option simple consiste à utiliser na.omit() sur votre bloc de données df pour supprimer ces lignes avec NA

ggplot(na.omit(df), aes(x=name,y=var1)) + geom_bar()

Compte tenu de votre mise à jour, les éléments suivants

ggplot(df[!is.na(df$var1), ], aes(x=name,y=var1)) + geom_bar()

fonctionne bien et ne considère que NA dans Var1. Étant donné que vous ne traitez que name et Var, appliquez na.omit() à un bloc de données contenant uniquement ces variables

ggplot(na.omit(df[, c("name", "var1")]), aes(x=name,y=var1)) + geom_bar()
20
Gavin Simpson

Notez que, lors du traçage, vous n'utilisez que deux colonnes de votre bloc de données, ce qui signifie que, plutôt que de passer l'intégralité de votre data.frame, vous pouvez prendre les colonnes pertinentes x[,c("name", "var1")] appliquer na.omit pour supprimer les éléments indésirables lignes (comme le suggère Gavin Simpson) na.omit(x[,c("name", "var1")]), puis tracez ces données.

Mon R/ggplot est assez rouillé, et je me rends compte qu'il existe probablement des moyens plus propres d'y parvenir.

5
Tilo Wiklund