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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM