web-dev-qa-db-fra.com

R ggplot - Erreur stat_bin nécessite une variable x continue

Ma table est data.combined avec la structure suivante:

'data.frame':   1309 obs. of  12 variables:
 $ Survived: Factor w/ 3 levels "0","1","None": 1 2 2 2 1 1 1 1 2 2 ...
 $ Pclass  : Factor w/ 3 levels "1","2","3": 3 1 3 1 3 3 1 3 3 2 ...
 $ Name    : Factor w/ 1307 levels "Abbing, Mr. Anthony",..: 109 191 358 277 16 559 520 629 417 581 ...
 $ Sex     : num  2 1 1 1 2 2 2 2 1 1 ...
 $ Age     : num  22 38 26 35 35 NA 54 2 27 14 ...
 $ SibSp   : int  1 1 0 1 0 0 0 3 0 1 ...
 $ Parch   : int  0 0 0 0 0 0 0 1 2 0 ...
 $ Ticket  : Factor w/ 929 levels "110152","110413",..: 524 597 670 50 473 276 86 396 345 133 ...
 $ Fare    : num  7.25 71.28 7.92 53.1 8.05 ...
 $ Cabin   : Factor w/ 187 levels "","A10","A14",..: 1 83 1 57 1 1 131 1 1 1 ...
 $ Embarked: Factor w/ 4 levels "","C","Q","S": 4 2 4 4 4 3 4 4 4 2 ...
 $ Title   : Factor w/ 4 levels "Master.","Miss.",..: 3 3 2 3 3 3 3 1 3 3 ...

Je veux dessiner un graphique reflétant la relation entre Title et Survived, catégorisée par Pclass. J'ai utilisé le code suivant:

  ggplot(data.combined[1:891,], aes(x=Title, fill = Survived)) +
  geom_histogram(binwidth = 0.5) +
  facet_wrap(~Pclass) +
  ggtitle ("Pclass") +
  xlab("Title") +
  ylab("Total count") +
  labs(fill = "Survived")

Cependant, cela entraîne une erreur: Error: StatBin requires a continuous x variable the x variable is discrete. Perhaps you want stat="count"?

Si je change la variable Title en numeric: data.combined$Title <- as.numeric(data.combined$Title), alors le code fonctionne mais le libellé du graphique est également numérique (ci-dessous). S'il vous plaît dites-moi pourquoi cela se produit et comment y remédier. Merci.

Au fait, j'utilise R 3.2.3 sur Mac El Capital.

Graphique: Au lieu de Mr, Mlle, Mrs, l'axe des abscisses montre les valeurs numériques 1,2,3,4

 enter image description here

12
Kha Nguyen

Résumez la réponse des commentaires ci-dessus:

1 - Remplacez geom_histogram(binwidth=0.5) par geom_bar(). Cependant, cette façon ne permettra pas la personnalisation de binwidth.

2 - Utiliser stat_count(width = 0.5) au lieu de geom_bar() ou geom_histogram(binwidth = 0.5) le résoudrait.

15
Kha Nguyen

 graph

extractTitle <- function(Name) {     
Name <- as.character(Name) 

  if (length(grep("Miss.", Name)) > 0) { 
    return ("Miss.")
  } else if (length(grep("Master.", Name)) > 0) { 
    return ("Master.") 
  } else if (length(grep("Mrs.", Name)) > 0) { 
    return ("Mrs.") 
  } else if (length(grep("Mr.", Name)) > 0) { 
    return ("Mr.") 
 } else { 
    return ("Other") 
  } 
}

titles <- NULL 

for (i in 1:nrow(data.combined)){
  titles <- c(titles, extractTitle(data.combined[i, "Name"]))
}

data.combined$title <- as.factor(titles)

ggplot(data.combined[1:892,], aes(x = title, fill = Survived))+
       geom_bar(width = 0.5) +
        facet_wrap("Pclass")+
         xlab("Pclass")+
         ylab("total count")+
         labs(fill = "Survived")  
2
Deepak Harish

Comme indiqué ci-dessus, utilisez geom_bar () au lieu de geom_histogram, reportez-vous à l'exemple de code ci-dessous (je souhaitais un graphique séparé pour chaque mois pour les données de date de naissance): 

ggplot(data = pf,aes(x=dob_day))+
geom_bar()+
scale_x_discrete(breaks = 1:31)+
facet_wrap(~dob_month,ncol = 3)
1
user5486263

J'ai eu le même problème, mais aucune des solutions ci-dessus n'a fonctionné. Ensuite, j'ai remarqué que la colonne du bloc de données que je voulais utiliser pour l'histogramme n'était pas numérique:

df$variable<- as.numeric(as.character(df$variable))

Tiré de ici

0
Ben