一图胜千言。
这里是佳奥!终于到了我最期待的图形初阶篇。
本篇我们将学习如何创建和保存图形,并关注于图形的一些特征:图形的标题、坐标轴、标签、颜色、线条、符号和文本标注等。
1 使用图形
首先绑定数据框,生成散点图,再添加最有拟合曲线,最后添加标题,解除绑定。
要导出图片为pdf的话在代码头尾添加:
以上代码会将图形保存在工作目录名为mygraph.pdf的PDF文件中。
当然,除了pdf( ),还可以使用函数win.metafile( )、png( )、jpeg( )、bmp( )、tiff( )、xfig( )和postscript( )将图形保存为其他格式。
当然,也有符合Windows的图形化操作方法。
在R Studio里可以直接:
当我们执行命令多了以后,使用函数plot( )、hist( )等绘制的图就会后面覆盖前面的。如何创建多个图形并随时查看每一个呢?
方法一:在创建一副新图形之前打开一个新的图形窗口。
方法二:使用函数dev.new( )、dev.next( )、dev.prev( )、dev.set( )和dev.off( )同时打开多个图形窗口,并选择将哪个输出发送到哪个窗口中。
R的图形参数可以让我们指定字体、颜色、线条类型、坐标轴、参考线和标注。
当前还是聚焦于R自带的图形包,至于更多包的操作会在以后的学习中详细展开。(挖坑ggplot2)
方法三:在R Studio中可以直接按箭头.......
2 一个简单的例子
先从一个假象数据开始,描述了病人对两种药物五个剂量水平上的响应情况。
剂量对药物A响应对药物B响应
输入数据:
使用以下代码创建一幅描述药物A的计量和相应关系的图像:
plot( )是R中为对象作图的一个泛型函数(它的输出将根据所绘制对象类型的不同而变化)。
本例中,plot(x, y, type="b")将x置于横轴,将y置于纵轴,绘制点集(x, y),然后使用线段将其连接。选项type="b"表示同时绘制点和线。
3 图形参数
修改图形参数的一种方法是通过函数par( )来指定这些选项。
以这种方式设定的参数值除非被再次修改,否则将在会话结束前一直有效。
调用格式:par(optionname=value, optionname=name,…)。
不加参数地执行par( )将生成一个含有当前图形参数设置的列表。添加参数no.readonly=TRUE可以生成一个可以修改的当前图形参数列表。
还是继续刚才的例子吧,如果想修改空心圆成实心三角形,用虚线代替视线来进行连接,使用以下代码:
对于函数par( ),有以下用法:
第二种方法是为高级绘图函数直接提供optionname=value的键值对。
这种情况下,指定的选项仅对这幅图形本身有效。具体代码:
也可以达到一样的效果。但并不是所有的高级绘图函数都允许指定全部可能的图形参数。需要参考每个特定绘图函数的帮助(如?plot、?hist或?boxplot)。
3.1 符号和线条
我们还可以使用图形参数来指定绘图的符号和线条类型:
选用pch=指定绘制点的符号,可用的值如下所致:
另外,符号21-25还可以指定边界颜色(col=)和填充颜色(bg=)
选项lty=用于指定想要的线条类型:
综上所述,我们可以使用以下代码:
将图片修改为,线条类型点线,宽度为默认宽度的3倍,点的符号为实心正方形,大小为默认符号大小的2倍。
接下来就是颜色了。
3.2 颜色
当然,在R中可以通过颜色下标、颜色名称、十六进制的颜色值、RGB值或HSV值来指定颜色。
举例来说,col=1、col="white"、col="#FFFFFF"、col=rgb(1,1,1)和col=hsv(0,0,1)都是表示白色的等价方式。
函数rgb( )可基于红—绿—蓝三色值生成颜色,而hsv()则基于色相—饱和度—亮度值来生成颜色。
函数colors( )可以返回所有可用颜色的名称。
在R中也有多种用于创建连续型颜色向量的函数。如rainbow( )、heat.colors( )、terrain.colors( )、topo.colors( )以及cm.colors( )。
举例来说,rainbow(10)可以生成10种连续的“彩虹型”颜色。多阶灰度色可使用gray( )函数生成。这时要通过一个元素值为0和1之间的向量来指定各颜色的灰度。
gray(0:10/10)将生成10阶灰度色。
例如:
mycolors和mygrays将分别生成这两个图:
3.3 文本属性
下列参数为控制文版大小,字体和字样也可以通过字体选项控制:
指定字体族、字号和字样的参数:
执行一个语句:
之后创建的所有图形都将拥有斜体、1.5倍于默认文本大小的坐标轴标签(名称),以及粗斜体、2倍于默认文本大小的标题。
对于字体族的设置,在Windows中可以通过函数windowsFont( )来创建映射:
之后,即可使用A、B和C作为family的取值。
在本例的情境下,par(family="A")将指定Arial Black作为绘图字体。
如果输出PDF格式,修改字体族会简单一些。可以使用names(pdfFonts( ))找出你的系统中有哪些字体是可用的,然后使用pdf(file="myplot.pdf", family="fontname")来生成图形。
3.4 图形尺寸与边界尺寸
代码:
可生成一幅4英寸宽、3英寸高、上下边界为1英寸、左边界为0.5英寸、右边界为0.2英寸的图形。
我们通过以上的代码来做一个总结:
补充:通过par( )设定的参数对两幅图都有效,而在绘图函数中指定的参数仅对那个特定图形有效。
接着我们要了解如何自定义文本标注和坐标轴。
4 添加文本、自定义坐标轴和图例
不止图形参数,许多高级绘图函数(plot、hist、boxplot)也允许自行设定坐标轴和文本标注选项。
举例:以下代码在图形上添加了标题main、副标题sub、坐标轴标签xlab、ylab并指定了坐标轴范围xlim、ylim
补充:并非所有函数都支持这些选项。
4.1 标题
可以使用title( )函数为图形添加标题和坐标轴标签。格式为:
函数title( )中亦可指定其他图形参数(如文本大小、字体、旋转角度和颜色):
4.2 坐标轴
使用函数axis( )来创建自定义的坐标轴,而非使用R中的默认坐标轴。格式:
重要的一点:创建自定义坐标轴时,应当禁用高级绘图函数自动生成的坐标轴。
参数axes=FALSE将禁用全部坐标轴(包括坐标轴框架线,除非你添加了参数frame.plot=TRUE)。
参数xaxt="n"和yaxt="n"将分别禁用X轴或Y轴(会留下框架线,只是去除了刻度)。
下面是一个综合的例子:
大功告成。
使用plot( )语句可以新建一幅图形。
而使用lines( )语句,你可以为一幅现有图形添加新的图形元素。
函数mtext( )用于在图形的边界添加文本。
次要刻度线
我们上述创建的图形都只拥有主刻度线,却没有次要刻度线。
要创建次要刻度线,需要使用Hmisc包中的minor.tick( )函数。代码如下:
nx和ny分别指定了X轴和Y轴每两条主刻度线之间通过次要刻度线划分得到的区间个数。
tick.ratio表示次要刻度线相对于主刻度线的大小比例。
当前的主刻度线长度可以使用par("tck")获取。
举例:下列语句将在X轴的每两条主刻度线之间添加1条次要刻度线,并在Y轴的每两条主刻度线之间添加2条次要刻度线,且次要刻度线的长度将是主刻度线的一半。
4.3 参考线
函数abline( )可以用来为图形添加参考线。
使用格式为:
函数abline( )中也可以指定其他图形参数(如线条类型、颜色和宽度)。举例来说:
在y为1、5、7的位置添加了水平实线。
则在x为1、3、5、7、9的位置添加了垂直的蓝色虚线。
4.4 图例
图形数据不止一组时,图里可以帮助识别出各区域代表的数据。可以使用函数legend( )来添加图例:
更多的常用图例包括用于指定盒子样式的bty、指定背景色的bg、指定大小的cex,以及指定文本颜色的text.col。
指定horiz=TRUE将会水平放置图例。更多细节参考help(legend)。
下面是一个综合例子:
按理来说这就结束了,但是我在R上现实的图例却是这样的:
第一次添加的图例是下面那个,很大,而且输出成图片也是这么大,我把代码复制了一遍,就添加了一个正常大小的图例。
emmmm是哪里出了问题,,,
排查了代码问题,我重启了一次R,然后复制代码,终于:
它就画出来了,好耶。(算是解决了吧)
哇在这里卡了很久,那么继续后面的学习吧。
4.5 文本标注
可以通过函数text( )和mtext( )将文本添加到图形上。
text( )可向绘图区域内部添加文本,而mtext( )则向图形的四个边界之一添加文本。
函数text( )和mtext( )的选项:
其他常用的选项有cex、col和font(分别用来调整字号、颜色和字体样式)。
除了用来添加文本标注以外,text( )函数也通常用来标示图形中的点。
我们只需指定一系列的x, y坐标作为位置参数,同时以向量的形式指定要放置的文本。x、y和文本标签向量的长度应当相同:
做出的图如上。我们针对数据框mtcars提供的32种车型的车重和每加仑汽油行驶英里数绘制了散点图。函数text( )被用来在各个数据点右侧添加车辆型号。各点的标签大小被缩小了40%,颜色为红色。
下一个示例是展示不同字体族的代码:
为了获得更好的显示效果,我们使用par( )函数增大了字号。
数学标注
最后,还可以使用类似于TeX中的写法为图形添加数学符号和公式。参阅help(plotmath)以获得更多细节和示例。
要即时看效果,可以尝试执行demo(plotmath)。
函数plotmath( )可以为图形主体或边界上的标题、坐标轴名称或文本标注添加数学符号。
部分演示效果如下:
最后,我们将讨论将多幅图形组合为一幅图的方法。
5 图形的组合
在R中使用函数par( )或layout( )可以容易地组合多幅图形为一幅总括图形。
可以在par( )函数中使用图形参数mfrow=c(nrows, ncols)来创建按行填充的、行数为nrows、列数为ncols的图形矩阵。
另外,可以使用nfcol=c(nrows, ncols)按列填充矩阵。举例:
如图为par(mfrow=c(2,2))组合的四幅图形。
第二个示例:
需要注意的是,高级绘图函数hist( )包含了一个默认的标题(使用main=""可以禁用它,抑或使用ann=FALSE来禁用所有标题和标签)。
函数layout( )的调用形式为layout(mat),其中的mat是一个矩阵,它指定了所要组合的多个图形的所在位置。
在以下代码中,一幅图被置于第1行,另两幅图则被置于第2行:
上图为使用函数layout( )组合的三幅图形,各列宽度为默认值。
为了更精确地控制每幅图形的大小,可以有选择地在layout( )函数中使用widths= 和heights= 两个参数。
其形式为:widths = 各列宽度值组成的一个向量。heights = 各行高度值组成的一个向量。相对宽度可以直接通过数值指定,绝对宽度(以厘米为单位)可以通过函数lcm( )来指定。
下个代码中,我们再次将一幅图形置于第1行,两幅图形置于第2行。
但第1行中图形的高度是第2行中图形高度的三分之一。除此之外,右下角图形的宽度是左下角图形宽度的四分之一:
上图为使用函数layout( )组合的三幅图形,各列宽度为指定值。
综上所述,layout( )函数能够轻松地控制最终图形中的子图数量和摆放方式,以及这些子图的相对大小,更多具体参考help(layout)。
图形布局的精细控制
有些时候,如果想通过排布或叠加若干图形来创建单幅的、有意义的图形,这需要有对图形布局的精细控制能力。
可以使用图形参数fig= 完成这个任务。
下列代码通过在散点图上添加两幅箱线图,创建了单幅的增强型图形:
上图为边界上添加了两幅箱线图的散点图。
关于这幅图的绘制原理,请试想完整的绘图区域:
左下角坐标为(0,0),而右上角坐标为(1,1)。
参数fig= 的取值是一个形如c(x1, x2, y1, y2)的数值向量。第一个fig= 将散点图设定为占据横向范围0~0.8,纵向范围0~0.8。
上方的箱线图横向占据0~0.8,纵向0.55~1。
右侧的箱线图横向占据0.65~1,纵向0~0.8。
fig= 默认会新建一幅图形,所以在添加一幅图到一幅现有图形上时,请设定参数new=TRUE。
例子中将参数选择为0.55而不是0.8,这样上方的图形就不会和散点图拉得太远。类似地,选择参数0.65以拉近右侧箱线图和散点图的距离。这需要不断尝试找到合适的位置参数。可以使用图形参数fig= 将若干图形以任意排布方式组合到单幅图形中,稍加练习,我们就可以通过这种方法极其灵活地创建复杂的视觉呈现。
使用图形参数fig= 指定位置
值得注意的是,各独立子图所需空间的大小可能与设备相关。如果遇到了“Error in plot.new(): figure margins too large”这样的错误,尝试在整个图形的范围内修改各个子图占据的区域位置和大小。我遇到过几次,改变窗口大小重新键入代码运行就可以解决。
6 小结
这一篇是对前面所有内容的总结与提高。主要研究的是关于如何修改R绘制的默认图形,以得到更加有用或更吸引人的图形。
我们学习了如何修改一幅图形的坐标轴、字体、绘图符号、线条和颜色,以及如何添加标题、副标题、标签、文本、图例和参考,看到了如何指定图形和边界的大小,以及将多幅图形组合为实用的单幅图形。
先前的一篇我们讨论了将数据导入R的方法,但是现实情况是很多数据都不能以直接可用的格式出现,下一篇我们将关注如何进行数据转换以及修改成更有助于分析的形式。我们下一篇再见!