目前最全的R语言-图片的组合与拼接

Python013

目前最全的R语言-图片的组合与拼接,第1张

https://www.rdocumentation.org/packages/customLayout/versions/0.2.0

https://mp.weixin.qq.com/s/zbp8pOQcNB4XBBF5SCg5GA

customLayout用于拼图特别方便,尤其是仪表盘布局

支持R内置的base绘图对象,ggplot2对象(与grid结合 )

Hide

”library(ggplot2)library(customLayout)

通过设置简单的数字矩阵以及对应的宽高比,可以非常方便的设置出来数字拼图

关键函数:

mat数字矩阵必须从1开始,且必须连续

其它拼图包没有的功能,非常好用

跟合并矩阵类似。分为行合并和列合并

这个功能也是其它包没有的,非常有用

关键函数:

参数lay表示大画布,参数newlay表示要嵌套进去的小画布,field表示指定要嵌套的区域编号

关键函数:

cowplot是一个ggplot2包的简单补充,意味着其可以为ggplot2提供出版物级的主题等。

更重要的是,这个包可以组合多个”ggplot2”绘制的图为一个图,并且为每个图加上例如A,B,C等标签,

这在具体的出版物上通常是要求的。 语法结构与ggplot类似,将ggplot2图作为一个对象置于 ggdraw() 中

表达式:

draw_plot(plot, x = 0, y = 0, width = 1, height = 1, scale = 1)

draw_text(text, x = 0.5, y = 0.5, size = 14, hjust = 0.5, vjust = 0.5,...)

draw_plot_label(label, x = 0, y = 1, hjust = -0.5, vjust = 1.5, size = 16, fontface = "bold", family = NULL, colour = NULL, ...)

参数解释:

grid中文翻译为网格,可将其解释为画布分割,通过设定相应的参数,从而可以任意的摆放图形

常用函数:

语法:

参数解释:

layout参数

综合例子

子母图,主要是形成局部放大的效果,既可以从整体上对比,又兼顾特别小的数据组,或特别密的数据点可以查看,而没有必要单独做2张图

<pre style="box-sizing: border-boxfont-family: Monaco, Menlo, Consolas, "Courier New", monospacefont-size: 13pxwhite-space: pre-wrapdisplay: blockpadding: 9.5pxmargin: 0px 0px 10pxline-height: 1.42857color: rgb(51, 51, 51)word-break: break-alloverflow-wrap: break-word !importantbackground-color: whiteborder: 1px solid rgb(204, 204, 204)border-radius: 4pxmax-width: 100%font-variant-numeric: normalfont-variant-east-asian: normalletter-spacing: 0.544pxtext-align: justifywidows: 1overflow: auto">## png

蝴蝶图

主要函数:

语法:

参数解释:

把绘图对象添加到列表总,并把该列表传递给 grid.arrange() 函数中的grobs参数

子母图

grid包可以画字母图

安装gridExtra包后,ggplot2中多了一个 ggplotGrob( )函数,可以创建grob对象参数

1. 判断存在:一个元素是不是在向量中用 a%in%b

>a="TT"

>b=c("AA","AT","TT")

>a %in% b

[1] TRUE

2. 判断某一元素这向量中的索引(第几个位置): index.TT=which(b==”TT”)

>index.TT=which(b=="TT")#index.TT是想知道的索引号,which是判断函数,b是想知道的元素所在的向量

>index.TT

[1] 3

3. 相当于 python 中的字典, names 函数

>b

[1] "AA" "AT" "TT"

>names(b)=c("geno1","geno2","geno3")#geno mean genotype

>names(b)

[1] "geno1" "geno2" "geno3"

>names(b)[1]

[1] "geno1"

>names(b)[1]="test"

>names(b)

[1] "test""geno2" "geno3"

>names(b)=NULL

>b

[1] "AA" "AT"

>b["geno2"]

"AT"

pop_name=c(“CEU”,"YRI")

names(pop_name)=c(1,2)

names(pop_name[1])=1

4. 去除某一元素: b[-index.nu]

#想去除元素”TT”,如果你不知道是第几个索引,可以先判断索引,再删除。

>b=c("AA","AT","TT")

>names(b)=c("geno1","geno2","geno3")

>index.TT=which(b=="TT")

>b=b[-index.TT]

>b

geno1 geno2

"AA""AT"

5. 相当于 Python 中的 set() 函数 和 count() 函数: unique() , table()

>b=c("TT","AT","AT","TT","AA")

>unique(b)#即相当于去除所有的重复,只保留一个

[1] "TT" "AT" "AA"

>table(b)#以元素为name,统计各元素的个数

b

AA AT TT

122

6. 字符串的分割: strsplit()

>test="AA"

>strsplit(test)

错误于strsplit(test) :缺少参数"split",也没有缺省值

>strsplit(test,split='')

[[1]]

[1] "A" "A"

>test=strsplit(test,split='')[[1]]

>test

[1] "A" "A"

7. 文本文档的写入: write.table()

write.table( res.matrix,file=new.file,sep='\t',quote=F,row.names=F,col.names=F,append=T)#quote=F去掉引号后写入,row.names=F去掉行的名字写入,否则会把名字写进去

##写入数据时候最好把数据存储成一个matrix然后直接写。要是每行每行写的话要注意数据的格式了。先建立一个空的matrix,见8,然后通过rbind或者cbind叠加上去。

方法一:

a=c()

b=c(“AA”,”TT”,”CC”)

for (i in 1:3){

a=c(a,b)

}

write.table(a,file=”test.txt”)#你会发现结果是

AA

TT

CC

….

##而且还有行和列的名字,因为没有设置参数。因为对于c向量来说,写的话默认是竖着写的,每个元素占一行。所以比较方便的就是rbind

方法二:

a=c()

b=c(“AA”,”TT”,”CC”)

for (i in 1:3){

a=rbind(a,b)

}

write.table(a,file=”test.txt”,quote=F,row.names=F,col.names=F)#你会发现结果是

AA TT CC

AA TT CC

AA TT CC

##原因是rbind把最总结果当做矩阵了。对于R数据的写入最好能生成最后的矩阵再写入。但是西面的梅一行写一次和方法二的效果是想通的,但是要用到append参数。

a=c()

b=c(“AA”,”TT”,”CC”)

for (i in 1:3){

a=rbind(a,b)

write.table(a,file=”test.txt”,quote=F,row.names=F,col.names=F,append=T)

}

8. 建立一个空的 matrix :

res.matrix <- matrix( ,nrow=0,ncol=6 )##这样就建立了一个0行6列的空matrix了。

9. 如何将 R 运行结果输出到文件

>x=read.table("F:/my/work/chengxu/PValue/pc2jieguo/pc2302.txt")

>z=t(x)

>ks.test(y,z)

Two-sample Kolmogorov-Smirnov test

data:y and z

D = 0.207, p-value <2.2e-16

alternative hypothesis: two-sided

如上面运行结果,我想将p-value <2.2e-16自动保存到一个文件中,如何用R程序实现,谢谢!

sink("output.txt")

print(ks.test(y,z)$p.value)

sink()

http://cos.name/cn/topic/16300

10 降序排列:

>a=c(1,1.2,0.1,4,5,-0.1)

>a=sort(a,decreasing=T)

>a

[1]5.04.01.21.00.1 -0.1

11. 取前1%的数

>a=c(1:10,4:20,1:100,1:1000)

>a=sort(a,decreasing=T)#先降序

>sig=a[round(length(a)*0.01)]

>sig

[1] 990

12.在shell中直接执行R脚本

R CMD BATCH --argstest.R

13. R中高级作图的方法

http://qizhi502.blog.163.com/blog/static/11497002520120611451736/

14:设置字体类型:

par(family='Times New Roman')

15:控制图形四周的空白大小

par(mfrow=c(3,1),mar=c(0,0,0,0))

其中mar是四周的间距,分别为x,y上下的距离

16控制作图区域的大小layout

layout(c(1,2,3),height=c(1,1,0.5))

分成竖着三份, 其中三份比列依次为(高度依次为2:2:1)

17保留两位小数

round(0.123,digits=2)

18 在原有图的基础上画图:

par(fig=c(0.1,0.5,0.43,0.65), new=TRUE)

19 只显示y轴

plot(1:10,1:10,axes=F)

axis(2,at.....)

20 调节刻度方向 las

plot(1:10,1:10,las=1)

21 屏幕分割

layout(matrix(1:16,4,4))###竖着plot

par(mfrow=c(4,4))##横着plot

22.逻辑表示或者

xor为异或,两值不等为真,两值相等为假。例:xor(0, 1)

23. 从向量中随机取几个数sample

sample(rep(1:1000),10)

23 字符串转换成小数浮点型

as.numeric("0.123")

24. 读取不规范的文本

f=readLines(afile,n=1)#n表示读几行

f=strsplit(f,'\t')##分割

f[1][[1]]##第一行

f[1][[1]][1]##第一行 第一个字符串

25. write 写入文件

write(afile, "a\tb\t",append=T) #沿着每行一次 写入

26. 不需要循环,这直接对matrix没行或者每列进行筛选操作apply()

apply(data,col2 or row1, max>0)

27.保留2位小数

a=2.300

a=as.numeric(sprintf(“%.3f”,a))

28。调出假设检验的p value

t.test(data1,data2)$p.value

R语言高质量绘图的10条tips

在这篇文章开始之前我想你一定学习了大量如何用R绘制精美的统计图的方法,现在是时候向大家展示你的图形了。你可能会将你的统计图形打印出来,或者是插入到文档中去,或者把它发布到网上,只要你保证最后让大家看到的图别丑到天际就行。这里要跟大家分享10条如何让你的统计图看起来完美无缺的建议。

1. 从脚本中调用正确的设备驱动程序

用软件生成图片后直接点“另存为”某种格式的图片保存方法看起来6得飞起。然而这种快捷方法不能进行图形设置,甚至有些情况下文件格式都是默认的。如果在图形创建完成后再去手动调整图形尺寸的话,你可能会得到一些不期望看到结果(比如说你画出的圆形看起来像是椭圆)。同样的原因,也尽量避免使用 dev.copy 这样的命令,尽管这要节省不少事。

最好的方法是创建一个脚本文件然后用命令调用设备驱动程序(通常是pdf或者png格式),运行绘图代码,然后用一个dev.off() 结束命令。比如说:

png(file = "mygraphic.png", width = 400, height = 350) plot(x = rnorm(10), y = rnorm(10), main = "example")dev.off( )

这样做的好处是不仅能够画出更好的统计图,并且当你忘记如何手动操作绘图时,你会有办法在接下来的时间里重新创建一样的图形。

2. 打印图形请用PDF格式

如果你打算打印图形,则需要使用基于向量的格式。这意味着图形是一个独立的尺度格式表示的,它可以在任何尺寸或大或小的创建不产生锯齿线或像素化文本。这样的图形你在打印机上打印时,即使打印机的图形被放大或缩小,不管打印机的每一点(每英寸点数)高低,线条都会显得平滑,文字也会清晰无比。

PDF(通过pdf()命令)是最好的选择:无处不在的PDF阅读器让你轻松地在Windows、MacOS以及Linux上面浏览你的图片。另外高质量的PDF图形也几乎可以在任何打印机上打印出来。无论对方是否有高质量的图片要求,用PDF图形格式发送邮件都是最好的选择。

3. 网页显示请用PNG格式

PDF格式不大方便嵌入到网页中去,作为替代你需要使用基于像素的格式。GIF是一直以来广受欢迎的格式,但也有一些局限性(尤其是在使用多种颜色的图形,像图像图在GIF中看起来就不大正确)。这种情形下最好的选择是PNG格式,可以由png()命令生成,大多数浏览器都可以较好地支持PNG图形显示。

使用png()时你需要做的选择是像素图形的尺寸(具体包括指定宽度和高度的参数)。x维度的选择是最重要的:理想的情况是,你希望整个图形立刻在屏幕上全部出现,而不是需要观众拖动水平滚动条来看到整个图形。

现在几乎每个显示器都超过800像素,所以宽度=800对于全屏图形是一个不错的选择。如果你的图表需要适合一个栏目(比如一个博客条目),你可能想把它缩减到400像素。选择基于你所需的纵横比Y维(见# 6,下同),在大多数情况下我发现选择一个较小的y (约85-90% x)效果很好。

如果你不能提前确定网页上的图形有多大,一个简单的诀窍是提高分辨率(任一方向超过1200像素),并使用height 或者 width = options(无需同时指定,以保存宽高比)为HTML中的img标签缩小尺寸。 这会使你的页面加载速度变慢,但是大多数浏览器在调整图像大小时都能保持图像质量。(生成高分辨率PNG文件时,请参阅#5中的一些注意事项。)

记住:尽管显示分辨率变低使得最终图形中所含细节信息越少,但一些情况我们只需要大尺寸下的效果。

4. 对于文档或者细节,请提高图形分辨率

如果你在Word或PowerPoint之类的文档中插入图形,那么像PDF这样的向量格式图片在理论上是最好的,因为它与尺寸无关。然而,在实践中微软的产品大多不能可靠地处理嵌入式矢量图形:尽管在经过一些努力后,图片在打印时看起来正常,但是编辑或检查包含矢量图形的文档可能会很麻烦(开源的LaTeX处理起来更好,内嵌的PostScript是最好的选择)。

在这种情况下,折衷的办法是使用PNG作为Web示例,但要需要高得多的分辨率。在Word中,你可以调整图形尺寸,高分辨率会使得你在调整尺寸时获得充分的灵活性。我建议在标准打印机的最长边上至少要有1200个像素。如果你的图片正在专业印刷(例如在一本书或海报上),请向你的印刷店咨询他们的建议(他们可能需要一个PostScript或一个非常高分辨率的TIFF文件)。

5. 认真选择尺寸

R一直都有一个以英寸为单位的图形真实尺寸的概念,独立于用于渲染PNG的像素数或实际大小,PDF可以在打印时放大或缩小。当你在图形上使用文本时,维度的选择将会非常重要。

R使用X和Y轴上的图形英寸数来确定页面上所添加的文本的实际宽度和高度。一般而言,随着英寸的图形尺寸变大,文本相对于图形的大小变小;相反,对于较小的图形,文本相对于图形元素变得更大。你可以正确使用cex选项来执行文字绘图命令,但总感觉略微繁琐。

PDF图形是最容易处理的,你可以方便地设置图形宽度和高度。即使你计划在巨幅海报上展示你的图表,最好还是保持7-10英寸的图形尺寸。这是一个适合A4(公制)纸的尺寸。由于PDF是可伸缩的,你可以放缩你的图形,但无论你怎样操作,请保证最后的图片是一个相对舒适的尺寸。

PNG格式就有点恶搞了。R默认每英寸像素大小为72,当你增加图形像素的时候图形尺寸也在增加。这是一个400x350像素默认设置的图形实例:

png(file = "animals72.png", width = 400, height = 350, res = 72)plot(Animals, log="xy", type="n", main = "Animal brain/body size")text(Animals, lab=row.names(Animals))dev.off()

R假设图的面积是5.55英寸,所以默认的文本大小相对于图本身来说是稍大一点的。你可以将此参数与PNG参数进行更正,PNG指定每英寸像素数。像素越小,以英寸为单位的面积越大,相对于图形的文本越小。让我们看看把这个降到45英寸时会发生什么:

png(file = "animals45.png", width = 400, height = 350, res = 45)plot(Animals, log="xy", type="n", main= "Animal brain/body size")text(Animals, lab=row.names(Animals))dev.off()

注意图标题和文本标签都变得很小,图形看起来也不那么拥挤了。我喜欢选择一个在8-10英寸范围内给出x尺寸的分辨率(这里是400/45=8.33英寸)。

6. 考虑图形宽高比

R的PDF图形驱动程序默认情形下会生成一个7x7英寸的方框,所以对于PNG图形而言选择相同X和Y轴的像素分辨率极具吸引力。但有些图形的宽度看起来要比上面的大得多(比如说时间序列图)。

选择PDF或者PNG图形像素时要考虑图形的宽高比,并且选择跟数据相适宜的X和Y轴比率。但不管你怎么操作,都不要把默认值当回事,要及时根据图形大小调整宽高比,不然的话你的图形元素可能会丑到变形。

另外还需要记住,在PDF或PNG调用中设置的图形维度包括图本身周围的所有外部边距,默认情况下,它们在所有方面都不是相同的尺寸。你需要相应地调整图形大小,或者重新设置边距,如下一个tips所言。

7. 图形外部边距不用的尽量删除

R在标题图形的顶部、轴标签的底部和左侧会预留空间。如果你的图形不包含任何这样的标签,那么使用这个空间来绘制一些图形元素是一个不错的主意。这使得你的图形更容易嵌入到一个网页或文档中而不必乱用裁剪。如果你以后需要在更小的尺寸上复制你的图,这就会变得容易很多,其中预留给标签的空间可以占据绘图区域的很大一部分。且看如下例子:

png(file = "notitle.png", width = 400, height = 350)par(mar = c(5, 3, 2, 2) + 0.1) hist(rnorm(100), ylab = NULL, main = NULL)dev.off( )

Mar参数中的4个数据分别表示图形下左中右与各自边线的距离,比如顶部边距默认为4.1,我这里把减小到了2.1,生成的柱状图与原图相比就要更紧凑一点了。

8. 图形保真

当计算机屏幕上显示对角线时,屏幕上的点与矩形网格会出现不完全对齐的现象。这会使线条看起来像锯齿形的,而不是平滑地上升。图形保真可以避免出现这样的情况,采用自动使用灰色像素线不完全填充屏幕上的像素,可以减少这种锯齿效应使得线条在屏幕上看起来更加平滑。

当你的图形时PDF格式就不用担心这种情况了,PDF会自动处理这一问题。但如果是PNG那就要需要对图形保真处理一下了。下图分别是没有经过保真处理和经过处理之后的图形对比。显而易见的是处理后的图形文本更加清晰并且曲线也很平滑。

9. 永远不要使用JPEG格式

你可能会尝试在Web上使用JPEG(又名JPG)图形格式,但这是一个馊主意。JPEG适用于类似照片的图像,但在典型的R图形中引入了围绕线条和字母的模糊处理过程,这使得另存为JPEG格式的R统计图模糊不堪。将PNG格式转换为JPEG格式或许能为你节省那么几KB的内存,但得牺牲图片质量这样的代价。

10. 要具有创造性

当然,做一张让人称赞的统计图的最重要的建议是:做一个漂亮的图形!定量数据的图形显示在某种程度上比数学推导更具艺术性,但作为一个一般规则,要想让你的数据用图形讲述故事,这需要一段时间和精力的投入。幸运的是,R为你提供了所有的工具,图形所需的任何元素都可以在R中实现完美的搭配。当然了,长时间的尝试与摸索是不可或缺的。