购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.7 R语言的高质量图形渲染库Cairo

问题

如何让R语言画出无锯齿的高清图?

引言

R语言不仅在统计分析和数据挖掘领域计算能力强大,它在数据可视化领域也不逊于昂贵的商业软件。当然,R在可视化上强大,其背后离不开各种开源软件包的支持,Cairo就是这样一个用于矢量图形处理的类库。Cairo可以创建高质量的矢量图形(GIF、SVG、PDF、PostScript)和位图(PNG、JPEG、TIFF),同时支持在后台程序中高质量渲染!本节将介绍Cairo在R语言中的使用。

1.7.1 Cairo介绍

Cairo是一个用于图形绘图和渲染的免费库,支持复杂的2D的绘图功能,支持硬件加速。虽然,Cairo是用C语言编写的,但提供多种语言的接口,允许其他语言直接调用,包括有C++、C#、Java、Python、Perl、Ruby、Scheme、Smalltalk等语言。Cairo发布的许可协议为GNU Lesser General Public License version 2.1(LGPL)或Mozilla Public License 1.1(MPL)。R语言Cairo接口的官方发布页是http://www.rforge.net/Cairo/。

1.7.2 Cairo包安装

本节使用的系统环境是:

·Linux:Ubuntu 12.04.2LTS 64bit

·R:3.0.1x86_64-pc-linux-gnu

caTools同时支持Windows 7环境和Linux环境。

Cairo包在Linux Ubuntu系统中的安装过程如下:


~ sudo apt-get install libcairo2-dev # Cairo 
的底层依赖库
~ sudo apt-get install libxt-dev
~ R  # 
启动R 
程序
> install.packages("Cairo")  # 
安装Cairo 
包

1.7.3 Cairo使用

Cairo使用起来非常简单,和基础包grDevices中的函数对应。

·CairoPNG:对应grDevices:png()。

·CairoJPEG:对应grDevices:jpeg()。

·CairoTIFF:对应grDevices:tiff()。

·CairoSVG:对应grDevices:svg()。

·CairoPDF:对应grDevices:pdf()。

我常用的图形输出,就是png和svg。下面检查Cairo的兼容性:


> library(Cairo) # 
加载Cairo 
包
> Cairo.capabilities() # 
检查Cairo 
包支持的图片格式
   png   jpeg   tiff   pdf    svg      ps      x11    win raster
  TRUE   TRUE  FALSE  TRUE   TRUE    TRUE     TRUE  FALSE   TRUE

从兼容性的检查结果,我们可以查看Cairo支持的图形输出格式:

·支持:png、jpeg、pdf、svg、ps、x11(Linux桌面)、raster

·不支持:tiff、win(win桌面)

如果是Windows系统,则x11为FALSE,win为TRUE。

下面比较CairoPNG()和png()的输出效果。

1.散点图

首先我们来画一个6000个点的散点图。


> x<-rnorm(6000) # 
随机取6000 
个点坐标
> y<-rnorm(6000)


> png(file="plot4.png",width=640,height=480) # png 
函数
> plot(x,y,col="#ff000018",pch=19,cex=2,main = "plot")
> dev.off()


> CairoPNG(file="Cairo4.png",width=640,height=480) # CairoPNG 
函数
> plot(x,y,col="#ff000018",pch=19,cex=2,main = "Cairo")
> dev.off()

在当前目录,会生成2个png文件,即plot4.png和Cairo4.png,见图1-12和图1-13。

图1-12 以png()函数生成的图

图1-13 以CairoPNG()函数生成的图

SVG图形输出代码为:


> svg(file="plot-svg4.svg",width=6,height=6)
> plot(x,y,col="#ff000018",pch=19,cex=2,main = "plot-svg")
> dev.off()


> CairoSVG(file="Cairo-svg4.svg",width=6,height=6)
> plot(x,y,col="#ff000018",pch=19,cex=2,main = "Cairo-svg")
> dev.off()

在当前目录,会生成2个svg文件,即plot-svg4.svg和Cairo-svg4.svg,可以把svg的图片拖拽到浏览器中显示。

2.三维截面图

接下来,我们再画一个三维截面图,比较函数png()和CairoPNG()输出的效果。


> x <- seq(-10, 10, length= 30)
> y <- x
> f <- function(x,y) { r <- sqrt(x^2+y^2); 10 * sin(r)/r }
> z <- outer(x, y, f)
> z[is.na(z)] <- 1


> png(file="plot2.png",width=640,height=480) # PNG 
图
> op <- par(bg = "white", mar=c(0,2,3,0)+.1)
> persp(x, y, z,theta = 30, phi = 30,expand = 0.5,col = "lightblue",ltheta =120,shade = 0.75,ticktype = "detailed",xlab = "X", ylab = "Y", zlab ="Sinc(r)",main = "Plot")
> par(op)
> dev.off()


> CairoPNG(file="Cairo2.png",width=640,height=480)
> op <- par(bg = "white", mar=c(0,2,3,0)+.1)
> persp(x, y, z,theta = 30, phi = 30,expand = 0.5,col = "lightblue",ltheta =120,shade = 0.75,ticktype = "detailed",xlab = "X", ylab = "Y", zlab ="Sinc(r)",main = "Cairo")
> par(op)
> dev.off()

在当前目录,会生成2个png文件,即plot2.png和Cairo2.png,见图1-14和图1-15。

图1-14 以png()函数生成的图

图1-15 以CairoPNG()函数生成的图

3.大量文字的图片

最后,我们针对包含大量文字的图片比较png()和CairoPNG()函数输出的效果。


> library(MASS) # 
加载MASS 
包
> data(HairEyeColor) # 
加载HairEyeColor 
数据集
> x <- HairEyeColor[,,1]+HairEyeColor[,,2]
> n <- 100
> m <- matrix(sample(c(T,F),n^2,replace=T), nr=n, nc=n)
> png(file="plot5.png",width=640,height=480) # PNG 
图
> biplot(corresp(m, nf=2), main="Plot")
> dev.off()


> CairoPNG(file="Cairo5.png",width=640,height=480)
> biplot(corresp(m, nf=2), main="Cairo")
> dev.off()

在当前目录,会生成2个png文件,即plot5.png和Cairo5.png,见图1-16和图1-17。

图1-16 以png()函数生成的图

图1-17 以CairoPNG()函数生成的图

我们查看两个文件的属性,发现以png直接生成的图54KB,以CairoPNG生成的图43.8KB,如图1-18所示。

图1-18 对比两幅图的文件属性

SVG图形输出代码为:


> svg(file="plot-svg5.svg",width=6,height=6)
> biplot(corresp(m, nf=2), main="Plot-svg")
> dev.off()


> CairoSVG(file="Cairo-svg5.svg",width=6,height=6)
> biplot(corresp(m, nf=2), main="Cairo-svg")
> dev.off()

在当前目录,会生成2个svg文件,即plot-svg5.svg和Cairo-svg5.svg。

就以上的3个例子来说,我们分辨不出CairoPNG()和png()之间有太大区别,只是Cairo感觉更淡、更柔和一些。关于这一点谢益辉补充说,看不出区别是因为现在R的png()设备本来就是默认用cairo,几年前png()不用cairo,所以有时候PNG图的质量很差。多数情况下是几乎没有区别,只有少数情况下抗锯齿的表现不一样。 gTGw0VA0mSYfSRCxMOHXYnbHJVCBDZlD4L/c7cKHD2JN6UXKFKup83HoY1G/P2Dp

点击中间区域
呼出菜单
上一章
目录
下一章
×