【R实战 入门】三、图形初阶

一图胜千言。

这里是佳奥!终于到了我最期待的图形初阶篇。

本篇我们将学习如何创建和保存图形,并关注于图形的一些特征:图形的标题、坐标轴、标签、颜色、线条、符号和文本标注等。

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的方法,但是现实情况是很多数据都不能以直接可用的格式出现,下一篇我们将关注如何进行数据转换以及修改成更有助于分析的形式。我们下一篇再见!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容