7
votes

Barplot empilé dans UpSetR

J'ai cherché un moyen d'avoir un graphique à barres empilées dans un graphique upsetR . J'ai téléchargé l'ensemble de données des films (à partir de ici ) et ajouté une colonne contenant seulement deux les valeurs "M" et "C". Ci-dessous, des informations sur la façon dont j'ai chargé les données et ajouté la colonne "x".

Modifier:

upset(m,
  queries = list(
    list(query = elements, 
         params = list("x", "M"), color = "#e69f00", active = T),
    list(query = elements, 
         params = list("x", "C"), color = "#cc79a7", active = T)))

Voici la structure du bloc de données:

str(m)
'data.frame':   3883 obs. of  22 variables:
 $ Name       : Factor w/ 3883 levels "$1,000,000 Duck (1971)",..: 3577 1858 1483 3718 1175 1559 3010 3548 3363 1420 ...
 $ ReleaseDate: int  1995 1995 1995 1995 1995 1995 1995 1995 1995 1995 ...
 $ Action     : int  0 0 0 0 0 1 0 0 1 1 ...
 $ Adventure  : int  0 1 0 0 0 0 0 1 0 1 ...
 $ Children   : int  1 1 0 0 0 0 0 1 0 0 ...
 $ Comedy     : int  1 0 1 1 1 0 1 0 0 0 ...
 $ Crime      : int  0 0 0 0 0 1 0 0 0 0 ...
 $ Documentary: int  0 0 0 0 0 0 0 0 0 0 ...
 $ Drama      : int  0 0 0 1 0 0 0 0 0 0 ...
 $ Fantasy    : int  0 1 0 0 0 0 0 0 0 0 ...
 $ Noir       : int  0 0 0 0 0 0 0 0 0 0 ...
 $ Horror     : int  0 0 0 0 0 0 0 0 0 0 ...
 $ Musical    : int  0 0 0 0 0 0 0 0 0 0 ...
 $ Mystery    : int  0 0 0 0 0 0 0 0 0 0 ...
 $ Romance    : int  0 0 1 0 0 0 1 0 0 0 ...
 $ SciFi      : int  0 0 0 0 0 0 0 0 0 0 ...
 $ Thriller   : int  0 0 0 0 0 1 0 0 0 1 ...
 $ War        : int  0 0 0 0 0 0 0 0 0 0 ...
 $ Western    : int  0 0 0 0 0 0 0 0 0 0 ...
 $ AvgRating  : num  4.15 3.2 3.02 2.73 3.01 3.88 3.41 3.01 2.66 3.54 ...
 $ Watches    : int  2077 701 478 170 296 940 458 68 102 888 ...
 $ x          : Factor w/ 2 levels "M","C": 1 1 1 1 1 1 1 1 1 1 ...

Maintenant, j'ai essayé d'implémenter le graphique à barres empilées comme suit:

m <- read.csv(system.file("extdata", "movies.csv", package = "UpSetR"), 
                           header = T, sep = ";")
nrow(m)
[1] 3883
x<-c(rep("M", 3000), rep("C", 883))
m<-cbind(m, x)  
unique(m$x)
[1] M C

Le résultat ressemble à ceci :

 entrez la description de l'image ici

Comme vous pouvez le voir, les proportions sont fausses car il ne devrait y avoir dans chaque barre que deux couleurs (facteur) soit" M "ou" C ". Ce problème ne semble pas anodin, comme l'a également souligné ici . Quelqu'un a-t-il une idée sur la façon de l'implémenter dans UpsetR? Merci beaucoup


7 commentaires

Pourriez-vous ajouter le code sur la façon de créer cette variable de facteur x?


@ zx8754 merci pour votre réponse. Je ne sais pas quelle est la fonction implémentée dans le upsetr. Les données d'origine sont une trame de données et la figure est réalisée en implémentant une visualisation de type matrice. Voici le référentiel: github.com/hms-dbmi/UpSetR


Désolé, ce n'était pas clair, comment avez-vous créé cette colonne d'ajout x ?


Fournissez un exemple reproductible.


@ zx8754 l'a compris. J'ai édité la question. Merci


Pouvez-vous modifier votre question pour montrer où vous avez créé un exemple reproductible. Je n'en vois pas. La sortie de str (m) ne peut pas être utilisée pour faire un exemple.


J'ai fourni le lien à partir duquel j'ai téléchargé les données. J'espère que ça aide


3 Réponses :


2
votes

J'ai eu un problème similaire et j'ai trouvé cette solution de contournement:

library("UpSetR")
m <- read.csv(system.file("extdata", "movies.csv", package = "UpSetR"), 
              header = T, sep = ";")
x<-c(rep("M", 2000), rep("Q", 1000), rep("C", 883))
m<-cbind(m, x)  

upset(m,
      queries = list(
        list(query = elements, 
             params = list("x", c("M","Q", "C")), color = "#e69f00", active = T),
        list(query = elements, 
             params = list("x", c("Q","C")), color = "#cc79a7", active = T),
        list(query = elements, 
             params = list("x", "C"), color = grey(0.7), active = T)))

Le problème dans l'exemple d'origine est que chaque requête se superpose séparément à la barre totale et commence à y = 0 . Ainsi, la partie noire restante de la barre a toujours exactement la même hauteur que la partie violette en bas. La solution de contournement consiste à ajouter systématiquement des requêtes de combinaisons des différentes valeurs que la variable peut prendre:

  1. Commencez par une requête et une couleur respective pour la combinaison de toutes les valeurs possibles (ici c ("M", "Q", "C") comme deuxième paramètre de params = liste () ).
  2. Oubliez successivement l'une des valeurs possibles (par exemple c ("Q", "C") dans la première étape ici). La valeur laissée de côté sera représentée par la couleur de la requête, la dernière qui l'a encore incluse ( "M" dans cet exemple).
  3. Continuez à ajouter des requêtes jusqu'à ce qu'il ne vous reste plus qu'une seule valeur pour le deuxième paramètre de params = list () .

Il devrait être possible de le faire par programme pour un plus grand nombre de valeurs possibles et en fournissant une palette de couleurs. Mais cela reste une solution de contournement et une implémentation native de l'empilement des requêtes serait bien d'avoir - donc si vous souhaitez voir cette fonctionnalité, vous pouvez envisager de remplacer le problème respectif sur le dépôt Github .

 Tracé résultant de l'exemple de code ci-dessus


0 commentaires

1
votes

Ci-dessous la belle réponse de @dlaehnemann mais un peu modifiée afin de créer cette liste de liste en utilisant une boucle et en y liant les couleurs voulues.

m <- read.csv(system.file("extdata", "movies.csv", package = "UpSetR"), header = T, sep = ";")
x<-c(rep("M", 2000), rep("Q", 1000), rep("C", 883))
m<-cbind(m, x)

i<-0
mylist<-list()
vectorUniqueValue <- unique(m$x)
colors = colorRampPalette(c("#332288",'#fdff00','#FF0000',"#CC6677","#88CCEE",'#36870c','#b786d2','#7c3c06',"#DDCC77",'#192194','#52cff4','#4f9c8b',"#4477AA",'#808080'))(length(vectorUniqueValue))
while ( length(vectorUniqueValue)>0 ){
  i<-i+1
  mylist[[i]]<-list(query = elements, params = list("x",as.character(vectorUniqueValue)), color = colors[i], active = T)
  vectorUniqueValue<-vectorUniqueValue[-1]
}
upset(m, queries = mylist)

J'espère que cela aidera un peu jusqu'à ce qu'un jour quelqu'un travaille sur le problème sur github!


0 commentaires

3
votes

Voici un moyen de créer un tracé bouleversé avec un barplot empilé, mais en utilisant mon ComplexUpset plutôt que UpSetR:

complexe de barres empilées bouleversé

library(ComplexUpset)
movies = as.data.frame(ggplot2movies::movies)
genres = colnames(movies)[18:24]

# for simplicity of examples, only use the complete data points
movies[movies$mpaa == '', 'mpaa'] = NA
movies = na.omit(movies)


upset(
    movies,
    genres,
    base_annotations=list(
        'Intersection size'=intersection_size(
            counts=FALSE,
            aes=aes(fill=mpaa)
        )
    ),
    width_ratio=0.1
)


0 commentaires