前言
R語言不僅在統計分析,數據挖掘領域,計算能力強大。在數據可視化上,也不遜於昂貴的商業。當然,背后離不開各種開源軟件包的支持,Cairo就是這樣一個用於矢量圖形處理的類庫。
Cairo可以創建高質量的矢量圖形(PDF, PostScript, SVG) 和 位圖(PNG, JPEG, TIFF),同時支持在后台程序中高質量渲染!
本文將介紹,Cairo在R語言中的使用。
目錄
- Cairo介紹
- Cairo安裝
- 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圖:
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圖:
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圖:
我們查看兩個文件的屬性:以png直接生成的圖54KB,以CairoPNG生成的圖43.8KB。
綜上的3個例子,我分辨不出太大區別,只是Cairo感覺更淡、更柔和一些。
大家不妨找一些更復雜的圖形來嘗試着比較。
轉載請注明出處:
http://blog.fens.me/r-cairo/