前面我们已经介绍了迄今为止最强大的upsetplot包的部分内容,今天继续介绍剩下的功能,这个包绝对是目前画upset plot的最强大的R包,没有之一!
迄今为止最强大的upset plot R包,没有之一!
无论是从功能、易用性、美观度等方面,都是最强大的!
- 调整集合面板
- 修改标签和刻度
- 修改geom
- 添加标签
- 修改位置和颜色映射
- 隐藏set size面板
- 调整交集矩阵面板
- 交集矩阵条带
- 添加标题
- 背景色半透明
- 交集矩阵的更多调整
- 主题
- 对不同的面板使用不同的主题
- 调整默认主题
- 高亮交集(查询query)
- 排序
- 按交集排序
- 按集合排序
- 分组
- 高级用法
- 拼图
- 调整图形高度
- 画韦恩图
调整集合面板
set_sizes
用来调整左侧集合面板。
upset(
movies, genres,
min_size=200,
set_sizes=upset_set_size()
)
plot of chunk unnamed-chunk-26
修改标签和刻度
支持ggplot语法
代码语言:javascript复制upset(movies, genres, width_ratio = 0.1, min_size = 10,
set_sizes = (upset_set_size()
theme(axis.ticks.x=element_line(), # 加刻度
axis.text.x=element_text(angle=90) # 改角度
)
)
)
plot of chunk unnamed-chunk-27
修改geom
代码语言:javascript复制 upset(
movies, genres, width_ratio=0.5, max_size=100, min_size=15, wrap=TRUE,
set_sizes=upset_set_size(
geom=geom_point(
stat='count',
color='blue',
size=5,
shape=5
)
)
)
plot of chunk unnamed-chunk-28
添加标签
也是ggplot操作。
代码语言:javascript复制upset(
movies, genres,
min_size=10,
width_ratio=0.3,
encode_sets=FALSE, # for annotate() to select the set by name disable encoding
set_sizes=(
upset_set_size()
geom_text(aes(label=..count..), hjust=1.1, stat='count') # 添加数字
# 添加其他标记:
annotate(geom='text', label='@', x='Drama', y=850, color='white', size=3)
expand_limits(y=1100)
theme(axis.text.x=element_text(angle=90))
)
)
plot of chunk unnamed-chunk-29
修改位置和颜色映射
代码语言:javascript复制upset(
movies, genres,
min_size=10,
width_ratio=0.3,
set_sizes=(
upset_set_size(
geom=geom_bar(
aes(fill=mpaa, x=group),
width=0.8
),
position='right'
)
),
# 图例移到上面
guides='over'
)
plot of chunk unnamed-chunk-30
隐藏set size面板
代码语言:javascript复制upset(
movies, genres,
min_size=10,
set_sizes=FALSE # 隐藏面板
)
plot of chunk unnamed-chunk-31
调整交集矩阵面板
交集矩阵条带
使用upset_stripes
函数调整交集中的矩阵面板。
upset(
movies,
genres,
min_size=10,
width_ratio=0.2,
stripes=upset_stripes(
geom=geom_segment(size=5), # 颜色条的宽度
colors=c('cornsilk1', 'deepskyblue1', 'grey90') # 颜色条颜色
)
)
plot of chunk unnamed-chunk-32
还可以通过相关信息进行更多设置:
假如我们有一个关于不同类型电影是否上映的信息:
代码语言:javascript复制genre_metadata = data.frame(
set=c('Action', 'Animation', 'Comedy', 'Drama', 'Documentary', 'Romance', 'Short'),
shown_in_our_cinema=c('no', 'no', 'on weekends', 'yes', 'yes', 'on weekends', 'no')
)
upset(
movies,
genres,
min_size=10,
width_ratio=0.2,
stripes=upset_stripes(
mapping=aes(color=shown_in_our_cinema), # 颜色映射
colors=c(
'yes'='green',
'no'='red',
'on weekends'='orange'
),
data=genre_metadata
)
)
plot of chunk unnamed-chunk-33
添加标题
给交集矩阵添加标题:
代码语言:javascript复制upset(movies, genres, min_size=10) ggtitle('Intersection matrix title')
plot of chunk unnamed-chunk-34
给整幅图添加标题,需要用到wrap
参数:
upset(movies, genres, min_size=10, wrap=TRUE)
ggtitle('The overlap between genres')
plot of chunk unnamed-chunk-35
背景色半透明
代码语言:javascript复制upset(movies, genres, name='genre', width_ratio=0.1, min_size=10,
stripes=c(alpha('grey90', 0.45), alpha('white', 0.3))
)
plot of chunk unnamed-chunk-36
交集矩阵的更多调整
上面主要是交集矩阵背景条带的调整,下面是交集矩阵其他元素的调整,主要是使用intersection_matrix
函数:
upset(
movies, genres, name='genre', min_size=10,
encode_sets=FALSE, # for annotate() to select the set by name disable encoding
matrix=(
intersection_matrix(
# 点的调整
geom=geom_point(
shape='square',
size=3.5
),
# 线的调整
segment=geom_segment(
linetype='dotted'
),
# 边框颜色
outline_color=list(
active='darkorange3',
inactive='skyblue'
)
)
# 颜色映射,和上面那句代码一起看
scale_color_manual(
values=c('TRUE'='orange', 'FALSE'='grey'),
labels=c('TRUE'='yes', 'FALSE'='no'),
breaks=c('TRUE', 'FALSE'),
name='Is intersection member?'
)
# 坐标轴标签放在右边
scale_y_discrete(
position='right'
)
# 添加文字注释
annotate(
geom='text',
label='Look here →',
x='Comedy-Drama',
y='Drama',
size=5,
hjust=1
)
),
# 查询交集
queries=list(
upset_query(
intersect=c('Drama', 'Comedy'),
color='red',
fill='red',
only_components=c('intersections_matrix', 'Intersection size')
)
)
)
image-20220516204920781
主题
对不同的面板使用不同的主题
代码语言:javascript复制upset(
movies,
genres,
annotations = list(
'Length'=list(
aes=aes(x=intersection, y=length),
geom=geom_boxplot(na.rm=TRUE)
),
'Rating'=list(
aes=aes(x=intersection, y=rating),
geom=list(
geom_jitter(aes(color=log10(votes)), na.rm=TRUE),
geom_violin(alpha=0.5, na.rm=TRUE)
)
)
),
min_size=10,
width_ratio=0.1,
themes=modifyList(
upset_themes,
list(Rating=theme_void(), Length=theme()) # 使用不同的主题
)
)
plot of chunk unnamed-chunk-38
调整默认主题
修改全局主题,使用upset_default_themes
。
upset(
movies, genres, min_size=10, width_ratio=0.1,
themes=upset_default_themes(
text=element_text(color='red')
))
plot of chunk unnamed-chunk-39
修改部分默认主题使用upset_modify_themes()
:
upset(
movies, genres,
base_annotations=list('Intersection size'=intersection_size(counts=FALSE)),
min_size=100,
width_ratio=0.1,
themes=upset_modify_themes(
list(
'intersections_matrix'=theme(text=element_text(size=20)),
'overall_sizes'=theme(axis.text.x=element_text(angle=90))
)
)
)
plot of chunk unnamed-chunk-40
高亮交集(查询query)
和UpsetR
中的query差不多,查询符合条件的交集,然后高亮显示。但是明显更加强大,可以精确控制在哪些面板显示,非常灵活。
upset(
movies, genres, name='genre', width_ratio=0.1, min_size=10,
annotations = list(
'Length'=list(
aes=aes(x=intersection, y=length),
geom=geom_boxplot(na.rm=TRUE)
)
),
# 查询
queries=list(
upset_query(
intersect=c('Drama', 'Comedy'), # 查询这两个的交集
color='red',
fill='red',
# 在哪些面板高亮显示
only_components=c('intersections_matrix', 'Intersection size')
),
upset_query(
set='Drama',
fill='blue'
),
upset_query(
intersect=c('Romance', 'Comedy'),
fill='yellow',
only_components=c('Length')
)
)
)
plot of chunk unnamed-chunk-41
排序
按交集排序
可以通过ratio
或者degree
等进行排序,使用sort_intersections_by
参数:
upset(
movies, genres, name='genre', width_ratio=0.1, min_size=10,
sort_intersections_by='ratio', # 排序
base_annotations=list(
'Intersection size'=intersection_size(text_mapping=aes(label=!!upset_text_percentage())),
'Intersection ratio'=intersection_ratio(text_mapping=aes(label=!!upset_text_percentage()))
)
)
plot of chunk unnamed-chunk-42
可以多个条件一起使用:
代码语言:javascript复制upset(movies, genres, width_ratio=0.1,
sort_intersections_by=c('degree', 'cardinality')) # 先degree再cardinality
plot of chunk unnamed-chunk-43
还可以通过sort_intersections
参数实现升序、降序、自定义排序等。
upset(movies, genres, width_ratio=0.1, sort_intersections=FALSE)
plot of chunk unnamed-chunk-44
自定义排序:
代码语言:javascript复制upset(
movies,
genres,
width_ratio=0.1,
sort_intersections=FALSE,
intersections=list(
'Comedy',
'Drama',
c('Comedy', 'Romance'),
c('Romance', 'Drama'),
'Outside of known sets',
'Action'
)
)
plot of chunk unnamed-chunk-45
按集合排序
代码语言:javascript复制# 升序
upset(movies, genres, width_ratio=0.1, sort_sets='ascending') # 也可用FALSE
plot of chunk unnamed-chunk-46
分组
按照集合给交集分组,显示不同的颜色,
代码语言:javascript复制upset(
movies, c("Action", "Comedy", "Drama"),
width_ratio=0.2,
group_by='sets', # 按照集合分组
queries=list(
upset_query(
intersect=c('Drama', 'Comedy'),
color='red',
fill='red',
only_components=c('intersections_matrix', 'Intersection size')
),
upset_query(group='Drama', color='blue'), # 这句代码和下面2句控制matrix的颜色
upset_query(group='Comedy', color='orange'),
upset_query(group='Action', color='purple'),
upset_query(set='Drama', fill='blue'), # 这句代码和下面2句控制左侧面板的颜色
upset_query(set='Comedy', fill='orange'),
upset_query(set='Action', fill='purple')
)
)
plot of chunk unnamed-chunk-47
高级用法
拼图
非常神奇,由于是支持ggplot
的,所以完全支持patchwork
的拼图操作!
library(patchwork)
# 百分比堆积条形图
annotations = list(
'MPAA Rating'=list(
aes=aes(x=intersection, fill=mpaa),
geom=list(
geom_bar(stat='count', position='fill')
)
)
)
# 构建2个数据
set.seed(0)
data_1 = movies[sample(nrow(movies), 100), ]
data_2 = movies[sample(nrow(movies), 100), ]
u1 = upset(data_1, genres, min_size=5, base_annotations=annotations)
u2 = upset(data_2, genres, min_size=5, base_annotations=annotations)
# 拼图
(u1 | u2) plot_layout(guides='collect')
image-20220516205014238
当然是可以和其他ggplot2
图形拼图的:
p1 <- ggplot(mtcars,aes(factor(cyl),mpg)) geom_boxplot(aes(fill=factor(cyl)))
theme_bw()
(u1 | p1) plot_layout(ncol = 2)
image-20220516205026870
调整图形高度
对于一个带有各种组合图形的upset plot来说,它本身也是通过patchwork
来拼图的,所以也可以使用patchwork
调整高度。
upset(
movies, genres, name='genre', width_ratio=0.1, min_size=100,
annotations =list(
'MPAA Rating'=list(
aes=aes(x=intersection, fill=mpaa),
geom=list(
geom_bar(stat='count', position='fill'),
scale_y_continuous(labels=scales::percent_format())
)
)
)
) patchwork::plot_layout(heights=c(0.5, 1, 0.5)) # 调整工作
plot of chunk unnamed-chunk-50
画韦恩图
这个功能在上面演示过了,这里就不多说了,需要注意的是,画韦恩图只支持2个或者3个集合。
OK,这就是complexUpset
全部的功能,看完之后,果然如最开始所说:具有UpsetR
的所有优点,且完全支持ggplot2
语法!不出意外,这个包以后应该是我以后画upset plot的首选包了,功能甚至比UpsetR
包还要强大,对ggplot2
语法的支持,完全把其他同类型包甩在身后!
以上就是今天的内容,希望对你有帮助哦!