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

R的极客理想系列文章,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大。

R语言作为统计学一门语言,一直在小众领域闪耀着光芒。直到大数据的爆发,R语言变成了一门炙手可热的数据分析的利器。随着越来越多的工程背景的人的加入,R语言的社区在迅速扩大成长。现在已不仅仅是统计领域,教育,银行,电商,互联网….都在使用R语言。

要成为有理想的极客,我们不能停留在语法上,要掌握牢固的数学,概率,统计知识,同时还要有创新精神,把R语言发挥到各个领域。让我们一起动起来吧,开始R的极客理想。

关于作者:

  • 张丹(Conan), 程序员Java,R,PHP,Javascript
  • weibo:@Conan_Z
  • blog: http://blog.fens.me
  • email: bsspirit@gmail.com

转载请注明出处:
http://blog.fens.me/r-cairo/

r-cairo

前言

R语言不仅在统计分析,数据挖掘领域,计算能力强大。在数据可视化上,也不逊于昂贵的商业。当然,背后离不开各种开源软件包的支持,Cairo就是这样一个用于矢量图形处理的类库。

Cairo可以创建高质量的矢量图形(PDF, PostScript, SVG) 和 位图(PNG, JPEG, TIFF),同时支持在后台程序中高质量渲染!

本文将介绍,Cairo在R语言中的使用。

目录

  1. Cairo介绍
  2. Cairo安装
  3. Cairo使用

1. Cairo介绍

在信息领域中,cairo 是一个让用于提供矢量图形绘图的免费库,cairo 提供在多个背景下做 2D 的绘图,高级的更可以使用硬件加速功能。

虽然 cairo 是使用C语言撰写的,但是当使用 cairo 时,可以用许多其他种语言来使用,包括有 C++、C#、Java、Python、Perl、Ruby、Scheme、Smalltalk 以及许多种语言,cairo 在 GNU LGPL 与 Mozilla Public License (MPL) 两个认证下发布。

上文介绍,摘自:http://zh.wikipedia.org/wiki/Cairo_(绘图)

R语言Cairo接口的官方发布页:http://www.rforge.net/Cairo/

2. Cairo安装

系统环境

  • Linux: Ubuntu 12.04.2 LTS 64bit
  • R: 3.0.1 x86_64-pc-linux-gnu

Cairo基本库安装


~ sudo apt-get install libcairo2-dev
~ sudo apt-get install libxt-dev

~ R 
> install.packages("Cairo")
** R
** preparing package for lazy loading
** help
*** installing help indices
** building package indices
** testing if installed package can be loaded
Warning: ignoring .First.lib() for package ‘Cairo’
* DONE (Cairo)

3. Cairo使用

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

  • CairoPNG: 对应grDevices:png()
  • CairoJPEG: 对应grDevices:jpeg()
  • CairoTIFF: 对应grDevices:tiff()
  • CairoSVG: 对应grDevices:svg()
  • CairoPDF: 对应grDevices:pdf()

我常用的图形输出,就是png和svg。

检查Cairo的兼容性:


~ R

> library(Cairo)
> Cairo.capabilities()
   png   jpeg   tiff    pdf    svg     ps    x11    win raster
  TRUE   TRUE  FALSE   TRUE   TRUE   TRUE   TRUE  FALSE   TRUE

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

1). 散点图


x<-rnorm(6000)
y<-rnorm(6000)

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

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

# 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()

以下为PNG图:

plot4

Cairo4

2). 三维截面图


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图
png(file="plot2.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 = "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()

以下为PNG图:

plot2

Cairo2

3). 文字显示


library(MASS)
data(HairEyeColor)
x <- HairEyeColor[,,1]+HairEyeColor[,,2]

n <- 100
m <- matrix(sample(c(T,F),n^2,replace=T), nr=n, nc=n)

# PNG图
png(file="plot5.png",width=640,height=480)
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()

# 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()

以下为PNG图:

plot5

Cairo5

我们查看两个文件的属性:以png直接生成的图54KB,以CairoPNG生成的图43.8KB。

cairo-demo5

综上的3个例子,我分辨不出太大区别,只是Cairo感觉更淡、更柔和一些。

大家不妨找一些更复杂的图形来尝试着比较。

转载请注明出处:
http://blog.fens.me/r-cairo/

打赏作者

This entry was posted in R语言实践, 可视化技术

  • Weilin Lin

    这个不错,很美,学习了~

  • 看不出区别是因为现在R的png()设备本来就是默认用cairo,多数情况下是几乎没有区别的。只有少数情况下抗锯齿的表现不一样:http://r.789695.n4.nabble.com/png-type-cairo-point-symbols-without-boarders-are-not-anti-aliased-td4678745.html

    几年前png()不用cairo,所以有时候PNG图的质量很差。

    • 原来如此,明白了!

      • luckywind

        张老师,编译安装的R怎么出现这个问题啊?RStudio和shiny应用里图片都出不来,> png()
        Error in .External2(C_X11, paste(“png::”, filename, sep = “”), g$width, :
        无法打开PNG设备
        此外: Warning message:
        In png() : 本R版本不支持png

        • jht

          这个应该是服务器没有安装png的支持包,比如libpng等,去cos上搜索下,有类似的问题和答案

  • zele

    请问张丹老师:
    为什么我装完Cairo包后
    ibrary(Cairo)
    Cairo.capabilities()
    png jpeg tiff pdf svg ps x11 win raster
    TRUE FALSE FALSE TRUE TRUE TRUE TRUE FALSE TRUE

    为何JPEG是FALSE?

    并且运行后显示:
    > plot(x,y,col=”#ff000018″,pch=19,cex=2,main = “Cairo”)
    > dev.off()
    null device
    1

    null device?请问是哪里出了问题?

  • Annie Zhang

    张丹老师您好,请问R中目前除了Cario外,还有哪些作图功能比较强大的包吗?

  • luckywind

    张老师您好!有没有办法保存带中文的pdf图片或者eps图片呢?发现Cairo也是中文乱码