Supprimer les niveaux de facteurs non utilisés d'une placette à barres ggplot

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

les autres questions SO semblent se demander comment facteurs non utilisés. J'aimerais vraiment le mien supprimé. J'ai plusieurs variables de nom et plusieurs colonnes (grand format) d'attributs de variables que j'utilise pour créer de nombreux tracés de barre. Voici un reproductible exemple:

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'obtiens ceci:

enter image description here

Je ne veux que les noms qui ont le var correspondant n's dans mon bar de l'intrigue (comme dans, il n'y aurait pas d'espace vide pour B).

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


mise à jour basée sur le na.omit() suggestion

envisager 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 le traçage var1 parce qu'il y a un présent NA. Mais depuis na.omettre assure que les valeurs sont présentes pour toutes les colonnes, l'intrigue supprime A aussi bien puisqu'il a un NA dans var3. C'est plus analogue à mes données. J'ai un total de 15 réponses avec NAs peppered. Je ne souhaitez supprimer des niveaux de facteurs qui n'ont pas de valeurs pour les tracés vecteur y, pas qui ont NAs dans vecteur dans toute la base de données.

19
demandé sur Community 2012-07-10 01:03:08

2 réponses

une option facile est d'utiliser na.omit() sur votre bloc de données df pour supprimer ces lignes NA

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

compte tenu de votre mise à jour, les

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

fonctionne bien et ne considère que NAVar1. Etant donné que vous complotez seulement!--8--> et Var, s'appliquent na.omit() à une base de données ne contenant que les variables

ggplot(na.omit(df[, c("name", "var1")]), aes(x=name,y=var1)) + geom_bar()
20
répondu Gavin Simpson 2012-07-09 22:13:41

notez que, lorsque vous tracez, vous utilisez seulement deux colonnes de votre base de données, ce qui signifie que, plutôt que de passer vos données entières.encadrez vous pourriez prendre les colonnes pertinentes x[,c("name", "var1")] appliquer na.omettre d'enlever les indésirables lignes (comme Gavin Simpson suggère) na.omit(x[,c("name", "var1")]) et ensuite tracer ces données.

mon r / ggplot est assez rouillé, et je me rends compte qu'il y a probablement des moyens plus propres pour y parvenir.

5
répondu Tilo Wiklund 2012-07-09 21:30:39