前言
大海哥已经给大家分享了十几期的R包教程了,今天给大家换换口味。散点可谓是生信分析中可视化的常客,很多数据的可视化会用到散点图,你的散点图是大众脸吗?是不是编辑已经看吐了?千篇一律,没有特点,很容易就被拒稿啦!今天跟着大海哥的步伐重新来学习Circlize包,让你的文章提升一个逼格!circlize 包旨在在 R 中实现 Circos。它可以很容易地通过低级图形的不同组合来生成更复杂的、信息更丰富的图形。
设计原理
circlize 圆形布局由 sectors(扇形)和 tracks(轨迹)组成。对于数据中的不同分类,会作为不同的 sectors,在圆形布局上看起来就是将圆切割为一个个扇形;而同一个类别的不同维度的观测值,会作为从圆外向圆内不断堆叠的图形轨迹 tracks,即展示的各种数据图形。
目前,有以下图形函数可用于添加图形。其用法与基本图形引擎中没有前缀的函数circos非常相似,只是有一些增强功能专为可视化而设计。
circos.points():在单元格中添加点。
circos.lines():在单元格中添加行。
circos.segments():在单元格中添加段。
circos.rect():在单元格中添加矩形。
circos.polygon():在单元格中添加多边形。
circos.text():在单元格中添加文本。
circos.axis() circos.yaxis():在单元格中添加轴。
以下函数在圆中的两个位置之间绘制链接:
circos.link()
以下函数绘制高级图形:
circos.barplot():绘制条形图。
circos.boxplot():绘制箱线图。
circos.violin():绘制小提琴图。
circos.heatmap():绘制圆形热图。
circos.raster():绘制光栅图像。
circos.arrow():绘制圆形箭头。
以下功能安排圆形布局。
circos.initialize():在圆圈上分配扇区。
circos.track():为单个轨道中的单元格创建绘图区域。
circos.update():更新已存在的单元格。
circos.par():图形参数。
circos.info():打印当前圆形图的一般参数。
circos.clear():重置图形参数和内部变量。
因此,可以通过以下方式绘制大多数类型的图。
可视化不熟悉的小伙伴们欢迎来滴滴大海哥,大海哥就是这么的宠粉,有什么可视化上的问题大家尽管咨询大海哥!没有时间学习的小伙伴们也不要着急哦!有需要可视化的小伙伴们也可以找大海哥哦!练了十年生信分析的大海哥对于可视化知识已经如鱼得水从分析到可视化直到你满意为止!
生信数据处理起来占用内存实在太大了,放过自己的电脑吧!大海哥在这里给大家送上福利了,有需要服务器的小伙伴们,欢迎大家联系大海哥,保证服务器的性价比最高哦!
代码教程
我首先演示一个简单的例子 使用 Circlize 包中的基本功能来了解circlize 包工作原理的基本概念。首先,让我们生成一些随机数据。需要一个字符向量来表示类别、X 值的数值向量和 Y 值的 Vectoe。
set.seed(999)
n = 1000
df = data.frame(sectors = sample(letters[1:8], n, replace = TRUE),
x = rnorm(n), y = runif(n))
首先,我们初始化圆形布局。该圆圈被划分为多个扇区 基于每个类别中 X 轴上的数据范围。在下面的代码中,被除以并自动计算扇区的宽度 基于每个类别中的数据范围。默认,扇区定位 起价为df$x df$sectors θ=0(在极坐标系中)并沿圆周前进 顺时针。运行以下代码后,您可能看不到任何内容,因为没有轨道尚未添加。
library(circlize)
circos.par(“track.height” = 0.1)
circos.initialize(df$sectors, x = df$x)
我们通过选项函数将全局参数设置为 0.1,以便所有将要添加的轨道的默认高度为 0.1. circlize 使用的圆的半径始终为 1,因此高度为 0.1 表示圆半径的 10%。在后面的章节中,您可以找到如何设置 具有物理单位的高度,例如厘米。
circos.track(df$sectors, y = df$y,
panel.fun = function(x, y) {
circos.text(CELL_META$xcenter,
CELL_META$cell.ylim[2] + mm_y(5),
CELL_META$sector.index)
circos.axis(labels.cex = 0.6)
})
col = rep(c(“#FF0000”, “#00FF00”), 4)
circos.trackPoints(df$sectors, df$x, df$y, col = col, pch = 16, cex = 0.5)
circos.text(-1, 0.5, “text”, sector.index = “a”, track.index = 1)
好了,现在我们将直方图添加到第二个轨道。这是一个 高级函数,这意味着它创建一个新轨道。
bgcol = rep(c(“#EFEFEF”, “#CCCCCC”), 4)
circos.trackHist(df$sectors, df$x, bin.size = 0.2, bg.col = bgcol, col = NA)
在第三条轨道中,我们在每个单元格中随机选择10个数据点,按x值对它们进行排序,并将它们与线连接起来。在下面的代码中,当(第一个未命名的参数)和参数被设置时,x值和y值被分割,x和y值的相应子集通过s和参数被发送。因此,一个in恰好是“当前”单元格中的值。
circos.track(df$sectors, x = df$x, y = df$y,
panel.fun = function(x, y) {
ind = sample(length(x), 10)
x2 = x[ind]
y2 = y[ind]
od = order(x2)
circos.lines(x2[od], y2[od])
})
现在我们回到第二条轨道,更新扇区d中的单元格这是由or的简短版本完成的。该功能可以擦除已添加的图形。不能修改单元格的位置以及与单元格位置相关的其他设置。需要显式指定扇区索引和跟踪索引,除非“当前”单元格是您想要更新的。调用后,“当前”单元被重定向到您刚刚指定的单元,您可以使用低级图形函数直接向其中添加图形。
circos.update(sector.index = “d”, track.index = 2,
bg.col = “#FF8080”, bg.border = “black”)
circos.points(x = -2:2, y = rep(0.5, 5), col = “white”)
circos.text(CELL_META$xcenter, CELL_META$ycenter, “updated”, col = “white”)
接下来我们继续创建新的轨道。虽然我们已经回到了第二个轨道,当创建一个新轨道时,新轨道仍然是在最里面的轨道之后创建的。在这个新轨道中,我们添加了热图。注意,这里我们没有设置输入数据,而只是设置参数,因为热图只是从最左到右,从下到上填充整个单元格。此外,的确切值也不重要,并且不使用(实际上它们都是)。
circos.track(ylim = c(0, 1), panel.fun = function(x, y) {
xlim = CELL_META$xlim
ylim = CELL_META$ylim
breaks = seq(xlim[1], xlim[2], by = 0.1)
n_breaks = length(breaks)
circos.rect(breaks[-n_breaks], rep(ylim[1], n_breaks – 1),
breaks[-1], rep(ylim[2], n_breaks – 1),
col = rand_color(n_breaks), border = NA)
})
在圆圈的最里面,添加了链接或丝带。可以有从单点到点、点到区间或区间到区间的链接。
circos.link(“a”, 0, “b”, 0, h = 0.4)
circos.link(“c”, c(-0.5, 0.5), “d”, c(-0.5,0.5), col = “red”,
border = “blue”, h = 0.2)
circos.link(“e”, 0, “g”, c(-1,1), col = “green”, border = “black”, lwd = 2, lty = 2)
小结
在这里,circlize 包提供了在 R 中生成循环布局的实现以及可用软件的增强。该软件包的灵活性基于低级图形函数的使用,因此用户可以轻松地实现自定义的高级图形以用于特定目的。结合 R 中强大的计算和视觉环境之间的无缝连接,circize 为用户提供了更多的便利和自由来设计图形,以更好地理解多维数据背后的复杂模式。最后大海哥给大家介绍一个云工具!同学们如果觉得自己的代码水平一般,对于很多的参数不知道怎么改,可以体验一下我们的云生信小工具,只需输入数据,即可轻松生成所需图表,字体大小、标题等也可一键更改。感兴趣的小伙伴去云生信(http://www.biocloudservice.com/home.html)体验一下吧!