R语言绘图、高清保存、以及颜色系统

转载于R语言中文论坛R语言中文社区

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


目录

  1. 一个作图示例

  2. 图片的高清保存

  3. par函数使用技巧

  4. 颜色系统

  5. 作图使用中文乱码

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


一个作图示例

R语言绘图、高清保存、以及颜色系统_第1张图片

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

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函数增加保存的图片的清晰度。


我们要画以下这张图

R语言绘图、高清保存、以及颜色系统_第2张图片

下面是探索过程:

  • 注释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语言绘图、高清保存、以及颜色系统_第3张图片

使用系统自带颜色集

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)
# 作图结果见下方

R语言绘图、高清保存、以及颜色系统_第4张图片

自己制作渐变色集

自己制作渐变色可以使用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)

你可能感兴趣的:(R语言)