8

我一直在寻找一种在uptR图中显示堆积条形图的方法。我下载了电影数据集(从这里)并添加了一个只有两个值“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)))

结果如下所示:

在此处输入图像描述

如您所见,比例是错误的,因为每个条中应该只有两种颜色(因子)“M”或“C”。正如这里也指出的那样,这个问题似乎不是一个小问题。有人知道如何在 UpsetR 中实现这一点吗?非常感谢

4

3 回答 3

7

这是一种使用堆叠条形图创建不安图的方法,但使用我的 ComplexUpset 而不是 UpSetR:

堆积的酒吧复杂的心烦意乱

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,
            mapping=aes(fill=mpaa)
        )
    ),
    width_ratio=0.1
)

请参阅文档中的更多示例。GitHub 上提供了安装说明:krassowski/complex-upset(还有与 UpSetR 和其他软件包的比较)。

于 2020-05-28T14:44:15.177 回答
3

我有一个类似的问题,并找到了这个解决方法:

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 repo 上提出相应的问题

由上述示例代码生成的绘图

于 2019-06-21T13:17:23.637 回答
1

在@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 上解决这个问题!

于 2019-07-17T10:58:11.633 回答