R語言最強(qiáng)大的一點就是畫圖,那個無比強(qiáng)大的畫圖系統(tǒng),再加上各種各樣的神級R包,讓我寫R語言中最喜歡的一點就是寫繪圖代碼。
簡單來說,R語言原生的繪圖系統(tǒng)已經(jīng)非常強(qiáng)大了,根本不需要其他東西的輔助,就可以繪制非常炫目的圖片,需要的僅僅是耐心。另外R語言還有一系列的繪圖輔助R包,比如著名的ggplot2
,我經(jīng)常用的plotly
都是很好的工具。
再近幾年,R語言推出了Shiny
框架,可以用R語言快速寫成一個網(wǎng)頁,這簡直不能更方便。
講真我已經(jīng)在期待R語言發(fā)布建站框架的那一天了。R已經(jīng)能做分布式大數(shù)據(jù)了
RSpark
,建站還會遠(yuǎn)嗎?
再大的工程也是又一塊磚一塊磚壘起來了。在復(fù)雜的R圖也是又忒簡單的元素組成的,下面的這些東西,可謂是R繪圖最基本的元素,能把它們掌握,就可以繪制出相對OK的圖。
> plot(1:10,col='red')
之前提到過,繪圖函數(shù)(比如bixplot或者plot)中的col
參數(shù)就是控制顏色的,而顏色的選擇可以用問題,也可以用其他的一些標(biāo)號,比如網(wǎng)站有一個很好很強(qiáng)大的R顏色列表
面對上面這種浩如煙海的顏色,你可以直接把那個標(biāo)號:”#XXXX”用到程序里。
另外不得不推薦一個極好的R包,叫做RColorBrewer,這個包的功能主要就是提供一些自己已經(jīng)配好色的R顏色,另外提供一系列顏色的分配,比如你想要從正黃色到正藍(lán)色直接過度10個顏色,就可以用這個包。
> colorRampPalette(brewer.pal(9,'Blues'))(100) -> color> plot(1:100,col=color,pch=20,cex=2)
又如:
> barplot(1:5,col=RColorBrewer::brewer.pal(n = 5,name = 'Set2'))
RColorBrewer::brewer.pal
函數(shù)的功能是直接調(diào)用這個包已經(jīng)配好的顏色,其中有一系列名字,我最喜歡用的就是”Set2”,因為看上去比較素雅。
有時候做了一個圖,想要在圖中加一些問題,這個問題可以用text
函數(shù)來解決,就著剛才的圖,我再繼續(xù)往上邊加一個”Hello World!”
> barplot(1:5,col=RColorBrewer::brewer.pal(n = 5,name = 'Set2'))> text(x=4,y=4,labels = 'Hello World!',cex=2)
text
函數(shù)的參數(shù),x代表了橫坐標(biāo),我這里寫的是4,就是說希望寫再以第四個bar為中心的位置。y代表了高度,我寫的也是4,labels就是想要寫的話,可以把任何的字符串嵌進(jìn)來,最后一個參數(shù)是cex,這個是控制字體大小,1是默認(rèn)值,如果你希望字體放大一倍,就設(shè)置為2.根據(jù)我的經(jīng)驗,想要一次性畫對圖還是有難度的,最好還是多嘗試幾次。調(diào)調(diào)位置,換換
x
和y
。慢慢就可以把圖做出來。
點和線是很基礎(chǔ)的元素,點的函數(shù)是points
,線的函數(shù)是lines
,要說明的是,每一次plot都會展開一副新的圖。也就是說,如果你已經(jīng)用過plot畫了一部分圖了,還想要繼續(xù)往圖上添加?xùn)|西,就需要用points或者lines函數(shù),不能重新用plot。
> barplot(1:5,col=RColorBrewer::brewer.pal(n = 5,name = 'Set2'))> points(rep(3,5),pch=20,cex=3,col='orange')
在plot或者point的時候,理論上你應(yīng)該輸入x,y兩個參數(shù),兩者應(yīng)該是完全對應(yīng)的,一一對應(yīng),前者是橫坐標(biāo),后者是縱坐標(biāo)。但是如果你只輸入了一批數(shù)據(jù),程序就會默認(rèn)橫坐標(biāo)為1,2,3,4……縱坐標(biāo)是你輸入的數(shù)值。這就是為什么,在這個函數(shù)里,我只輸入了
rep(3,5)
而沒有輸入橫坐標(biāo)。
> barplot(1:5,col=RColorBrewer::brewer.pal(n = 5,name = 'Set2'))> points(rep(3,5),pch=20,cex=3,col='orange')> lines(sample(1:5),col='gray',lwd=2,lty=2)
如果說是劃線的話,也很簡單,使用lines函數(shù),用法和之前是一樣的,如果你輸入了對應(yīng)的x,y坐標(biāo),就可以直接繪制,如果只輸入一個vector,程序就默認(rèn)橫坐標(biāo)是1,2,3……
后面的參數(shù)里,lwd
控制線的粗細(xì),lty
控制線的類型,lty=2意思是虛線。
標(biāo)題其實是很容易的,只需要再plot或者其他繪圖程序里,添加main
參數(shù)就行:
plot(1:10,main='This is a Title',cex.main=1.5)
這個真沒什么好說的,cex.main=1.5
的意思是,標(biāo)題的尺寸是標(biāo)準(zhǔn)值的1.5倍。此外值得說的是,如果你不喜歡這個Title,也可以用text手繪,那就稍微復(fù)雜一些。
圖例的目的就是望你看懂你在畫什么,通過legend
函數(shù)我們可以添加圖例。
x <- seq(-pi,="" pi,="" len="">->65)plot(x, sin(x), type = 'l', ylim = c(-1.2, 1.8), col = 3, lty = 2)points(x, cos(x), pch = 3, col = 4)lines(x, tan(x), type = 'b', lty = 1, pch = 4, col = 6)title('legend(..., lty = c(2, -1, 1), pch = c(NA, 3, 4), merge = TRUE)', cex.main = 1.1)legend(-1, 1.9, c('sin', 'cos', 'tan'), col = c(3, 4, 6), text.col = 'green4', lty = c(2, -1, 1), pch = c(NA, 3, 4), merge = TRUE, bg = 'gray90')
上述就是legend函數(shù)的一堆參數(shù),其中col,lty等等都和plot一模一樣。
坐標(biāo)軸是很容易處理的東西。直接設(shè)置參數(shù)就行了。
> plot(1:10,xlab='X lab',ylab='y lab')
有一個很有意思的情況是,如果想要更換坐標(biāo)軸上的1,2,3,4,5該怎么辦?
plot(1:10, xaxt = 'n', xlab='Some Letters')axis(1, at=1:10, labels=letters[1:10])
甚至于,如果想要將坐標(biāo)軸旋轉(zhuǎn)一些角度,應(yīng)該怎么辦?這個問題我經(jīng)常遇到,原因就是有時候label的名字太長了。。。其實代碼真的超簡單:
> par(las=2)> plot(1:10, xaxt = 'n', xlab='Some Letters')> axis(1, at=1:10, labels=letters[1:10])
根據(jù)我?guī)啄甑腞語言經(jīng)驗,構(gòu)圖函數(shù)真的是一個很多教材都沒有認(rèn)真寫的東西,但實戰(zhàn)中經(jīng)常經(jīng)常經(jīng)常涉及這方面問題啊,在這里我記錄了一下:
首先就是,如果你想在一張圖上繪制多個圖形怎么辦?
> par(mfrow=c(2,3))> plot(1:10)> plot(1:10)> plot(1:10)> plot(1:10)> plot(1:10)> plot(1:10)
使用par(mfrow=c(2,3))
命令可以完成比較規(guī)則的構(gòu)圖,其中參數(shù)中,前一個代表行,后一個代表列,我這里的意思就是,把圖片分成兩行三列。
還有另外一種更為厲害的分屏:
# One figure in row 1 and two figures in row 2attach(mtcars)layout(matrix(c(1,1,2,3), 2, 2, byrow = TRUE))hist(wt)hist(mpg)hist(disp)
這是我曾經(jīng)最喜歡的一個多圖函數(shù),其中的設(shè)置都是再layout里邊的matrix,里邊你可以無限多地設(shè)置函數(shù),每一張圖可以通過數(shù)字連起來,這樣就可以做出各種形狀的組合圖形。
聯(lián)系客服