barplot empilé

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Patricia OBEID
Messages : 68
Enregistré le : 10 Avr 2017, 19:03

barplot empilé

Messagepar Patricia OBEID » 14 Mai 2017, 15:40

Bonjour,
je souhaite faire un barplot empilé mais je ne m'en sors pas.
J'ai le dataframe suivant avec 6 conditions (cond), pour chaque condition, j'ai un nombre de cellules attribué à une couleur (4 couleurs : Neg, Or, G et Gor) (par exemple pour "cells" j'ai 1 cellule "Gor" + 5899 cellules "Neg" + 9 cellules "Or" + 0 cellule "G") :

structure(list(cond = structure(c(2L, 4L, 5L, 1L, 2L, 3L, 4L,
5L, 6L, 1L, 2L, 3L, 4L, 5L, 6L, 1L, 2L, 3L, 5L, 6L), .Label = c("cells",
"cells+CTG", "cells+CTOr", "CTG", "CTG+CTOr", "CTOr"), class = "factor"),
couleur = c("G", "G", "G", "GOr", "GOr", "GOr", "GOr", "GOr",
"GOr", "Neg", "Neg", "Neg", "Neg", "Neg", "Neg", "Or", "Or",
"Or", "Or", "Or"), nCells = c(2415, 2795, 1397, 1, 130, 3,
210, 846, 3, 5899, 2378, 2359, 4, 99, 69, 9, 3, 2531, 1644,
4075)), .Names = c("cond", "couleur", "nCells"), row.names = c(NA,
-20L), class = "data.frame")

Je souhaiterais avoir en x les conditions cond et l'empilement des 4 couleurs en fonction de leur nombre.
Je ne sais pas comment présenter ça et l'écrire pour obtenir ce que je souhaite ...
Je vous remercie par avance de votre aide
Bonne soirée,
Patricia

Jean-Pierre Jacus
Messages : 22
Enregistré le : 13 Mai 2017, 20:39

Re: barplot empilé

Messagepar Jean-Pierre Jacus » 14 Mai 2017, 16:04

Bonjour,
la commande sur R est normalement la suivante. Il faut passer par la fonction table

Code : Tout sélectionner

A = table(data$variable)
# data = le nom de votre base de données, variable = le nom de votre variable quantitative

Code : Tout sélectionner

barplot(A)
# qui normalement vous donnera un barplot empilé
j'espère avoir pu vous aider
J. Pierre

Patricia OBEID
Messages : 68
Enregistré le : 10 Avr 2017, 19:03

Re: barplot empilé

Messagepar Patricia OBEID » 14 Mai 2017, 17:59

Bonsoir Jean-Pierre,
non, c'est un peu plus compliqué ...
Voici en image le tableau 1 type que j'ai à l'origine (mais réduit)
pour visualiser ce que je souhaite, je suis passée dans excel pour un petit jeu de données. J'ai transformé mon tableau 1 pour obtenir le tableau 2 qui m'a servi de base pour le graphique que je souhaite.
Sur peu de données, c'est simple dans excel mais quand on a plusieurs centaines de lignes, ça devient fastidieux et source d'erreur.
Image
Image
Image

J'espère qu'avec les images ma question est plus claire ...
Merci en tous cas.
Bonne soirée
Patricia

Jean-Pierre Jacus
Messages : 22
Enregistré le : 13 Mai 2017, 20:39

Re: barplot empilé

Messagepar Jean-Pierre Jacus » 14 Mai 2017, 19:47

Je ne suis surement pas compétent. A tout hasard, avec beside = T?

Code : Tout sélectionner

barplot(A, beside = T)

sinon, je ne sais pas...
Bien à vous
JP

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: barplot empilé

Messagepar Pierre-Yves Berrard » 15 Mai 2017, 08:35

Le plus simple pour moi est d'utiliser le package ggplot2 :

Code : Tout sélectionner

library(ggplot2)
ggplot(
  data,
  aes(x = cond, weight = nCells, fill = couleur)
) +
geom_bar(position = "fill")
PY

Gabriel Terraz
Messages : 591
Enregistré le : 26 Sep 2011, 15:11

Re: barplot empilé

Messagepar Gabriel Terraz » 15 Mai 2017, 08:57

Salut,

Et sans package, quelque chose dans le genre ?

Code : Tout sélectionner

tap <- tapply(df$nCells, df[,c(2,1)], sum)
barplot(tap, legend.text = T, col = rainbow(4))

Patricia OBEID
Messages : 68
Enregistré le : 10 Avr 2017, 19:03

Re: barplot empilé

Messagepar Patricia OBEID » 15 Mai 2017, 09:00

Bonjour Pierre-Yves
C'est exactement ce que je voulais faire !
Merci beaucoup.
Bonne journée,
Patricia

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: barplot empilé

Messagepar Pierre-Yves Berrard » 15 Mai 2017, 09:03

Gabriel Terraz a écrit :Et sans package, quelque chose dans le genre ?

Code : Tout sélectionner

tap <- tapply(df$nCells, df[,c(2,1)], sum)
barplot(tap, legend.text = T, col = rainbow(4))


J'ai essayé ça dans un premier temps, mais il faut gérer les NA et calculer les proportions. C'est pourquoi je suis revenu à ggplot.
PY

Patricia OBEID
Messages : 68
Enregistré le : 10 Avr 2017, 19:03

Re: barplot empilé

Messagepar Patricia OBEID » 15 Mai 2017, 09:08

Merci Gabriel,
ça fonctionne aussi mais avec une étape de transformation des NA par la valeur zéro.
Bonne journée,
Patricia

Gabriel Terraz
Messages : 591
Enregistré le : 26 Sep 2011, 15:11

Re: barplot empilé

Messagepar Gabriel Terraz » 15 Mai 2017, 09:14

Effectivement, il y a un problème avec les NA, je n'y avais pas pensé. On peut les mettre à zéro avec une petite commande. Ce qui donne finalement :
(j'ai légèrement raccourci les noms pour la lisibilité)

Code : Tout sélectionner

tap <- tapply(df$nCells, df[,c(2,1)], sum, na.rm = T)
tap[is.na(tap)]  <- 0
noms <- c("c", "c+CTG", "c+CTOr", "CTG", "CTG+CTOt", "CTOr")
barplot(tap, legend.text = T, col = rainbow(4), names.arg = noms)


Si on veut des proportions :

Code : Tout sélectionner

tapP <- prop.table(tap,2)
barplot(tapP, legend.text = T, col = rainbow(4), names.arg = noms)

Patricia OBEID
Messages : 68
Enregistré le : 10 Avr 2017, 19:03

Re: barplot empilé

Messagepar Patricia OBEID » 16 Mai 2017, 10:23

Gabriel,
une petite question pour toi : comment déplacer la légende dans le plot, voire même comment la positionner à côté du plot ?
Merci de ton retour et bonne journée,
Patricia

Gabriel Terraz
Messages : 591
Enregistré le : 26 Sep 2011, 15:11

Re: barplot empilé

Messagepar Gabriel Terraz » 16 Mai 2017, 15:16

Salut,
Il y a plusieurs solution pour faire cela, tu peux déjà utiliser l'argument args.legend de la fonction barplot pour passer ces arguments à la fonction legend(). Tu peux aussi dessiner ta légende en dehors de la zone de plot.
Par exemple (pas testé donc sûrement à ajuster) :

L'argument xpd pour autoriser la légende en dehors de la zone de plot et mar pour rajouter de la marge à droite ( 5.1, 4.1, 4.1, 2.1) par défaut, en partant du bas puis en tournant dans le sens horaire.

Code : Tout sélectionner

par(xpd = T, mar = c(5,4,4,6))


Code : Tout sélectionner

barplot(tap, legend.text = T, col = rainbow(4), names.arg = noms,args.legend=list(x="right",xpd = T,inset = c(-0.2,0)))


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité