《R的极客理想—工具篇》—— 1.7 R语言的高质量图形渲染库Cairo

简介:

本节书摘来自华章出版社《R的极客理想—工具篇》一 书中的第1章,第1.7节,作者:张丹,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

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

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

引言
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)。

1.7.2 Cairo包安装

本节使用的系统环境是:
Linux: Ubuntu 12.04.2 LTS 64bit
R: 3.0.1 x86_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。

screenshot

screenshot

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的图片拖拽到浏览器中显示。

  1. 三维截面图
    接下来,我们再画一个三维截面图,比较函数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. 大量文字的图片
    最后,我们针对包含大量文字的图片比较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()

screenshot

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

screenshot
screenshot

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

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图的质量很差。多数情况下是几乎没有区别,只有少数情况下抗锯齿的表现不一样。

相关文章
|
6月前
|
数据采集 数据可视化 API
利用R语言和curl库实现网页爬虫的技术要点解析
利用R语言和curl库实现网页爬虫的技术要点解析
|
搜索推荐 Linux Python
VET:一个基于R语言的VCF数据提取工具,支持按基因ID、物理位置、样品名称提取指定变异信息
VET:一个基于R语言的VCF数据提取工具,支持按基因ID、物理位置、样品名称提取指定变异信息
|
3月前
|
数据可视化 数据挖掘 图形学
R语言基础可视化:使用ggplot2构建精美图形的探索
【8月更文挑战第29天】 `ggplot2`是R语言中一个非常强大的图形构建工具,它基于图形语法提供了一种灵活且直观的方式来创建各种统计图形。通过掌握`ggplot2`的基本用法和美化技巧,你可以轻松地将复杂的数据转化为直观易懂的图形,从而更好地理解和展示你的数据分析结果。希望本文能够为你探索`ggplot2`的世界提供一些帮助和启发。
|
3月前
|
数据可视化
R语言自定义图形:ggplot2中的主题与标签设置
【8月更文挑战第30天】`ggplot2`作为R语言中功能强大的绘图包,其自定义能力让数据可视化变得更加灵活和多样。通过合理使用`theme()`函数和`labs()`函数,以及`geom_text()`和`geom_label()`等几何对象,我们可以轻松创建出既美观又富有表达力的图形。希望本文的介绍能够帮助你更好地掌握`ggplot2`中的主题与标签设置技巧。
|
3月前
|
数据可视化
R语言多图合成:优雅地在一个画布上展示多个图形
【8月更文挑战第30天】R语言提供了多种方法来实现多图合成,从基础的`par()`函数到高级的`gridExtra`、`ggplot2`和`cowplot`包,每种方法都有其独特的优势和应用场景。通过掌握这些技术,你可以根据实际需求灵活地组合图形,从而更高效地展示和解读数据。希望本文能为你提供一些有益的参考和启示。
|
24天前
|
数据挖掘 C语言 C++
R语言是一种强大的统计分析工具,提供了丰富的函数和包用于时间序列分析。
【10月更文挑战第21天】时间序列分析是一种重要的数据分析方法,广泛应用于经济学、金融学、气象学、生态学等领域。R语言是一种强大的统计分析工具,提供了丰富的函数和包用于时间序列分析。本文将介绍使用R语言进行时间序列分析的基本概念、方法和实例,帮助读者掌握R语言在时间序列分析中的应用。
41 3
|
24天前
|
机器学习/深度学习 并行计算 数据挖掘
R语言是一种强大的统计分析工具,广泛应用于数据分析和机器学习领域
【10月更文挑战第21天】R语言是一种强大的统计分析工具,广泛应用于数据分析和机器学习领域。本文将介绍R语言中的一些高级编程技巧,包括函数式编程、向量化运算、字符串处理、循环和条件语句、异常处理和性能优化等方面,以帮助读者更好地掌握R语言的编程技巧,提高数据分析的效率。
41 2
|
24天前
|
数据采集 数据可视化 数据挖掘
R语言与Python:比较两种数据分析工具
R语言和Python是目前最流行的两种数据分析工具。本文将对这两种工具进行比较,包括它们的历史、特点、应用场景、社区支持、学习资源、性能等方面,以帮助读者更好地了解和选择适合自己的数据分析工具。
25 2
|
6月前
|
机器学习/深度学习 存储 算法
【数据分享】R语言SVM和LDA文本挖掘分类开源软件存储库标签数据和词云可视化
【数据分享】R语言SVM和LDA文本挖掘分类开源软件存储库标签数据和词云可视化
|
6月前
|
数据采集 数据可视化 数据挖掘
R语言与Python:比较两种数据分析工具
【4月更文挑战第25天】R语言和Python是目前最流行的两种数据分析工具。本文将对这两种工具进行比较,包括它们的历史、特点、应用场景、社区支持、学习资源、性能等方面,以帮助读者更好地了解和选择适合自己的数据分析工具。
175 1

热门文章

最新文章