最强大的upset plot包之二

2022-11-15 09:48:45 浏览数 (2)

前面我们已经介绍了迄今为止最强大的upsetplot包的部分内容,今天继续介绍剩下的功能,这个包绝对是目前画upset plot的最强大的R包,没有之一!

迄今为止最强大的upset plot R包,没有之一!

无论是从功能、易用性、美观度等方面,都是最强大的!

  • 调整集合面板
    • 修改标签和刻度
    • 修改geom
    • 添加标签
    • 修改位置和颜色映射
    • 隐藏set size面板
  • 调整交集矩阵面板
    • 交集矩阵条带
    • 添加标题
    • 背景色半透明
    • 交集矩阵的更多调整
  • 主题
    • 对不同的面板使用不同的主题
    • 调整默认主题
  • 高亮交集(查询query)
  • 排序
    • 按交集排序
    • 按集合排序
  • 分组
  • 高级用法
    • 拼图
    • 调整图形高度
    • 画韦恩图

调整集合面板

set_sizes用来调整左侧集合面板。

代码语言:javascript复制
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函数调整交集中的矩阵面板。

代码语言:javascript复制
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参数:

代码语言:javascript复制
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函数:

代码语言:javascript复制
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

代码语言:javascript复制
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()

代码语言:javascript复制
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差不多,查询符合条件的交集,然后高亮显示。但是明显更加强大,可以精确控制在哪些面板显示,非常灵活。

代码语言:javascript复制
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参数:

代码语言:javascript复制
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参数实现升序、降序、自定义排序等。

代码语言:javascript复制
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的拼图操作!

代码语言:javascript复制
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图形拼图的:

代码语言:javascript复制
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调整高度。

代码语言:javascript复制
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语法的支持,完全把其他同类型包甩在身后!

以上就是今天的内容,希望对你有帮助哦!

0 人点赞