本文摘要
以后的文章都会加入这个摘要部分,这样就可以直接看到文章中有没有想看的问题了。
吐槽一下,格式问题真的搞得我好累,哎 可爱可恨的markdown…
问题
1. 画图的时候,明明设置了x轴y轴的范围,为什么坐标轴的长度还是会多出一块呢?
失败案例:plot(runif(10,0,10),type="l",xlim=c(0,10),ylim=c(0,10))
![图片名称](https://img-blog.csdnimg.cn/20200608010054369.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3B0eXAyMjI=,size_5,color_FFFFFF,t_70#pic_center)
2. 想使原点在图中间或使坐标在图中间交汇,应该咋整捏?
错误示例:plot(-10:9,runif(20,-10,10),type="l",xlim=c(-10,10),ylim=c(-10,10))
![图片名称](https://img-blog.csdnimg.cn/20200608010609994.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3B0eXAyMjI=,size_16,color_FFFFFF,t_70#pic_center)
期望的效果:
![图片名称](https://img-blog.csdnimg.cn/20200608123635783.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3B0eXAyMjI=,size_16,color_FFFFFF,t_70#pic_center)
3. 坐标轴上的label朝向应该怎么旋转呢?或者说 参数las应该怎么设置呢?
解决方案
1. 使用 xaxs/yaxs=“i”
在R中默认会画出增加4%的坐标轴,如果想画出正好是xlim或ylim的长度,可以使用 xaxs/yaxs="i"
示例代码: plot(runif(10,0,10),type="l",xlim=c(0,10),ylim=c(0,10),yaxs="i",xaxs="i")
![图片名称](https://img-blog.csdnimg.cn/20200608125429801.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3B0eXAyMjI=,size_16,color_FFFFFF,t_70#pic_center)
2. 用axis()重制坐标轴
为了完成问题2的任务,我们需要在原图的基础上重新画坐标。
简单的介绍以下几个函数及概念。
- 低级画图函数: 需要在已有图/画布上才能发挥作用的函数,例如:rect(), text(), lines()…
区分低级画图函数与画图函数:函数中带plot四个字母的就肯定不是低级的!例如xyplot(), boxplot(),barplot()… - axis(): 画坐标轴的低级函数,可以最大程度的实现坐标轴自定义效果。
- plot.new(): 用于创建新画布。在创建新画布后,低级函数就可以发挥作用了。
(故低级函数只能搭配plot.new()使用,或者是与已有的plot搭配进行图的再加工) - plot.window(): 定义画布的坐标系统,参数必须包括 xlim/ylim。该函数一般和plot.new()搭配使用。
Ps: 若只使用plot.new()而不用plot.window(),则会创建 坐标系统则为xlim=ylim=c(0,1)的单位画布
Ps2: 为了便于理解,我才引入“画布”这个词,这并不是一个官方的叫法,事实上我并不清楚这个东西到底是怎么称呼。。
了解了以上内容之后,可以想到将坐标原点放在画布中间这个任务可以使用
- 新建画布
- 定义坐标系统
- 绘制坐标轴
- 绘制图案
这样的流程来完成。
代码实现:
plot.new()
plot.window(xlim=c(-10,10),ylim=c(-10,10))
lines(-9:9,runif(19,-10,10),col="red")
axis(1,pos=0)
axis(2,pos=0)
![图片名称](https://img-blog.csdnimg.cn/20200608123635783.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3B0eXAyMjI=,size_16,color_FFFFFF,t_70#pic_center)
3. 使用参数las
在上图中,坐标轴的label是不是相当难受了,应该如何旋转它呢?
这里我们用到的是参数las, 他有四个值可选:0,1,2,3。
更具体的讲,我把它分成了两个部分。
las=1及las=3:表现的是标签的绝对状态:las=1 为竖直,las=3为水平
![图片名称](https://img-blog.csdnimg.cn/20200608143540967.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3B0eXAyMjI=,size_16,color_FFFFFF,t_70#pic_center)
las=0及las=2:表现d的是标签相对坐标轴的方向:
las=0为标签垂直与坐标轴,las=2为标签平行于坐标轴。
![图片名称](https://img-blog.csdnimg.cn/2020060814364491.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3B0eXAyMjI=,size_16,color_FFFFFF,t_70#pic_center)
另:附上图的代码
# 第一组
par(mfrow=c(1,2))
par(mai=c(0.5,0.4,0.4,0.2))
plot(0:5,las=1,ann=F)
title(main="las=1")
par(mai=c(0.4,0.4,0.4,0.2))
plot(0:5,las=3,ann=F)
title(main="las=3")
#第二组
par(mfrow=c(1,2))
par(mai=c(0.5,0.4,0.4,0.2))
plot(0:5,las=0,ann=F)
title(main="las=0")
par(mai=c(0.5,0.4,0.4,0.2))
plot(0:5,las=2,ann=F)
title(main="las=2")
回到上面问题二的图,怎么能让原点在中间的坐标轴更加美观呢?
- 使用axis()中的at参数, 将坐标轴的标签位置固定
plot.new()
plot.window(xlim=c(-10,10),ylim=c(-10,10))
lines(-9:9,runif(19,-10,10),col="red")
axis(1,pos=0,at=c(-10,-5,5,10))
axis(2,pos=0,at=c(-10,-5,5,10),las=1)
![图片名称](https://img-blog.csdnimg.cn/2020060814024978.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3B0eXAyMjI=,size_16,color_FFFFFF,t_70#pic_center)
- 当然,标签内容可用labels参数进行自定义
plot.new()
plot.window(xlim=c(-10,10),ylim=c(-10,10))
lines(-9:9,runif(19,-10,10),col="red")
axis(1,pos=0,at=c(-10,-5,5,10),labels=c("Day 1","Day 2","Day 3","Day 4"))
axis(2,pos=0,at=c(-10,-5,5,10),las=1)
![图片名称](https://img-blog.csdnimg.cn/2020060814022214.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3B0eXAyMjI=,size_16,color_FFFFFF,t_70#pic_center)