我一直在寻找一种在upsetR图中堆积条形图的方法。 我下载了电影数据集(来自here),并添加了仅包含两个值“ 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”。 正如here指出的那样,这个问题似乎也不是一件小事。 有谁知道如何在UpsetR中实现这一点? 非常感谢
答案 0 :(得分:3)
这是一种使用堆积条形图创建create变图的方法,但是使用我的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,
aes=aes(fill=mpaa)
)
),
width_ratio=0.1
)
请在documentation中查看更多示例。 可以在GitHub上找到安装说明:krassowski/complex-upset(还有UpSetR和其他软件包的比较)。
答案 1 :(得分:0)
我遇到了类似的问题,并找到了解决方法:
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
开始。因此,条的其余黑色部分始终与底部的紫色部分具有完全相同的高度。解决方法是系统地添加对变量可以采用的不同值的组合的查询:
c("M","Q","C")
作为params = list()
的第二个参数)。c("Q","C")
)。遗漏的值将由查询的颜色表示,该查询的颜色仍是最后一个(在此示例中为"M"
)。params = list()
的第二个参数只剩下一个值。应该有可能通过编程方式获取更多可能的值并提供一些调色板。但这仍然是一种解决方法,并且可以很好地使用本机来堆叠查询-因此,如果您希望看到此功能,则可以考虑提高respective issue over at the Github repo。
答案 2 :(得分:0)
在@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上解决这个问题!