Сложенный барплот в UpSetR - PullRequest
       53

Сложенный барплот в UpSetR

0 голосов
/ 19 февраля 2019

Я искал способ построения гистограммы в виде диаграммы upsetR .Я скачал набор данных фильмов (из здесь ) и добавил столбец, имеющий только два значения «M» и «C».Ниже приведена информация о том, как я загрузил данные и добавил столбец «x».

Редактировать:

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

Это структура фрейма данных:

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 ...

Теперь я попытался реализовать составную диаграмму в виде столбцов следующим образом:

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)))

Результат выглядит следующим образом:

enter image description here

Как видите, пропорции неправильные, так как в каждом столбце должно быть только два цвета (коэффициент): «М» или «С».Эта проблема, кажется, не является тривиальной, как также указывалось здесь .У кого-нибудь есть идеи как это реализовать в UpsetR?Большое спасибо

Ответы [ 2 ]

0 голосов
/ 17 июля 2019

Ниже хороший ответ @dlaehnemann, но немного измененный для того, чтобы создать этот список списка, используя цикл, а также связывая с ним нужные цвета.

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)

Надеюсь, это немного поможет, пока, возможно, однажды кто-то не займется этим вопросом на github!

0 голосов
/ 21 июня 2019

У меня была похожая проблема, и я нашел этот обходной путь:

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)))

Проблема в исходном примере заключается в том, что каждый запрос накладывается на общий бар отдельно и начинается с y=0.Таким образом, оставшаяся черная часть панели всегда имеет ту же высоту, что и фиолетовая часть внизу.Обходной путь - систематически добавлять запросы комбинаций различных значений, которые может принимать переменная:

  1. Начать с запроса и соответствующего цвета для комбинации всех возможных значений (здесь c("M","Q","C") в качестве второгопараметр в params = list()).
  2. Последовательно пропустить одно из возможных значений (например, c("Q","C") в первом шаге здесь).Оставленное значение будет представлено цветом запроса, последним, который все еще включил его ("M" в этом примере).
  3. Продолжайте добавлять запросы, пока у вас не останется только одно значение для второго параметраparams = list().

Это должно быть возможно программно для большего числа возможных значений и обеспечения некоторой цветовой палитры.Но это остается обходным путем, и было бы неплохо иметь нативную реализацию стекирования запросов - поэтому, если вы хотите увидеть эту функциональность, вы можете рассмотреть вопрос об увеличении соответствующей проблемы в репозитории Github .

Plot resulting from above example code

...