R语言--绘图部分

点图和折线图

涉及到的绘图函数总结:
plot()
lines()根据数据集中的内容添加点或者直线;根据起始点/终点的位置去添加直线(详见箱形图应用)
legend()添加图注
text()添加文字
abline()根据斜率和截距添加直线
pdf(),dev.off()

plot函数详解

> a
      height weight gender      BMI
tom      180     75   male 23.14815
cindy    165     58 female 21.30395
jimmy    175     72   male 23.51020
sam      173     68   male 22.72044
lucy     160     60 female 23.43750
lily     165     55 female 20.20202
> plot(a$weight, a$height,# x,y
+      type="b",#为"p"代表为点,"l"代表为直线,"b"(both)代表点和直线均有,"n"即为不画任何图形
+      main="weight vs height", # 主标题
+      xlab="weight(kg)", #(x label)X轴名称
+      ylab="height(cm)", #(y label)Y轴名称
+      ylim=c(160,180), #(y limit)Y轴范围
+      xlim=c(55,75), #(x limit)X轴范围
+      col="red", #颜色
+      pch=8) #控制点的形状
输出结果

补充内容:pch参数对应

练习1

对数据进行按x轴(即体重)排序后,再进行折线图的绘制

a1=a[order(a$weight,decreasing = F),]#排序,order函数返回的是排序后的位置的向量
plot(a1$weight, a1$height,
     type="b",
     main="weight vs height", 
     xlab="weight(kg)", 
     ylab="height(cm)", 
     ylim=c(160,180), 
     xlim=c(55,75), 
     col="red", 
     pch=19) 
输出结果

练习2

练习2:lines()函数的应用
用plot函数画一个空图版,然后再用lines函数添加数据折线和数据点。
如本例,将男性数据用蓝色的点和线显示,女性数据用红色的点和线显示

male=a[a$gender=="male",]#布尔筛选男性的所有数据
female=a[a$gender=="female",]
plot(a$weight, a$height,
     type="n",
     main="weight vs height", 
     xlab="weight(kg)", 
     ylab="height(cm)", 
     ylim=c(160,180), 
     xlim=c(55,75), 
     col="red", 
     pch=19) #plot画空画板

lines(male$weight,male$height,col="blue",type = "b",pch=19)
lines(female$weight,female$height,col="red",type="b",pch=19)
输出结果

练习3

为数据集中的因子gender中的female和male两个水平指定颜色和形状,分组
legend()添加图注
text()添加文字

color=ifelse(a1$gender=="male","blue","red")#返回向量
shape=ifelse(a1$gender=="male",19,21)#返回向量
plot(a$weight, a$height,
     type="b",
     main="weight vs height", 
     xlab="weight(kg)", 
     ylab="height(cm)", 
     ylim=c(160,180), 
     xlim=c(55,75), 
     col=color,
#颜色:详细描述:线条和点的颜色。可以用向量指定多种颜色,这样每个点都可以被赋予自己的颜色。如果颜色比点数少,它们会以标准方式循环使用。
     #所有的线都将以指定的第一种颜色绘制。
     pch=shape) #同样可以用向量指定多个形状

     
legend("topleft",#指定图注的位置,左上,右上,左下,右下
       legend=c("male","female"),#
       col=c("blue","red"),
       pch=c(19,21))

text(58,166,"Cindy")#添加文字,58,166为在x轴/y轴的位置
输出结果

加直线

(1)添加垂直的直线和水平的直线

abline(v=65,col="red",lty=3,lwd=3)#lty;线类型,lwd线宽度
abline(h=170,col="green",lty=4,lwd=2)

(2)添加线性拟合直线画直线需要截距和斜率,abline()函数可以直接从线性拟合的结果中提取截距和斜率进行绘制

result=lm(height~weight,data)
abline(result,col="black")#直接提取result中的斜率和截距,进行直线绘制
输出结果
补充内容:abline参数

保存绘图命令:

pdf(file="scatter_line2.pdf",width=10,height=7)
dev.off()
#两行命令间为绘制图片的内容

柱形图

页面边距及绘图个数函数设置

页面边距:mar();mai():mai和mar是控制边距的参数,需赋值为一个含有四个元素的向量,分别控制下,左,上,右的留白边距。mai留白单位是英尺,mar单位是行

绘图个数:mfrow();mfcol():mfrow/mfcol是长度为2的数值向量,第一个元素是行,第二个是列,mfrow绘图时填充图形的顺序是一行一行的填充,mfcol绘图时填充的顺序是一列一列的填充

par(mar=c(5,4,4,2))
#par控制的参数影响接下来的画图,不影响上面代码的绘图
#设置图形下、左、上、右的页面边距分别为5,4,4,2英尺
par(mfrow=c(2,2))
#设置两行两列四个绘图框,并在填充时一行一行的填充

简单柱形图的绘制

a=read.table("BMI.txt",header=T,sep="\t",row.names=1)
barplot(a$height,
        names.arg=rownames(a),#names.arg需赋值为一个与bar数等长的向量,意为给每个bar加上名字
        ylim=c(0,200),
        xlab="name",
        ylab="height(KG)",
        main="height",
        las=1#控制每个bar(横轴)名字的走向,默认las=1,意为横放,las=2意为竖放
        )
简单柱形图绘制结果

绘制好柱形图后手动用text函数添加横轴名字

p=barplot(a$height,
          names.arg=rownames(a),
          ylim=c(0,200),
          axisnames=F#axisnames=F设置轴上面的名字为false,即names.arg参数不生效
          )
#注意p返回的是每个bar正中间的x轴的坐标位置
text(p,0,#横坐标位置,纵坐标位置,要添加的内容可以是向量,但注意向量长度要相等,会一一对应
     labels=rownames(a),#labels控制加的内容
     srt=0,#srt参数控制角度
     cex=1,#控制字体大小,默认为1
     adj=c(0.5,1),#adjust微调字体的位置,为长度为2的向量。可以在位置摆放好之后微调字体摆放的位置。第一个元素控制左右移动(负数为向右,正数为向左),第二个元素控制上下移动(负数为向上,正数为向下),
     col="black",
     xpd = TRUE#要添加的字体在图形范围以外的话,需要设置此参数为true,才能添加上字体
     )
手动添加名字输出结果

堆叠柱形图的绘制

barplot(as.matrix(t(a[,-3])),#barplot函数中只能存数值
        col=c("red","blue","green"),
        ylim=c(0,300)
        )
legend("topright",
       horiz=T,
       bty="n",#去掉图注外的框
       legend=names(a)[-3],
       col=c("red","blue","green"),
       pch=rep(15,3)
)
堆叠柱形图绘制结果

并列柱形图的绘制

barplot(t(as.matrix(a[,-3])),
        beside=T,#跟堆积柱形图相比,只更改了这一个参数
        col=c("red","blue","green"),
        ylim=c(0,200)
        )
legend("top",
       horiz=T,
       bty="n",
       legend=names(a)[-3],
       col=c("red","blue","green"),
       pch=15
       )
并列柱形图的绘制,x轴的标签为默认

自定义x轴标签,大小,位置,角度

data=t(as.matrix(a[,-3]))
p=barplot(data,
        beside=T,
        col=c("red","blue","green"),
        ylim=c(0,200),
        axisnames=F
)
#此时的p存的数值是不一样的,存的是矩阵中的每个元素对应的x轴的位置
text(p[2,],0,
     labels=rownames(a),
     srt=45,cex=1,
     adj=c(1,1),
     xpd = TRUE)
legend("top",
       horiz=T,
       bty="n",
       legend=names(a)[-3],
       col=c("red","blue","green"),
       pch=15
)

并列柱形图的绘制,标签为自定义

柱形图综合应用--绘制堆叠柱形图并添加error bar

计算男生组和女生组身高体重bmi的均值并绘制成并排柱形图(男生组和女生组并排),并添加sd值

思路:
(1)先理清barplot需要的输入数据的格式,确定好行列的摆放如本例:


barplot所用的输入数据的格式

(2)根据需要输入的数据格式,做好数据处理,再barplot绘图
(3)理清errorbar绘制需要的输入的数据格式,确定好行列的摆放如本例:


绘制errorbar所用的输入数据的格式

(4)根据需要输入的数据格式,做好数据处理,再arrows绘图

注:arrows函数:Draw arrows between pairs of points(画两点之间的箭头)。
函数参数详解
arrows(x0, y0, x1 = x0, y1 = y0, length = 0.25, angle = 30,code = 2, col = par("fg"), lty = par("lty"),lwd = par("lwd"), ...)

x0,y0为起始箭头的位置;x1,y1为终止箭头的位置

###(1)barplot数据处理
df=read.table("BMI.txt",head=T,row.names = 1)
male=df[df$gender =="male",-3]
female=df[df$gender =="female",-3]

male_mean=apply(male,2,mean)
female_mean=apply(female,2,mean)

all_mean=rbind(male_mean,female_mean)
###(2)barplot绘图
pos=barplot(all_mean,beside = T,ylim=c(0,200),col = c("blue","red"))

###(3)errorbar数据处理
male_sd=apply(male,2,sd)
female_sd=apply(female,2,sd)

all_sd=rbind(male_sd,female_sd)
###(4)arrows函数绘图
arrows(x0=pos,y0=all_mean+all_sd,
       x1=pos,y1=all_mean-all_sd,angle = 90,
       code = 3,#code参数详解见上文散点图的绘制,3为双向箭头
       length=0.08,
       lwd=0.6)
#注意要用arrow函数画error bar,除了必选的输入数据之外,其余控制error bar形状的参数可以用的时候直接复制
应用输出结果

补充:另一种输入数据的处理方法(应用tapply函数),上文绘制error bar的数据处理方法是取数据框子集进行处理

ata=a[,-3]
gender=a$gender
tapply(data,gender,mean)
average=apply(data,2,function(x){tapply(x,gender,mean)})
std=apply(data,2,function(x){tapply(x,gender,sd)})

p=barplot(average,beside=T,ylim=c(0,200),
          col=c("red","blue")
)

arrows(x0=p,y0=average+std,
       x1=p,y1=average-std,
       angle=90,
       code=3,
       length=0.04,
       lwd=0.4)

总结:
柱状图绘制要点掌握:
(1)绘制简单柱状图和堆叠(并列)柱状图输入数据的区别:


简单柱状图数据格式

向量中的每个元素即为一个柱子


堆叠(并列)柱状图输入数据格式

列为柱子的个数,行为并列柱子的个数
(2)barplot函数的返回值
并列柱状图barplot函数的返回值

返回的是每个柱子对应的x轴的坐标

(3)注意掌握应用中的两种数据处理的方式,应用tapply函数和取数据框子集进行处理
(4)bar plot函数和arrow函数

箱形图和小提琴图

箱形图图解

箱形图绘图参数详解

boxplot(weight~gender,#体重根据因子性别进行分类画图
        data=mydata,#数据是一个矩阵/数据框
        boxwex=0.4,#调整盒子宽度的参数,默认为0.8
        las=2,#控制x轴的分类标签横放或者竖着放
        horizontal=TRUE,#将箱子横放
        main="weight boxplot",
        xlab="Gender",
        ylab="weight(Kg)",
        col=c("red","blue")
        )
输出结果

箱形图理解

summary函数,输入为一个向量,可以计算显示出向量的最大值,最小值,上四分位数,下四分位数,中位数

手动添加x轴标签

###法一 text函数添加
par("usr")#返回画图区域的左右下上的位置的一个向量
text(1:2,#注意boxplot的横轴第几个箱子的位置可以直接表示为数字第几
     par("usr")[3],
     labels=c("female","male"),
     srt=30,cex=1,adj=c(1,1),xpd=T)

###法二axis函数添加
boxplot(weight~gender,data=mydata,xaxt="n")
#axis函数:为当前图片添加轴标签
axis(1,#指定轴的位置:1=below, 2=left, 3=above and 4=right
     at=(1:2),#指定要添加label的相应轴上的位置
     labels=c("female","male")#指定要添加的内容
     )

小提琴图的绘制

小提琴图不能跟boxplot一样用~进行分组需要明确指定出需要哪些数据


需要的数据格式

每一列代表一个小提琴,一列中的所有数据用于计算上四分位数,中位数,下四分位数等等
unstack函数:根据因子分组,返回列为因子水平的数据框。输入为一列数值,一列因子的数据框

> unstack(mydata[,c("weight","gender")])
  female male
1     58   75
2     60   72
3     55   68
#BiocManager::install("plotrix")
library(plotrix)
violin_plot(unstack(mydata[,c("weight","gender")]),
            col=c('red','blue'),
            violin_width=0.8#控制小提琴的宽度,与boxplot中boxwex参数类似
            )

应用:为箱形图加上T检验的结果

boxplot(weight~gender,
        data=mydata,
        boxwex=0.4,
        las=1,
        main="weight boxplot",
        xlab="Gender",
        ylab="weight(Kg)",
        col=c("red","blue"),
        ylim=c(55,80)
)

result=t.test(weight~gender,mydata)
attributes(result)#看一个对象的属性,attribute,与面向对象的编程思想结合看
result$p.value#通过属性调用获取p值
pval=round(result$p.value,3)#round函数:四舍五入,第一个参数是四舍五入的数值,第二个参数是保留小数点后几位
lines(c(1,2),c(76,76))#lines第一个参数为起始和终止的x轴的坐标,第二个参数为起始和终止的y轴的坐标
text(1.1,77,"**",col="red",cex=1.5)
text(1.5,77,paste("pvalue = ",pval,sep=""))
输出结果

饼图

取色相关知识

(1)相关R包:RColorBrewer
详细说明文档:
https://rdrr.io/cran/RColorBrewer/man/ColorBrewer.html
部分功能注解:
brewer.pal.info:以数据框的形式返回可用的调色板信息(注意它不是一个函数,只是一个值)
display.brewer.all():在图形窗口展示一些调色板
brewer.pal(n,name):将colorbrewer中的调色板变成R中可用的调色板。其中n为指定调色板中颜色的个数,最小为3,最大依调色板中的颜色而定。name为指定调色板的颜色。
display.brewer.pal(n,name):在图形窗口中显示选定的调色板及颜色

#示例查看颜色示例
library(RColorBrewer)
barplot(rep(1,9),col=brewer.pal(9,"YlOrRd"))
barplot(rep(1,9),col=brewer.pal(9,"Set1"))
barplot(rep(1,12),col=brewer.pal(12,"Set1"))

(2)rainbow()函数:rainbow(n):产生n个连续颜色的向量

barplot(rep(1,20),col=rainbow(20))

饼图绘制

数据处理:
用到的函数:
table()
prop.table()

> stage
 [1] "stage ivb" "stage ivb" "stage i"   "stage i"   "stage i"   "stage iv"  "stage ii"  "stage i"   "stage ii" 
[10] "stage ivb" "stage i"   "stage i"   "stage i"   "stage i"   "stage ii"  "stage iv"  "stage ii"  "stage i"  
[19] "stage i"   "stage i"   "stage ii"  "stage i"   "stage i"   "stage i"   "stage i"   "stage i"   "stage ii" 
[28] "stage i"   "stage iva" "stage i"   "stage iii" "stage iva" "stage i"   "stage ii"  "stage ii"  "stage ii" 
table(stage)
#table返回的是一个class为table的对象,是对向量中相同的元素进行计数统计。
prop=round(prop.table(table(stage)),3)
#prop.table:需要输入的是table对象,计算的是table中的每个元素所占的百分比
prop=sort(prop,decreasing=T)#此时的prop也是一个table对象

图形绘制:

pie(prop,
    labels=names(prop),
    clockwise=TRUE,#按照顺时针来画
    radius=1,#控制饼图的半径
    init.angle=45,#控制起始饼图的位置
    #col=brewer.pal(6,"Set1"),
    col=rainbow(6),
    border="white",#控制每个小块饼之间的边界
    main="Percentage of different tumor stage")

输出结果:


饼图输出结果

手动定义每块饼的注释

关键参数:labels=

pielabels <- sprintf("%s = %.1f%s", names(prop),
                     100*prop, "%")
#sprintf:见纸质笔记
pie(prop,
    labels=pielabels,#为饼图加上标签,此时pielabels为一个向量
    clockwise=TRUE,
    init.angle=0,
    radius=1,
    col=brewer.pal(6,"Set1"),
    border="white",
    main="Percentage of different tumor stage")
输出结果

图注显示标签

pie(prop,
    labels=NA,
    clockwise=TRUE,
    radius=0.8,
    col=brewer.pal(6,"Set1"),
    border="white",
    main="Percentage of different tumor stage")

legend("bottomright",legend=pielabels,bty="n",
       fill=brewer.pal(6,"Set1"),
       #ol=brewer.pal(6,"Set1"),
       #pch=15
       )
输出结果

3D饼图

library(plotrix)
par(mar=c(5,4,0,2))
pie3D(prop,
      labels = names(prop),
      start=0,
      col=brewer.pal(6,"Set1"),
      explode = 0.1, #控制饼之间的间隔
      main = "Pie Chart of tumor stage ")
legend("topright",legend=pielabels,bty="n",
       fill=brewer.pal(7,"Set1"))
输出结果

韦恩图

韦恩图实例,用三种rna-seq的软件进行差异表达基因的筛选,对筛选出的基因集进行韦恩图绘制。

数据处理

deseq=read.table("DESeq2-DEG-res.txt",header=T,sep="\t",row.names = 1)
limma=read.table("voom-DEG-res.txt",header=T,sep="\t",row.names = 1)
edger=read.table("edger-DEG-res.txt",header=T,sep="\t",row.names = 1)
deseq_gene=rownames(deseq)
limma_gene=rownames(limma)
edger_gene=rownames(edger)

基本韦恩图的绘制

library(VennDiagram)
venn.diagram(
  x = list(deseq_gene, limma_gene, edger_gene),
#传入要取交集的三个基因集,注意要以list的格式传入
  category.names = c("deseq_gene" , "limma_gene " , "edger_gene"),
#基因集的名字,显示在Venn图的外面
  filename = 'DEG_venn_diagramm1.tiff'
#Venn不能展示在绘图窗口
)

韦恩图绘制颜色及其他相关参数的设置

library(VennDiagram)

#设置三种颜色
library(RColorBrewer)
myCol <- brewer.pal(3, "Set1")
barplot(1:3,col=myCol)

venn.diagram(
  x = list(deseq_gene, limma_gene, edger_gene),
  category.names = c("deseq_gene" , "limma_gene " , "edger_gene"),
  filename = 'DEG_venn_diagramm2.tiff',
  output=TRUE,
  
  #控制输出文件大小
  height = 700 , 
  width = 700 , 
  resolution = 300,#分辨率
  compression = "lzw",#压缩方法
  
  #控制圆圈格式
  lwd = 1,#控制边界圆圈的粗细
  #lty = 'blank',#控制线的形式,blank为空,即没有边线
  fill = myCol,#圆圈的填充色
  col=myCol,#控制边界圆圈的颜色
  
  #控制数字格式
  cex = 0.4,#控制数字大小
  #fontface = "bold",  #粗体
  #fontfamily = "sans",  #字体
  
  #控制标签格式
  cat.cex = 0.4,#cat是category的缩写,控制标签的大小
  cat.fontface = "bold",  #粗体
  #cat.fontfamily = "sans",   #字体
)
####韦恩图透明度参数设置

library(scales)
venn.diagram(
x = list(deseq_gene, limma_gene, edger_gene),
category.names = c("deseq_gene" , "limma_gene " , "edger_gene"),
filename = 'DEG_venn_diagramm3.tiff',
output = TRUE ,
height = 700 ,
width = 700 ,
resolution = 300,
compression = "lzw",

lwd = 1,
col=c("red", 'blue', 'green'),
fill = c(alpha("red",0.3), alpha('blue',0.3), alpha('green',0.3)),#alpha:改变透明度
cex = 0.4,

cat.cex = 0.4,
cat.col = c("red", 'blue', 'green'),
)

####取出韦恩图的交集基因的相关函数
intersect():取交集
union():取并集
setoff():求向量x与向量y中不同的元素(只取x中不同的元素)

取三个基因集的并集

inter_limma_edger=intersect(limma_gene,edger_gene)
inter_deseq_limma_edger=intersect(inter_deseq_limma,edger_gene)

取只存在于deseq,不存在于其他两个基因集中的基因集

union_limma_edger=union(limma_gene,edger_gene)
deseq_specific=setdiff(deseq_gene,union_limma_edger)

write.table(file="edger_specific_gene.txt",edger_specific,quote=F,row.names=F,col.names=F)#输出基因集

##热图
####配色方案补充:

R中内置的两个配色方案

heatmap(data, col = cm.colors(256))
heatmap(data, col = terrain.colors(256))

Rcolorbrewer配色方案,渐变色

library(RColorBrewer)
coul <- colorRampPalette(brewer.pal(8, "PiYG"))(25)

colorRampPalette制造渐变色的函数:(25)意为渐变成25个颜色

####示例:提取差异基因的表达量,并绘制热图

expression=read.table("miRNA_expr.txt",header=T,row.names=1,sep="\t")
deg=read.table("MIR_DEG_fc_2.5_pval_0.01.txt",header=T,row.names = 1,sep="\t")

deg_expression=expression[rownames(deg),]#提取差异基因的表达量
data=as.matrix(deg_expression)

coul <- colorRampPalette(brewer.pal(8, "PiYG"))(25)
heatmap(data,#注意data要求其必须为矩阵
#scale="row"#按行标准化
#Rowv=NA, #不显示行聚类
#Colv=NA, #不显示列聚类
col = coul,
cexRow=1,#cex在很多画图程序中都是控制字体大小的
cexCol=1
)

![输出结果](https://upload-images.jianshu.io/upload_images/18905366-8149d6571ea9f2cb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

####给热图加上分组标签,并添加label

type=factor(rep(c("CR","CC"),each=3))
colSide <- c("red","blue")[type]#type是个因子,[type]会转成索引
heatmap(data,
cexCol = 1,
cexRow = 1,
margins = c(7, 7), #控制行名和列明的边距
ColSideColors=colSide#设置行列分组的标签
)

legend("topright",legend=levels(type),col=c("red","blue"),pch=15,bty="n",cex=0.7)

![输出结果](https://upload-images.jianshu.io/upload_images/18905366-acb640d97757017e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


你可能感兴趣的:(R语言--绘图部分)