查看原文
其他

R | 基础绘图

2017-04-05 Dwzb R语言中文社区

由于R语言基础作图部分内容简单直接,但参数繁多,因此这里不做系统介绍,只挑出几个点来讲一讲。主要介绍R中的颜色系统。


目录

  1. 一个作图示例

  2. 图片的高清保存

  3. par函数使用技巧

  4. 颜色系统

  5. 作图使用中文乱码

  6. 基础作图和数学公式的演示


一个作图示例


下面我们要画出以上图片,当做一些函数和参数使用的例子,代码中的注释会对一些内容作出解释。

x <- 1:5 y <- 5:1 # 生成25个点的网格数据 xy <- expand.grid(y=y,x=x) # 画25种pch plot(xy$x-6,xy$y,pch=1:25,col="red",cex=2,      xlim=c(-5.5,6),ylim=c(-7,6), # 指定坐标轴范围      ann=F,axes=F) # 这两个参数去掉原有边框 text(3-6,12,"points pch=") text(xy$x+0.4-6,xy$y,as.character(1:25)) # 画6种lty for(i in 1:6){   lines(1:5-6,rep(i*5/6,5)-7,lty=i,col="red",lwd=2) } text(3-6,6-7,"lines lty=") text(rep(5.35,6)-6,1:6*5/6-7,as.character(1:6)) # 画8种type a <- 1:3 b <- -(1:3/4) typen <- c("h","p","l","b","o","S","s","n") # n指不画线 for(i in 1:length(typen)){ points(a,b-0.8*i,type=typen[i],col=i+1) text(0.5,-0.2-0.8*i,typen[i],col=i+1) } # 画通过原点的坐标轴 axis(1,c(-5,0,6),pos=0, # 确定轴的坐标为0      col.ticks = "transparent",col="grey",col.axis="grey",      hadj=-1,padj=-1.5) # 调整刻度名与轴之间的距离 axis(2,c(-7,0,6),pos=0,      col.ticks = "transparent",col="grey",col.axis="grey",      hadj=1,padj=1.5) # 画各种图形 segments(0.5,5,2.5,5,col=2) # 指定首尾坐标 text(6,5,"segments(1,5,3,5)",adj=1) # adj=1则文字最左端对应前面指定的坐标 arrows(0.5,4,2.5,4,col=3) text(6,4,"arrows(1,5,3,5)",adj=1) rect(0.5,2.7,2.5,3.3,col="transparent",border=4) # 颜色可以设为无色 text(6,3,"rect(0.5,2.7,2.5,3.3)",adj=1) polygon(c(0.5,2.5,2.5,0.5),c(1.6,1.6,2.4,2.4), # 自动封闭填充颜色         col="grey",border=5) # 画多边形 text(6,2,"polygon",adj=1) legend("bottomright",c("segments","arrows","rect","polygon"),        text.col=2:5,lty=1,pch=16,col=2:5,bg="grey",title="legend")

图片的高清保存

图片保存分为两种,一种是plot之后手动保存,一种是通过代码命令保存。

通过代码保存有如下两个好处

  1. 如果一次要循环画出多张图片,同时保存下来,通过代码保存可以实现自动化,大大减少工作量。

  2. 通过代码保存还可以指定图片清晰度。


代码保存方式

保存图片的命令分为两个系统

  1. png bmp jpeg tiff 函数是一类

  2. pdf 函数是一类

这5个函数保存完的图片都以函数名为后缀名。

函数的使用格式是这样的

png("1.png",width=600,height=600) # 指明接下来要做的图形的格式和长宽 plot(x,y) dev.off() # 关闭图形设备

这样做完图,不会显示在R语言窗口中,而是当前文件夹中会出现一个 1.png 图片。


清晰度说明

pdf函数保存完是pdf格式,是一张矢量图,放大缩小不影响清晰度,在使用latex时,可以直接将其作为图片导入pdf。

而很多时候导入图片不能使用pdf格式,只能用png等函数,不过这些函数保存出来的图片清晰度往往难以令人满意。

下面我们就来说一说如何用png函数增加保存的图片的清晰度。


我们要画以下这张图


下面是探索过程:

  • 注释1:最开始我们尝试将height和width同比例放大,发现图很大文字很小。

  • 注释2:查看png函数的文档,发现res参数可以改变像素,我们增加res试一试,发现文字很大,图变小了小。而且res不能太大,否则就会报错。

  • 目前代码:我们把height width和res增大同样比例试一试。发现图片正常,而且清晰度提高了

typei <- c("p","l","b","o","c","h","S","s","n") # png("type.png",width=600,height=600) # 原始代码 # png("type.png",width=600*3,height=3*600) # 注释1 # png("type.png",width=600,height=600,res=72*2) # 注释2 png("type.png",width=600*3,height=3*600,res=72*3) # pdf("type.pdf",height=14)   opar <- par(mfrow=c(3,3)) for(i in 1:length(typei)){ plot(1:10,1:10,type=typei[i],xlab="",ylab="",      main=paste('type="',typei[i],'"')) } dev.off()

par(opar)

par函数使用技巧

读者看到上面的这两条命令可能会觉得奇怪

opar <- par(mfrow=c(3,3)) par(opar)

本来只要

par(mfrow=c(3,3))

全局设置一下就可以了,但是如果这样的话,以后画图都会分成9宫格。使用上面那种形式是为了画完图还原之前的参数,不影响后面的作图。

除了par函数,还有options函数也是如此

op <- options(digits = 2) (a <- 1.34556) # 1.3 options(op) (a <- 1.34556) # 1.34556

颜色系统

一个展示颜色的程序

为了更方便地展示颜色,我们先定义一个展示颜色的函数showcolors,以后我们都会用这个函数来展示颜色。

# 默认输入颜色不超过10个,放在一排排列展示,超过10个使用方格展示 # 如果参数style="line"则放在一排排列展示,style="grid"则用方格显示 showcolors <- function(colors,style="two"){ # 使用函数闭包 funv <- list( # 少量颜色展示,一排展示 showcol1 = function(color){ l1 <- seq_along(color) # 只要将颜色向量赋值给color,就能用柱状图展示 image(l1,1,as.matrix(l1),col=color,       ylab="",xlab="",yaxt="n",xaxt="n",bty="n") }, # 大量颜色使用方格显示 # 颜色向量的排列顺序为,从上到下,从左到右排列 showcols = function(color){ l <- length(color) x <- ceiling(sqrt(l)) image(1:x,1:x,matrix(1:(x^2),nrow=x)[,x:1],       col=c(color,rep(ifelse(is.character(color),"white",0),x^2-l)),       ylab="",xlab="",yaxt="n",xaxt="n",bty="n") }) l <- length(colors) # 参数选择 # 使用$或[[]]调用闭包函数 switch(style,   "line"=funv$showcol1(colors),   "two"=funv[[ifelse(l<=10,"showcol1","showcols")]](colors),   "grid"=funv$showcols(colors) ) } # 实例 mycolor <- colors()[1:30] showcolors(mycolor) showcolors(mycolor,"line")

R语言颜色系统

  1. 调用颜色有一下几种方法

  2. 使用颜色名称

  3. 指定rgb或者用3位十六进制数、或hsv

  4. 使用系统自带颜色集

  5. 自己制作渐变色集

  6. 使用颜色包RColorBrewer包

  7. 使用数字

使用颜色名称

使用字符串代表颜色,如 “red”,”black”等。这样R语言自带的可以使用的字符串共有657个,具体颜色与名称对应见chart of r colors

# 用如下命令看颜色的演示 demo("colors") # colors()代表一个长为657的颜色字符串向量 length(colors()) # 657 colors()[30:35] # "blue4"      "blueviolet" "brown"      "brown1"     "brown2"     "brown3"  # 当你想得到多种红色,可以用下面代码 colors()[grep("red",colors())] # 看看有哪些颜色(读者自试) showcolors(colors()[grep("red",colors())]) 指定rgb或者用3位十六进制数、或hsv 如果系统自带的颜色不令人满意,我们可以自己指定颜色的rgb。 rgb函数接的参数分别对应 r-red,g-green,b-blue,生成的颜色是由这三个颜色组成 hsv 是Hue, Saturation, Value色调、饱和度、亮度。是绘图的另外一套系统 # 默认三个数在0-1之间 color <- rgb(1,0.5,0.25) # 由于我们平常使用的rgb都是0-255,我们可以这样 color <- rgb(35,255,76,maxColorValue=255) # 三个参数接向量可以做出一个颜色向量 color <-rgb(seq(1,255,len=10),16:25,16:25,maxColorValue=255) showcolors(color) # 用rgb生成的函数以3个16进制数的字符串表示 # 我们平时去找颜色的时候,有时也能见到这种格式,其实和rgb是等价的,不过用起来更方便 color[1:4] # "#011010" "#1D1111" "#391212" "#551313" # hsv mycolor <- hsv(seq(0,0.5,len=10),1:10/15,1:10/10) showcolors(mycolor) # 也是用十六进制表示 mycolor[1:4] # "#1A1818" "#332E2C" "#4D473D" "#66664B" # 提取颜色rgb数值 col2rgb("yellow")


使用系统自带颜色集

R有以下自带颜色集

  1. rainbow() 彩虹色

  2. heat.colors() 红色至黄色

  3. terrain.colors() 绿色、棕色至白色

  4. topo.colors() 深蓝色至浅棕色

  5. cm.colors() 浅蓝到白色、浅紫色

  6. gay()和grey() 灰色

前5个函数接受单个数值作为参数,生成渐变色,数值越大,相邻颜色差别越小

最后一个函数接受一个数值向量,数值为0-1之间

# 简单示例,作图由读者自试 mycolor <- heat.colors(10) showcolors(mycolor) # fss中每一个元素作为fun的参数,执行fun函数的命令 fun <- function(f){   showcolors(do.call(f,list(30)),"line")   mtext(f,side=3,line=-1) } fss <- c('rainbow','heat.colors','terrain.colors','topo.colors','cm.colors') op <- par(mfrow=c(3,2),mar=rep(0.2,4)) lapply(fss,fun) # gray函数接受参数的模式和三种不同 showcolors(gray(1:30/30),"line") mtext("gray",side=3,line=-1) par(op) # 作图结果见下方


自己制作渐变色集

自己制作渐变色可以使用rgb和hsv函数,也可以使用下面一个函数,指定颜色的渐变

# 下面函数可以建立从一个颜色到另一个颜色的渐变色 a <- colorRampPalette(c("red", "purple")) showcolors(a(20),"line") # 可以接受多个颜色渐变 a <- colorRampPalette(c("green","blue","red", "purple")) showcolors(a(40),"line")

使用颜色包RColorBrewer包

这个包中有三类颜色,个人认为非常好看

  1. seq类,渐变。适用于从低到高排序明显的数据,浅色数字小,深色数字大

  2. div类,对对极值和中间值比较注重的数据

  3. qual类,适用于分类

library(RColorBrewer) # 展示所有颜色 display.brewer.all(type = "all") # type可以换为"qual","div","seq" # 使用颜色 mycolors<-brewer.pal(7,"Set1") # 从这个色板中选择7个颜色 display.brewer.pal(n, "RdGy") # 展示这个调色板中的颜色 brewer.pal.info # 查看有哪些调色板

使用数字

数字来表示颜色应该是我们平时最常用的方法了,但是最后讲,是因为它涉及到调色板,我们可以将前面所有颜色放进这个调色板中,定义自己的数字对应颜色。所以等所有颜色都讲完了才讲这里。

数字对应的颜色在调色板中,我们可以用 palette 调出查看,发现有8种默认颜色,对应数字1-8.

palette() # "black"   "red"     "green3"  "blue"    "cyan"    "magenta" "yellow"  "gray" op <- par(mfrow=c(1,2),mai=rep(0.2,4)) showcolors(1:8) showcolors(1:16) par(op)

调色板的作用是便捷、快速地使用,我们可以对其进行更改,使用我们自己喜欢的颜色。

# 读者自己尝试 palette(rainbow(10)) showcolors(1:10)  mycolor <- colors()[1:30] palette(mycolor) showcolors(1:10) # 将调色板设回默认 palette("default") showcolors(1:10)

作图使用中文乱码

加载showtext包,详情看 https://cos.name/2014/01/showtext-interesting-fonts-and-graphs


基础作图和数学公式的演示

demo(graphics) demo(plotmath)

Dwzb , R语言中文社区专栏作者,厦门大学统计专业学生。
知乎专栏:Data Analysis
https://zhuanlan.zhihu.com/Data-AnalysisR 


微信回复关键字即可学习

回复 R              R语言快速入门免费视频 
回复 统计          统计方法及其在R中的实现
回复 用户画像   民生银行客户画像搭建与应用 
回复 大数据      大数据系列免费视频教程
回复 可视化      利用R语言做数据可视化
回复 数据挖掘   数据挖掘算法原理解释与应用
回复 机器学习   R&Python机器学习入门 

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存