不得不说的小心情哇
哇唔,开启分享的第二天,虽然都是代码的搬运工,但是,分享也是一种乐趣。再一次感谢大鹏。
快捷键
箭头赋值党的福利啊,表白==>Alt+_;
没有一个好记性,求助==>Tab帮你自动搜寻字母打头的函数;
实现在脚本面板和Console面板自由切换:Ctrl+1和Ctrl+2;
快捷键大全(估计不会看系列)==>Alt+Shift+K;
无意间点击成了Ctrl+Shift+r自动在你Rstudio,当前脚本面插入了节,惊不惊喜,意不意外,哈哈哈;
新建脚本:Ctrl+Shift+n;
批量替换(大爱):Ctrl+Alt+Shift+m
傻傻分不清楚,对不对,对就对了。手动微笑。。。。。
正经开始今天的记录了
昨天的数据再来一遍
> mydata2 <- as.data.frame(t(matrix(
+ co2,12,
+ dimnames = list(month.abb,unique(floor(time(co2)))))))
> #在数据上多增加一列year,将行名转为数值型
> mydata2$year<-as.numeric(rownames(mydata2))
#plot()画图,若数据为一维,则数据实际值对应纵坐标,序号对应横坐标
plot(mydata2$Sep)
#除F1,进行help外另一个好帮手example()
example(plot)
#二维散点图
plot(x=mydata2$year,mydata2$Sep)
#数据是多少变量名,就是变量与变量之间的散点图
plot(mydata2)
#此时类似于pairs(mydata2)
#像excel那样地查看数据
View(mydata2)
小助理三剑客:F1、sample()、demo()
demo()示范的函数有限,demo()运行后显示的是能示范的函数
常用画图函数
函数 | 用途 |
plot() | 主要用作散点图 |
pairs() | 散点图矩阵 |
symbols() | 气泡图 |
hist() | 直方图 |
curve() | 函数曲线图 |
barplot() | 柱状图 |
boxplot() | 箱线图 |
coplot() | 条件散点图 |
dotchart() | 点图(克利夫兰点图) |
stripchart() | 一维散点图 |
image() | 矩阵方格图 |
contour() | 等高线图 |
plot()函数
x,y分别表示横纵轴数据,
xlab=,ylab=,来定义横纵坐标轴标签,
main=,定义标题
type=,定义把数据画成点还是线,(可供选择的有p,l,b,c,o,h,s,S,n)
cex,(character expansion)点的尺寸
lty=,(line type )线的形状
pch=’ ',(point character)点的类型,可以自定义字母,或者是下面的数字
(图片来源于《学R》、《R图形化数据分析》)
总结:
先确定type
type=‘p’—>设置pch参数;type=‘l’—>设置lty参数。
R的颜色
- 关于R的所有颜色 http://www.stat.columbia.edu/~tzheng/files/Rcolor.pdf
- 当col=colors[n],对应的是n位置上的颜色,n的范围[1,657]
- 可以用colors()查看R中的657种颜色的名称
- 关于自带配色方案的函数:rainbow(n) 、heat.colors(n)、terrain.colors(n)、topo.colors(n)、cm.colors(n)、gray(n)、hcl(n)(>_< ) n表示的是将对应颜色分为多少n份**
将数据进行三维展示
#将数据降维
myco2 <- unlist(mydata2[,1:12])
#为了简化操作,对浓度四舍五入
myco2 <- round(myco2)
#用向量myyear存储第二个维度
myyear <- rep(mydata2$year,12)
#用向量mymonth存储第三个维度
mymonth <- rep(1:12,each=nrow(mydata2))
#三个维度的数据准备完毕
#n根据浓度范围,确定的颜色种数
n <- diff(range(myco2))
mycolor <- rainbow(n)[myco2-min(myco2)+1]
#画图
plot(x=mymonth,y=myyear,col=mycolor,cex=10,pch=15)
按照横轴是浓度的月变化,纵轴式浓度的年变化,颜色越偏紫,浓度越大,浓度越偏红,浓度越小。
#练习3.1
mydata2$mean <- apply(mydata2,FUN = mean,MARGIN = 1)
plot(mydata2$year,mydata2$mean,type = 'p',pch=17,col='yellow',
xlab = 'year',ylab = 'mean',main = 'homework3.1')
添加直线、网格、图例
- abline()
plot(x=mydata2$year,mydata2$Sep)
abline(h=350)
abline(h=360,v=1980,col='red')
abline(h=seq(from=320,to = 340,by = 5),
v=seq(from=1970,to = 1990,by = 5),
col='gray')
abline(a=-2240,b=1.3)
分别向图中添加了三次直线, abline()参数中,h(horizontal)表示水平线,v(vertical)垂直线,两个参数可以同时存在。同时存在时,对线的颜色设置成浅灰色,就变成了网格线。
abline,“截距a和斜率b的直线”,也可以画斜线
3. legend()
位置的确定有三种,确定点的(X,Y)坐标、利用特殊位置的英文、定位
legend(x=1970,y=350,legend = 'Sep',pch = 1)
legend('topleft',legend = 'Sep',pch = 1)
legend(locator(1),legend = 'Sep',pch = 1)
**注释:**可以替换的位置名称为:bottomright”, “bottom”, “bottomleft”, “left”, “topleft”, “top”, “topright”, “right”, “center”(9种)
练习3.2作业
plot(x=mydata2$year,y=mydata2$Sep)
abline(h=seq(from=min(mydata2$Sep),to = max(mydata2$Sep),by = 10),
v=seq(from=min(mydata2$year),max(mydata2$year),by = 1),
col='grey')
多图合一:三种布局
多图合一可以达到对比的效果,使多条曲线共享一个x-y坐标系。
第一种
- Step1:plot()函数画出第一组y1曲线
- Step2:用lines()或points()添加第二组y2曲线
#基础plot()图,在ylab的表达式中,[]表示的是下标(如图)
plot(x = 1:12,y = mydata2['1959',1:12],
xlab = 'Month',ylab = expression(co[2]),
ylim = c(310,370),
type = 'l',lty=2,col='blue')
#points()和lines()函数添加曲线
lines(x = 1:12,y = mydata2['1997',1:12],
col='red')
#或者
points(x = 1:12,y = mydata2['1997',1:12],col="red",type = 'l')
第二种
- 副坐标轴
上图中年份变化不明显,现在采取同横坐标,不同纵坐标,也就是创建副坐标轴
#创建副坐标轴(一次表达不明的错误尝试)
plot(x = 1:12,y = mydata2['1959',1:12],
xlab = 'Month',ylab ='1959',
type = "l",lty=2,col='blue')
par(new=TRUE)
plot(x = 1:12,y = mydata2['1997',1:12],ylab = '1997',
type = 'l',lty=1,col='red')
#进入正餐
#1.告诉R在右侧为副坐标轴留出空间
par(mar=c(5,4,4,4))
#2.画第一张图
plot(x = 1:12,y = mydata2['1959',1:12],
xlab = 'Month',ylab ='1959',
type = "l",lty=2,col='blue')
#3.告诉R,下一张图跟第一张图叠加
par(new=TRUE)
#4.画在第二张图,但暂时不画坐标轴,也不加标签
plot(x = 1:12,y = mydata2['1997',1:12],
type = 'l',lty=1,col='red',axes = FALSE,
ylab = '',xlab = '')
#5.在右侧画出副坐标轴
axis(side = 4,col = 'red')
#6.为副坐标轴添加名称
mtext(side = 4,text = '1997',line = 3,col = 'red')
注释:
1.第一三条,par(mar=c())表示给下,左,上,右(顺时针)分别留白多少,par(new=TRUE)表示指定下一条作图命令跟上一条作图区域相同.
2.第四条plot()函数,axes=FALSE, 禁止显示默认的坐标轴.
3.第五条axis()仍然是设置坐标轴,此时自定义设置,side取值1,2,3,4.表示的是下,左,上,右(顺时针),该条命令表示在右侧画一条红色的坐标轴.
4.mtext(),添加文字,作为新坐标轴的标签,side的取值和含义同理.line表示文字与图表区的距离.
第三种
- 小图拼贴
par(mfrow=c()),mfrow表示(matrix of figures entered row-wise)将图按照几行几列进行展示
#按照一行两列一次进行画图
par(mfrow=c(1,2))
plot(x = 1:12,y = mydata2['1959',1:12],
xlab = 'Month',ylab ='1959',
type = "l",lty=2,col='blue')
plot(x = 1:12,y = mydata2['1997',1:12],
xlab = "Month",ylab = '1997',
type = 'l',lty=1,col='red')
保存图片
代码法
#代码法保存图片
#打开一张宽为8,高为4的白纸
pdf('F:/R lab/学R/r4r/fig2_13.pdf',width = 8,height = 4)
#在白纸上画图
plot(x = mydata2$year,y = mydata2$Jan)
#画完了,把纸张收起来
dev.off()
注释: pdf()函数将图片保存为pdf格式.还可以用png(),jpg()等
项目 | 内容 |
作图函数 | plot(), boxplot() |
点形状 | pch=1,pch=‘z’ |
线形状 | lty=2 |
颜色 | col = ‘blue’, rainbow(), colors() |
添加要素 | lines(), points(), abline(), axis(),box(),legend(), text(), mtext(), expression() |
多图布局 | par(), layout() |
保存图片 | pdf(), jpg(), png() |
不得不再一次表白大鹏,简洁明了
#练习3.3
x <- mydata2$year[1:6]
y <- mydata2$Sep[1:6]
#方案1:逐个画图
pdf('F:/R lab/学R/r4r/9in1.pdf')
par(mfrow=c(3,3),cex=1.2,mar=c(3,2,0.5,1))
plot(x = x,y = y,type = 'p')
legend('topleft',legend = 'p',
cex = 0.8,bty = 'n',text.col = 'blue')
plot(x = x,y = y,type = 'l')
legend('topleft',legend = 'l',
cex = 0.8,bty = 'n',text.col = 'blue')
plot(x = x,y = y,type = 'b')
legend('topleft',legend = 'b',
cex = 0.8,bty = 'n',text.col = 'blue')
plot(x = x,y = y,type = 'c')
legend('topleft',legend = 'c',
cex = 0.8,bty = 'n',text.col = 'blue')
plot(x = x,y = y,type = 'o')
legend('topleft',legend = 'o',
cex = 0.8,bty = 'n',text.col = 'blue')
plot(x = x,y = y,type = 'h')
legend('topleft',legend = 'h',
cex = 0.8,bty = 'n',text.col = 'blue')
plot(x = x,y = y,type = 's')
legend('topleft',legend = 's',
cex = 0.8,bty = 'n',text.col = 'blue')
plot(x = x,y = y,type = 'S')
legend('topleft',legend = 'S',
cex = 0.8,bty = 'n',text.col = 'blue')
plot(x = x,y = y,type = 'n')
legend('topleft',legend = 'n',
cex = 0.8,bty = 'n',text.col = 'blue')
dev.off()
#方案2:循环化简操作
pdf('F:/R lab/学R/r4r/9in1.pdf')
par(mfrow=c(3,3),cex=1.2,mar=c(3,2,0.5,1))
for (i in c('p','l','b','c','o','h','s','S','n')) {
plot(x = x,y = y,type = i)
legend('topleft',legend = i,
cex = 0.8,bty = 'n',text.col = 'blue')
}
dev.off()
#准备数据
mydatasub <- t(mydata2[as.character(
seq(1960, by = 5, length.out = 8)), 1:12])
x <- rep(1:12, 8)
y <- as.vector(mydatasub)
group <- rep(colnames(mydatasub), each = 12)
library(lattice)
xyplot(y ~ x|group, type = c('p', 'l'),
xlab = 'Month', ylab = expression(CO[2]))
library(ggplot2)
qplot(x, y, col = group, geom = c("point", "line"),
xlab = 'Month', ylab = expression(CO[2]))
注释:
- 函数
- seq(from=,to=,by=.length.out=n)length.out表示等差的个数
- t()转置,转置前,从mydata2中,将等差数列形成的数字,转为因子型,找到对应年份12个月的浓度,相当于subset()函数,subset(数据,条件,选择哪些变量进行展示) (但是我没试出来)
- 转换逻辑
- 因为要将年份作为X轴,所以需要将年份作为列来展示,在将矩阵(二维)降为向量(一维),默认一列一列进行展示.故用到t().
- 将数据拆散,维度必须都相等,比如,此案例中数据量是12x8, 因此对于年份或者月份重复时,务必保持数据量相等,在对年份或者月份进行重复,rep()函数参数设置中选择是times=,还是each=,要根据浓度展开的含义.
名称 | 作用 |
F1 | 展示函数的帮助信息 |
F2 | 演示函数源代码 |
tab | 提示和自动补全 |
example() | 函数示例,圆括号里填函数名 |
demo() | 演示,圆括号为空时查看所有可用演示 |
vignette() | 技术文档,vignette(all = TRUE)展示所有可用文档 |