R | 基础绘图
由于R语言基础作图部分内容简单直接,但参数繁多,因此这里不做系统介绍,只挑出几个点来讲一讲。主要介绍R中的颜色系统。
目录
一个作图示例
图片的高清保存
par函数使用技巧
颜色系统
作图使用中文乱码
基础作图和数学公式的演示
一个作图示例
下面我们要画出以上图片,当做一些函数和参数使用的例子,代码中的注释会对一些内容作出解释。
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之后手动保存,一种是通过代码命令保存。
通过代码保存有如下两个好处
如果一次要循环画出多张图片,同时保存下来,通过代码保存可以实现自动化,大大减少工作量。
通过代码保存还可以指定图片清晰度。
代码保存方式
保存图片的命令分为两个系统
png bmp jpeg tiff 函数是一类
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增大同样比例试一试。发现图片正常,而且清晰度提高了
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语言颜色系统
调用颜色有一下几种方法
使用颜色名称
指定rgb或者用3位十六进制数、或hsv
使用系统自带颜色集
自己制作渐变色集
使用颜色包RColorBrewer包
使用数字
使用颜色名称
使用字符串代表颜色,如 “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有以下自带颜色集
rainbow() 彩虹色
heat.colors() 红色至黄色
terrain.colors() 绿色、棕色至白色
topo.colors() 深蓝色至浅棕色
cm.colors() 浅蓝到白色、浅紫色
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包
这个包中有三类颜色,个人认为非常好看
seq类,渐变。适用于从低到高排序明显的数据,浅色数字小,深色数字大
div类,对对极值和中间值比较注重的数据
qual类,适用于分类
使用数字
数字来表示颜色应该是我们平时最常用的方法了,但是最后讲,是因为它涉及到调色板,我们可以将前面所有颜色放进这个调色板中,定义自己的数字对应颜色。所以等所有颜色都讲完了才讲这里。
数字对应的颜色在调色板中,我们可以用 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机器学习入门