ggplot2画图——将筛选到的突变位点(基因)画到染色体上

今天需要画一个图,把筛选到的SNP画到染色体上,可惜在网上逛了一圈一直找不到心仪的r包,只好自己动手了。成图如下所示:watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6I-g6JCd56yL,size_20,color_FFFFFF,t_70,g_se,x_16

首先需要一个关于染色体总长的文件,类似下图,具体怎么获得大家可以各显神通,这边推荐用tbtools。

 

另外需要存有SNP位点信息的文件,至少需要包含位于哪条染色体,位于染色体上的哪个位置两个信息,类似下图:

 处理一下染色体长度文件:

chr <- read.table("chrlength.txt") #读取文件
colnames(chr) <- c("Chr","End") #命名列名
chr <- chr[order(chr$Chr),] #根据染色体名对数据进行排序
chr$x <- seq(1,56) + rep(seq(0,26,2),each=4) #计算染色体在图上的横坐标。这里我有14*4条的四倍型染色体,每条染色体宽为1,共56条染色体所以用seq(1,56)生成每条染色体的横坐标。且我希望同源染色体紧挨着,非同源染色体之间相隔两倍的染色体宽度,所以只要生成一个类似于:0000111122223333的数组然后和seq(1,56)相加就可以实现,这里用的方法是:rep(seq(0,26,2),each=4)

head(chr)
      Chr      End x
41 Chr01A 47186193 1
42 Chr01B 45237200 2
43 Chr01C 45157756 3
44 Chr01D 39476532 4
17 Chr02A 37619394 7
18 Chr02B 35749136 8

这样就可以用ggplot2画染色体了,试试看:

 ggplot()+
     geom_rect(chr,mapping=aes(ymin=0,ymax=End,xmin=x-0.5,xmax=x+0.5),
color="black",fill="white")
#用了geom_rect画矩形,柱状图没准也可以,有兴趣的可以去试试。
#geom_rect四个参数控制矩形的四条边ymin,ymax,xmin,xmax

 效果还可以,再处理一下SNP的文件:

#我有4组突变文件所以要读取四次,分别是与温度\降水相关的snp\indel
snptem <- read.table("tem_snp_uniq.txt")
snpwet <- read.table("wet_snp_uniq.txt")
indeltem <- read.table("tem_indel_uniq.txt")
indelwet <- read.table("wet_indel_uniq.txt")

#给SNP上个标记叫SNP,indel叫Indel,再给温度相关的标记为tem,降水相关叫wet,最后用rbind()合并为一个数据框
snptem$type <- snpwet$type <- "SNP" ;indeltem$type <- indelwet$type <- "Indel"
snptem$type2 <- indeltem$type2 <- "tem" ;indelwet$type2 <- snpwet$type2 <- "wet"
variation <- rbind(snptem,snpwet,indeltem,indelwet)
#由于我的SNP位置信息是Chr01A:100这种形式的,由:分割,前者是染色体,后者是在染色体上的位置
#用tidyr包的separate函数分割一下
library(tidyr)
variation <- separate(variation,col = V1,into = c("chr","pos"),sep = ":")
variation$pos <- as.numeric(variation$pos) #转化为数字格式

head(variation)
     chr      pos type type2
1 Chr01A  8203552  SNP   tem
2 Chr01B 30258368  SNP   tem
3 Chr01B 30258404  SNP   tem
4 Chr01B 30258416  SNP   tem
5 Chr01B 30258460  SNP   tem
6 Chr01B 30258484  SNP   tem

#由于有些SNP所在位置不在核染色体上,所以要去除,这里用%in%判断
variation <- variation[variation$chr %in% chr$Chr,]
#再根据上一个数据框chr里算好的染色体位置得到SNP的横坐标
variation$x <- chr$x[match(variation$chr , chr$Chr)] 

head(variation)
     chr      pos type type2 x
1 Chr01A  8203552  SNP   tem 1
2 Chr01B 30258368  SNP   tem 2
3 Chr01B 30258404  SNP   tem 2
4 Chr01B 30258416  SNP   tem 2
5 Chr01B 30258460  SNP   tem 2
6 Chr01B 30258484  SNP   tem 2

数字已经处理完成了,开始画图:

ggplot()+
   geom_rect(chr,mapping=aes(ymin=0,ymax=End,xmin=x-0.5,xmax=x+0.5),
color="black",fill="white")+
   geom_segment(data = variation, mapping=aes(x = x-0.5, y = pos, xend = x+0.5, yend = pos, colour = type2),
size=1.2,alpha=0.7)
#在原先geom_rect的基础上加了geom_segment用来绘制线段。
#geom_segment也是四个参数控制线段起点和终点,x,y,xend,yend。x和xend保持和geom_rect一致,y用pos行控制

 效果不错,美化一下:

install.packages("ggchicklet", repos = "https://cinc.rud.is")
library(ggchicklet)
ggplot()+
   ggchicklet:::geom_rrect(chr,mapping=aes(ymin=0,ymax=End,xmin=x-0.5,xmax=x+0.5),color="black",fill="white",r = unit(0.5, 'npc'))+
   geom_segment(data = variation, mapping=aes(x = x-0.5, y = pos, xend = x+0.5, yend = pos, colour = type2),size=1.2,alpha=0.7)+
   geom_point(data = variation[variation$type=="Indel",], mapping=aes(x = x, y = pos, fill = type2 ),colour=rgb(0,0,0,0),shape=24,size=2)+
   scale_color_manual(values = c("#A52A2A", "#0073C2"))+
   scale_fill_manual(values = c("#FF0000", "#1E90FF"))+
   theme(legend.position = 'none',
         panel.grid = element_blank(),panel.background = element_blank(),
         axis.ticks = element_blank(),axis.text = element_blank(),axis.title = element_blank())

这里用到了ggchicklet这个包,主要是想要让染色体边缘变成圆角的,具体看参考。

成图如下所示:

 我非常满意,大功告成!

参考:

1、ggplot2画图——点图想要描边但是又需要去除边框

2、ggplot2绘制精美圆角矩形图加点图

  • 11
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 您好!要使用 C 语言编写一个程序将图像绘制到画布上,您可以使用一些图形库,例如 OpenGL、SDL、GTK+ 等等。这些库提供了一些函数和工具来创建图像窗口、绘制线条、矩形、圆形、文本等等。 例如,使用 OpenGL 库,您可以按照以下步骤来绘制一个简单的图像: 1. 初始化 OpenGL 窗口。 2. 在窗口中创建一个 OpenGL 上下文。 3. 清空屏幕并设置绘制颜色。 4. 使用 OpenGL 函数绘制您想要的图形。 5. 交换缓冲区以显示图形。 以下是一个使用 OpenGL 库的简单示例程序: ```c #include <GL/glut.h> void display() { // 清空屏幕并设置绘制颜色为白色 glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0, 1.0, 1.0); // 绘制一个三角形 glBegin(GL_TRIANGLES); glVertex3f(-0.5, -0.5, 0.0); glVertex3f(0.5, -0.5, 0.0); glVertex3f(0.0, 0.5, 0.0); glEnd(); // 交换缓冲区 glutSwapBuffers(); } int main(int argc, char** argv) { // 初始化 GLUT 库 glutInit(&argc, argv); // 创建窗口 glutCreateWindow("My First OpenGL Program"); // 设置显示回调函数 glutDisplayFunc(display); // 进入 GLUT 主循环 glutMainLoop(); return 0; } ``` 这个程序将创建一个简单的 OpenGL 窗口,并在其中绘制一个三角形。当您运行此程序时,将会看到一个白色的三角形在黑色的背景上。您可以修改程序中的绘制代码来绘制任何您想要的图像。 ### 回答2: 使用C语言编写一个程序将图片绘制画图上,可以分为以下几个步骤: 首先,需要导入必要的库文件,例如`stdio.h`、`stdlib.h`、`graphics.h`等。 然后,需要定义画图的窗口大小和图片的大小,可以使用`initwindow`函数创建画图窗口,使用`image`结构体存储图片信息。 接下来,通过`loadimage`函数将图片加载到内存中,可以指定图片的位置和大小。 然后,使用`putimage`函数将加载的图片绘制画图窗口中指定的位置,可以使用`getimage`函数获取图片的像素信息。 如果需要进行图片的编辑或变换,可以使用`getpixel`函数读取指定位置的像素信息,再使用`putpixel`函数修改指定位置的像素信息。 最后,可以使用`getch`等函数来等待用户的操作,例如按下某个键盘按键后退出程序或保存绘制的图片。 需要注意的是,不同操作系统的图形库和函数的调用方式可能有所差异,可以根据具体的开发环境做相应的调整。 以上是简单描述了使用C语言编写一个将图片绘制画图上的程序的基本步骤,具体实现还需针对具体需求进行调整和完善。 ### 回答3: 要通过C语言编写一个程序将图片画到画图上,可以使用一些图形处理库,例如OpenCV库。 首先,需要安装和配置OpenCV库。在程序的开头添加相关的头文件,引入OpenCV库的函数和数据结构。然后,在程序中创建一个窗口,用于显示图像。 接下来,使用OpenCV库提供的函数加载图片文件。可以指定图片文件的路径和名称,将其读取为一个图像对象。确保图像文件的路径和名称是正确的。 加载图片后,可以使用OpenCV库提供的绘图函数在窗口中显示图像。使用cv::imshow函数可以将图像显示在指定的窗口中。可以通过参数指定窗口的名称和要显示的图像。 最后,使用cv::waitKey函数等待用户的按键操作,保持图像窗口的显示。这样用户可以观察图像,并进行相关的操作。 编写完程序后,可以使用C语言编译器编译并运行程序。在运行过程中,会打开一个图像窗口,并将指定的图片显示在画图上。用户可以通过按键操作来关闭窗口,退出程序。 总结起来,通过使用OpenCV库和相关的函数,可以方便地将图片画到画图上。编写一个可以加载、显示图片的C语言程序,并使用OpenCV库提供的函数进行相应的处理,即可实现这个功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值