导图社区 图形工具
图形工具知识总结,包括在一张面板上结合多个图:函数par、饼图、条形图和带型图、盒型图、克里夫兰点图等等。
编辑于2022-06-09 22:32:43图形工具
在一张面板上结合多个图:函数par
输入
mfrow =
定义图形窗口的维数
c(2,2)就是生成个2*2的图形窗口
mar =
指定每个图形周围空白的大小,即四侧边缘的线的数目,底部,左侧,顶部,右侧
所以要是长度为4的向量定义
缺省值
c(5,4,4,2) + 0.1
输出
在一张面板上结合的多个图
这个功能是R比excel屌的一点
注意是你不需要par时,想单张输出,就把窗口关上,否则之后做的图会缩小放在第一格
如何用代码消除函数par对后来作图的影响
例子
为何要把par编到op变量中?
因为这样不会覆盖之前的图
因为你将par的参数存储到了op中...
而且最后一行再次执行了一次par,所以之后par会变成成为缺省值
所以你再次输入之后的图就不会覆盖之前的图了....好奇怪的感觉
饼图
输出2d饼图:函数pie
输入
x
非负的数值型向量
main=
“标题”
col=
颜色
例子
col = gray(seq(0.4, 1.0, length = 6))
col = rainbow(6)
clockwise=
TRUE
顺时针
默认
逆时针
输出
2d饼图
输出3d饼图:函数pie3D
输入
x
非负的数值型向量
main=
“标题”
labels=
names(Cases)
给一个向量作为各部分的标签
explode =
label cex =
标签字体大小
如0.6
输出
3d饼图
例子
为何要把par编到op变量中?
因为这样不会覆盖之前的图
因为你将par的参数存储到了op中...
而且最后一行再次执行了一次par,所以之后par会变成成为缺省值
所以你再次输入之后的图就不会覆盖之前的图了....好奇怪的感觉
条形图和带型图
有excel 就可以轻松完成的吧...
如何画条形图,并且转置数据输出新的图形
代码
输出
这里t是求了个转置....把6 2的换成了2 6的矩阵
所以这样就...
barplot其实是把colum默认安到x轴标签...
给条形图添加均值和标准差的箭头(上,下,或全都有)
1.先自己写代码算出来均值和标准差
2. 先画出平均值的条形图
3.用函数arrows把标准差的垂直线到图形上。
arrows函数的功能是在坐标为(x1,y1)和(x2,y2)的两点间画一个箭头。
告诉R在点(x,y1)和(x,y2)画一个箭头,因为两点具有相同的x值,会产生一个垂直箭头。
在这里y1=均值,y2是均值+方差,x是条形图中点的坐标值。
注意bp输出的并不是奇奇怪怪的东西,而是沿着x轴的每个条形图的中点
angle = 90和length = 0.1把箭头的顶端转变成垂直支线。
lwd表示线的宽度缺省值是1。
box函数围绕图形画一个盒子。
没有的话这个图就没框。。。。。。
画有标准误箭头的带型图
1.先算出标准误
标准误等于标准差除样本容量的平方根
Bent.se现在储存了标准误
2.用arrows函数加上标准误,注意若同时设置加和减标准误效果会很好。
注意其实有个points函数。其加了mean。而stripchart画的是原始数据,这意思就是看看真实数据的浮动。
用plot函数可以代替stripchart,但其没有method="jitter“选项。
我们也可以用jitter(Benthic$Richness)代替
盒型图
何时使用盒型图?
连续型数值响应(因)变量和分类解释(自)变量时
探测离群值
显示不同成分的分布
解释变量的影响
其实说白了就是看自变量x轴对因变量y到底有没有影响,初步的一个鉴定
而且比单纯的无脑error bar要好,是一个高级error box
盒型图输出的信息,其优越性。
盒型图通过第25和75百分点(上下四分位点)定义。
两者之间的差称为分散度。
点线有1.5倍分散度的长度。
如果所有点的值都小于第75个百分点+1.5被分散度,那向上的那个bar会变短,因为你不需要标出无意义的范围
所以为什么向下的那个线短于向上的,因为下方没有值,不需要覆盖上方。
代码
如何自定义盒型图的变量名,并且结合两种自变量同时分析其二者的交互作用(非常实用)。
结果是deprive和satiated对Negperchick影响相对性别更加明显
注意第四个盒型图为啥会重定义名字,因为那个变量原来的名字太长了(其左边的那个),所以我们重新定义了它们的名字,让它在显示框里能容得下
注意两个变量一乘会有神器效果...
如图,直接把两个变量给结合起来了
可能是利用向量数乘吧....
然后每个位置对应相乘,就是情况1且情况2
若都有两种情况,就变成了4种情况
如何创建一个有超多个自变量levels(超过20+)而且名称还清楚的被标记(斜着的)的盒型图。
直接打代码惨不忍睹
(这个是par没关好就按了)
生成不带水平轴线的盒型图,并把标签改成小体字,以适当的角度放在盒型图下面
用这个代码可以生成此效果
axes = FALSE令boxplot函数画出的盒型图没有轴线
ylim指定垂直轴的上限和下限
之所以下限要设定在-3是因为要给下边的标签留下空间
axis函数画一个轴。
第一个参数2画出左边的垂直轴
at参数指定刻度记号的位置
text命令把所有标签放置在适当的坐标出
cex参数指定字体大小(默认值是1)
str定义角度
我们要不断试验这些值以找到最合适的位置
如何建造一个给每个观察点标出样本容量(或任何你想标的冬冬)的盒型图
1. 第一步是求出代表样本容量的向量
你可以看到用了tapply, length 求的
2. 生成一个盒型图,但这时还没有放样本容量
老代码
3. 找到你想要放样本容量数字在图上的位置
先把盒型图的数值输出存到一个变量中
其子变量stats
第二行包含所有海滩的下四分位数
第四行显示所有海滩的上分位数
其中点的纵坐标表示方法即为如图所示
4. 用text在正确的位置输入样本容量的数字
横坐标为1:9
纵坐标为刚才输出的那个向量
对于长的字符,你可能需要把文本旋转90度
克里夫兰点图
什么是克利夫兰点图?
我觉得果蝇数据蛮适合的
x轴显示某种属性如长度
y轴表观察数量
第一个观察值在y轴的底部
然后向上积累,点越密集就越多。
y轴可以添加多个变量的分组,如性别,调查性别还有其它因素对身高的影响
如何确定数据是否能用克利夫兰点图
1.数据集里的连续变量是否存在离群值,若存在则可以用
2. 存在一个非连续变量,如性别
这时身长对性别的可视化是有用的。
如果这些变量之间是相关的很难说明哪个变量是重要的,这种情况被称为共线性。
生成克里夫兰点图,并输入一个参数(顺便教你如何抠出数据中的NA哦)
可以看出是用dotchart函数来生成的
其实只输入一个向量变量就能生成克利夫兰点图
接下来输入参数
此函数不能识别缺失值...
有缺失值就会有以上错误
Deer$Sex
移除缺失值
生成一个NA为TRUE的布尔向量
!Isna把TRUE和FALSE反过来...变成了一个专门抠掉NA位置的布尔向量
所以[]选定以后会抠出所有NA
我们可以看到因子变量是由groups =参数录入的
大功告成
设置一个对比的克利夫兰点图
在第一个dotchart前输入par(mfrow = c(1,2)
生成一个有均值的克利夫兰点图,而且附带下角标(图例)!(应用于任何图!)
其实添加均值是dotchart中的一项参数...
gdata =
g代表分株
其用来覆盖一个摘要统计量比如中位数,均值
gpch可以调节?
legend函数用于添加图例
plot函数
观察一个函数可以利用的方法: method()
所有这些都是存在的绘图函数,并且只是默认包里可利用的函数。
所有的这些函数可以通过plot函数访问。
例如我想做一个主成分分析(PCA)并想打印结果,是不需要使用plot.princomp的
因为plot函数会识别你进行的一个主成分分析的行为,并调用适当的绘图函数。
生成盒型图的参数输入形式
plot 函数生成盒型图,因为plot函数输入的参数:Benthic$Richness ~ Benthic$fBeach 是会被识别为生成盒型图
若输入的参数是个数据框,其会生成多组图。
详见?plot.factor
生成散点图的参数输入形式
x = , y =
plot函数额外的选项
abline函数添加一条线
lm函数
利用线性回归建立物种丰富度作为平均涨潮水平的函数的模型,结果储存在列表MO
abline函数
添加拟合线
只有单个解释变量时才工作
只有abline函数在plot函数后才执行
plot函数内的参数
实例
用xlim 和 ylim设置变量的取值范围
生成一个没有坐标轴线的散点图
可以见到其选了axes = FALSE
Type = ”n"生成没有点的,只有标签的空白窗口(隐形点)
之后points函数将点添加在仅有标签的空白窗口上
在执行points之前必须执行plot,否则会出错
修改y轴的坐标轴刻度和x轴的特征字符串。 (先生成一个没有轴线和点的图形设备,再用points画点。)
前面就是生成个没有轴线的图,然后底下的axis代码来加自己DIY的axis
axis函数
axis(2, at = c(0, 10, 20), tcl = 1)
第一个参数2意思就是画垂直轴线
命令画垂直轴线并在0,10,和20处插入长度为1(缺省值为0.5)的刻度标记
axis(1, at = c(-1.75, 0,2), labels = c("Sea", "Water line", "Dunes"))
第一个参数1意思是画水平的轴线
在值-1.75,0和2处添加特征字符串海洋,水线和沙丘。
?axis可以得到更多图形设备
main
在图形上添加一个标题
xlab,ylab
在x轴和y轴添加标签
xlim,ylim
设置轴的上下限
参数必须具有的形式是c(x1,x2), 其中x1,x2是数值。
log
Log="x", log="y", log = "xy"生成对数轴
type
Type = "p", "l", "b", "o", “h", "s", "n"用于绘图点,线,由线连接的点,线连接并覆盖点,从点到坐标轴的垂直线,阶梯线,只有坐标轴
增加额外的点,文本和线
par函数
用?par查看帮助文件
points函数
在一个图形上添加新值,比如x值和(可选的)y值
缺省情况下,函数绘制点
type参数设置
"p"(缺省设置)
点
"l"
线
“o”
连接并覆盖点的线
“b"
点和线
“s"和”S"
阶梯线
“h"
垂直线
”n"
没有点和线的图形设备
pch参数可以改变点的符号
text函数
使用x和(可选)y的坐标但加上一个在图形指定位置的包含标签字符串的标签向量。
调整字符串在图形上位置的额外工具
pos
表示位置在指定坐标点下,左,上,右方(分别为1,2,3,4)。
offset
使标签偏移指定坐标的量与一个字符宽度成一定比例。
这两个选项与长的特征字符串有关,因为他们不能在R的缺省设置里正确的显示。
lines函数
col
color
整数
lty
线形状
整数
lwd
线宽度
默认值是1
使用type = "n"创建一个空的模板
利用plot函数时,它可以包括属性 type = "n" 以绘制除数据以外的所有事情。
除去剩余的坐标轴还有它们的标签, 什么都不显示
axes = FALSE
xlab = ""
ylab = ""
但是 除去了所有后,图形保留了plot函数在第一部分输入的数据。
在这个空白上,现在我们可以利用plot函数的缺省设置来构建图形
abline
添加一个a,b(截距,斜率)线,主要是回归,但也有垂直和水平线
arrows
添加一个箭头并修改顶端类型
Axis
在图形上添加一个坐标轴的一般函数
axis
添加坐标轴线
box
添加不同类型的盒子
contour
生成等高线,或者在已有的图形上添加等高线
curve
根据相应的函数或者表达式绘制一个曲线
grid
给一个图形添加栅格
legend
给一个图形添加图例
lines
添加线
mtext
在图形空白处或者绘图设备空白处插入文本
points
添加点,但是可以包含type命令
polygon
利用x和y定义的顶点绘制多边形
rect
绘制长方形
rug
对图形的两个坐标轴之一添加一维数据表示
Segments
添加线片段
text
在图内添加文本
title
添加标题
添加图例
代码例子
>legend("bottomright", c("values", "mean"),
pch = c(1, 19), bg ="white")
第一个属性
定义了x和y的坐标
其它可用的表达式: "bottom", "bottomleft", "left", "topleft", "top", "topright", "right", "center"
详见?legend
c()
次参数定义了legend的内容
cex指定图例中文本的大小
bty定义围绕图例的框的大小
bty默认是1,很大
调成0.5比较好,否则挡数据
pch是点的形状
19是实心点
1是空心点
一次加5条线和5个图例
识别点
identify函数
输入identify函数的后果
将鼠标放在点附近并左击,R将在点附近绘制标签数目
按下Esc取消这个过程
也可使用identify函数得到某个点的样本数
详见?identify
identify函数只对plot函数生成的图形起作用,不对盒型图,点图,条形图,饼图或者其它的图形起作用
改变字体和字体大小
修改绘图函数自带的属性
字体:pointsize
”scans“表示scansserif字体
“serif”表示serif字体
“mono”表示monospace字体
“symbol”表示symbol字体
输入windowsFonts()可以查看当前已安装的字体类型
字形:form
1对应纯文本
2对应粗体
3对应斜体
4对应粗斜体
例子:在图中添加一个serif字体的标题
title("Bird abundance", cex.main = 2, family = "serif", font.main = 1)
绘制鸟类丰富度为标题,字体大小为默认大小两倍,serif字体
我们也可以对text, mtext, axis, xlab 和 ylab 改变字体和大小
详见?par
添加特殊符号
paste命令使delta^15和N结合,并且expression函数插入delta^15N
通过demo(plotmath)来了解更多关于函数expression的信息
其它有用的函数
plot.new
win.graph
windows
saveplot
locator
range
matplot
persp
cut
split
多组图(真心强)
即:多个连续变量的散点图
方法1.先用plot函数通过绘制1对2,1对3,1对4等完成, 并接着用mfrow和mar把它们都绘制在单个图形里。
方法2.函数pairs可以用来生成多面板散点图
图形的第一行包含所有变量对于物种丰富度的图形
从统计观点来讲,只有第一行和第一列是有效的,因为我们想建立丰富度和其它变量的模型,其它的模式都是不清楚的
剩余的图形显示的是所有变量对应于其它的其中一个变量的图形
你可以看到用对角线显示变量名称是很科学的...,上方下方是对应x轴,左方右方对应y轴
这里表示对除了包含标签的第一列画散点图....
面板函数
输入?pairs你会看到两个面板函数:panel. cor和panel. hist
这两个函可以生成扩展的多组图,如对角线下方显示系数...
协同图/条件图
什么是协同图?
可以显示三向或四向关系
特别适合于观察当给定其它预测变量时,反应变量如何根据一个预测变量变化。
函数coplot
单个条件变量的协同图
解读方法:第一行是第1-3个海滩,第二行对于4-5个,第三行对应第5-6个。
as.factor就是指作为条件变量的海滩数,一共9个海滩,其在上方一个独立的面板中成为dependence panel
该函数与plot参数输入不同
被绘制的变量:
因变量(y)~自变量(x)
(而plot是第一个位置是x,第二个位置是y)
用~连接因变量(左边)和自变量(右边)
条件变量
|as.factor(Beach)
as.factor是将变量Beach转化为因子
data属性
data = Benthic
其实把benthic数据框作为变量在公式中使用
若用连续型变量做条件变量呢?
左下面板是粒径值在185到220之间的条件下丰富度对NAP的散点图。
右上面板是在粒径取较大值(>315)的条件下丰富度对NAP的散点图。
若Richness和NAP的关系随着粒径梯度改变,会暗示NAP与粒径之间有交互作用
粒径值被分为点的数目近似相等的六个重叠的组。
若我们想在每个面板上加上一条回归线?
增加回归线上,我们就能观察斜率理解变量的交互作用
可以看到是通过修改panel参数,其定义在每个面板里如何显示数据
panel.lm
最后三个点表示该函数可以运行其它参数。
线性回归函数lm用来把数据暂时储存在变量tmp中,这个分析中任何NAs将被忽略。
函数abline绘制线
函数points绘制点
panel.smooth
另一个预先定义的panel函数
其使用LOESS平滑项添加一个平滑线
我们还可定义自己的panel函数,例如均值和置信限可以加到每个面板,而且置信限可以加到回归线上
Coplot是研究大量数据中每个组合变量的很好的工具。
详情见?coplot
coplot函数的有用参数
通过?coplot来查看
panel
在每个面板上显示函数的执行结果
我们可以借机插入我们想要的函数
多个条件变量的协同图
因为变量LOGAlt是海拔的对数变换,所以它是数值型,它被分成一列条件区间,并且,对于每一个区间,绘制pH对于SDI的图形。
另外给予森林覆盖因子被分割为数组。
其实这个就是一个有计划的多组图!
如果线的斜率不同,你需要在回归模型里加上一个交互项
探讨pH和SDI(Sodium dominance Index),由海拔值和森林覆盖度的影响
将海拔进行了对数变换。
使用了之前的panel.lm函数.生成了回归线,在这里没显示。
上边用了number参数将上边的变量面板的区间数调整为2
LOGAlt区间的数目和位置还可以通过参数given.values控制,详见?coplot
如果没有这个语句,数值变量被分为6个重叠部分大约为50的区间。
调节可以避免图过稠密。
增加协同图的修饰
我们想把温度在平均值以上的用浅灰色表示,温度在平均值以下的用黑点表示。
这些代码生成了一个包含灰色的新变量
breaks=2,所以cut函数把温度数据分为两部分。
这是cut函数的输出结果...
其输出是个因子
所以我们下一行代码把因子转换成了数值,其就可以作为色彩或灰度值
as.numberic将那个因子转化成了一个只有1,2的向量
当forest = 2(2表示没有森林覆盖,1表示森林覆盖), 具有较低的SDI值以及温度在平均值以上时可以得到高的pH值。
函数gray的输入必须在0到1之间
越接近1越灰,1就是纯白
组合不同类型的图
我们之前的所有图都是通过底层包graphic来实现的
mfrow命令在一个屏幕上绘制多个图形
grid的R包能提供更多的功能。
其可以在单个图形里组合不同的图
用layout生成复杂的图形排列。
以上的图是通过左边代码生成的
一开始生成一个,第一行元素为2和0,第二行元素为1和3的矩阵
在layout函数中使用这个矩阵
mat参数是选矩阵
矩阵的数字代表“第几个图”
0是没有图画在那
矩阵的位置代表那个图显示的位置
widths参数规定了相对宽度。
如这里widths = c(3,1)就是指第一列相对宽度是3,第二列相对宽度是1.
heights参数指定相对行高。
原理同上
respect = TRUE确保垂直方向上的一个单位与水平方向上的一个单位相等。
查看生成的布局
layout.show(nf)
剩余的代码就是生成这3个图形填充进去
确保面板2的盒型图范围与面板1的水平轴的范围一致
使面板3的范围与面板1的垂直轴范围一致。
消去图和图直接的空白
对每幅图的mar值进行多次试验以避免错误
还有可以用split.screen, 详见?split.screen.
is.函数
是的话就输出TRUE,不是的话就输出FALSE
这个比布尔向量的优势是NA值可以被勾出去
如何“抠出”,而不是抹掉某一数值
改变所有的某种数值其实很简单[!=Na]?,可能没效果
as.函数
不是也给你转成之后的东西
作图的基本逻辑
算出作图所需要的数据,再作图
就像excel