1. 程式人生 > >R語言 繪製散點圖

R語言 繪製散點圖

[轉自:http://blog.sina.com.cn/s/blog_69ffa1f90101siek.html]

函式。簡單地說,把一些R語句(賦值、計算或其他操作步驟)包 裝起來並給它一個名稱,這就是函式。我們前面接觸過的 getClass( ), class( ), head( ), rep( ), cbind( ), rbind( )等都是函式。顯示(列印)物件 也有函式print( ),但R有更簡單的方法:輸入物件名(資料物件或函式名)就可以顯示其內容。函式一般都有引數。

R 作圖也是通過函式完成的,不同函式可以做出不同的圖形,比如plot()函式可以做散點圖、線狀圖,barplot()函式可以做出柱狀圖或條形 圖,pie()函式用於做餅形圖。作圖或者稱資料視覺化,是R的主要的功能之一。R語言雖然是一種計算機語言,但用R作圖不一定要會程式設計,相當簡單。

散點圖是最基本的資料分析圖形,我們就從它開始。

一、檔案資料讀取和儲存

作圖首先要有資料。為避免重複輸入,我們一般將R使用的資料存成文字檔案(txt檔案)或逗號分隔符檔案(csv檔案),Excel裡面有這樣的儲存選項。

好的R軟體包一般都提供有一些供學習和舉例用的樣本資料,這些資料可以用data( )函式來查詢。為方便說明,我們使用R(base包)提供的樣本資料。先看看有些什麼:


> data()
Data sets in package 'datasets':

AirPassengers           Monthly Airline Passenger Numbers 1949-1960
BJsales                 Sales Data with Leading Indicator BJsales.lead (BJsales)                         Sales Data with Leading Indicator BOD                     Biochemical Oxygen Demand CO2                     Carbon Dioxide Uptake in Grass Plants ChickWeight             Weight versus age of chicks on different diets
DNase                   Elisa assay of DNase #...........(還有很多,節省篇幅不列了)

我們用trees資料來做散點圖。先看看它是什麼樣的資料:


> str(trees)     #資料的結構
'data.frame':    31 obs. of  3 variables:
 $ Girth : num  8.3 8.6 8.8 10.5 10.7 10.8 11 11 11.1 11.2 ...
 $ Height: num  70 65 63 72 81 83 66 75 80 75 ...
 $ Volume: num  10.3 10.3 10.2 16.4 18.8 19.7 15.6 18.2 22.6 19.9 ...

> head(trees)   #資料的前幾條記錄
  Girth Height Volume
1   8.3     70   10.3
2   8.6     65   10.3
3   8.8     63   10.2
4  10.5     72   16.4
5  10.7     81   18.8
6  10.8     83   19.7

可以看到trees資料集是我們比較熟悉的資料框型別,有3個列變數。我們把它儲存到D盤根目錄。首先用setwd( )函式設定工作目錄,它是R讀取和儲存檔案的預設位置。注意:如果是反斜槓得用兩個。下面兩條語句效果都一樣:


> setwd("d:/")
> setwd("d:\\")

然後用write.csv( )函式儲存成trees.csv檔案:


> write.csv(trees, "trees.csv")

用read.csv( )函式讀取資料到the.data中:


> the.data <- read.csv("trees.csv", header = TRUE)

再看看讀入的資料是什麼樣子:


> str(the.data)
'data.frame':    31 obs. of  4 variables:
 $ X     : int  1 2 3 4 5 6 7 8 9 10 ...
 $ Girth : num  8.3 8.6 8.8 10.5 10.7 10.8 11 11 11.1 11.2 ...
 $ Height: int  70 65 63 72 81 83 66 75 80 75 ...
 $ Volume: num  10.3 10.3 10.2 16.4 18.8 19.7 15.6 18.2 22.6 19.9 ...
> head(the.data)
  X Girth Height Volume
1 1   8.3     70   10.3
2 2   8.6     65   10.3
3 3   8.8     63   10.2
4 4  10.5     72   16.4
5 5  10.7     81   18.8
6 6  10.8     83   19.7

read.csv函式讀入的資料是資料框,多了表示序號的一列,不影響。如果嫌礙眼就去掉它。


> the.data <- the.data[ ,2:ncol(the.data)]

二、快速作圖法

用plot函式可以非常便捷地做出散點圖:


> x <- the.data$Girth
> y <- the.data$Height
> plot(x, y, main = "樹圍與樹高關係圖"xlab = "Girth", ylab = "Height")

R循序漸進2:散點圖 - xxx - xxx的部落格

 R的快速作圖方式主要是針對資料關係的探索性分析的,不同型別的圖完全可以顯示出資料間的關係,同時避免了浪費時間在圖形外觀的設定上。如果想美化圖形,也很容易。圖形元素無非包括標題、座標軸、點、線、圖例等幾個部分,外觀包括形狀、顏色、大小、寬度和字型等。

1、標題文字設定引數:main(主標題),sub(副標題),xlab(x軸標題)和ylab(y軸標題)

2、座標軸有無:axes (TRUE/FALSE)

3、座標軸區間引數:xlim,ylim

4、點型別引數:pch

5、線型別、寬度引數:lty,lwd

6、顏色設定引數:col, col.axis, col.lab, col.main, col.sub

7、大小(包括圖形和字型)引數:cex, cex.axis, cex.main, cex.sub, cex.lab

8、如果點型別是空心點(pch=21-25),還可以設定內部填充顏色:bg引數

我們通過設定plot函式的引數做一個散點圖:


> plot(x, y, main = "樹圍與樹高關係圖", xlab = "Girth", ylab = "Height",
    xlim = c(0,25),                             #設定x軸刻度範圍
    pch = 2, col = "red", cex = 1.2,            #設定圖形幾何形狀和顏色
    col.lab = "blue", col.axis = "orange", 
    cex.lab = 1.2, cex.main = 1.5)

R循序漸進2:散點圖 - xxx - xxx的部落格

 為了避免輸入錯誤後重復打字,一般先把繪圖語句寫到文字檔案,然後拷貝到R裡面就可以了。有關的文字編輯器後面再推薦和介紹,現在可以先用自己熟悉的任何文字編輯器做這個事情。

三、分步作圖法

上面的圖形可以一步步進行。

1、先繪製只設置了點的圖,軸不顯示,座標標題為空:


> plot(x, y, pch = 2, col = "red", axes =FALSE, xlab="", ylab="")

R循序漸進2:散點圖 - xxx - xxx的部落格

 2、新增其他圖形元素(注意每執行一條語句後圖形會馬上有變化,中間過程的圖形就不一一貼出了):


> plot(x, y, pch = 6, col = "red", axes =FALSE, xlab="", ylab="", xlim=c(8,22), ylim=c(10,90))

> box(col="green")
> axis(1, col="orange", lty=2, lwd=3)
> axis(2, col="purple", col.axis="purple")
> axis(4, col="seagreen")
> title(main="樹圍與樹高關係圖", cex.main = 1.5)
> title(xlab="Girth", cex.lab=1.2, col.lab="blue")

R循序漸進2:散點圖 - xxx - xxx的部落格

 可以看到,分步作圖法可以獲得對圖形元素的更多控制,各個座標軸、標籤的顏色和字型大小都可以單獨設定。還可以在上面圖形的基礎上新增其他的資料點(在前面作圖時注意設定y軸的範圍):


> y2 <- the.data$Volume
> points(x, y2, pch=25, col="red", bg="blue")
> title(ylab="Height or Volume", cex.lab=1.2, col.lab="red")

R循序漸進2:散點圖 - xxx - xxx的部落格

 注 意:plot( )函式執行後會把圖形區的其他東西全“擦”掉再新作圖,這樣的圖形函式稱為高水平圖形函式;而 box( ), title( ), axis( ), points( )這些函式只是在原有圖形基礎上新增東西,它們稱為低水平圖形函式。只有使用了 高階圖形函式產生圖形區後才能使用低水平圖形函式。各圖形元素的低水平圖形函式有:

1、新增標題(主、副標題和座標軸標題):title( )

2、新增座標軸:axis( )

3、新增資料點:points( )

4、新增線:lines( )

5、新增水平線或垂直線:abline( )

6、其他text( ), polygon( ), legend( )在後面介紹。

四、R base函式作圖的特點

以上方法是用都是R基本繪圖包(graphics包,已包含在R基本安裝包裡面)帶的作圖函式來做的,這個過程就像拿起畫筆在一張白紙上畫畫,每個圖形元素都可以自己去設計。因此R graphics包作圖的特點也就體現出來了:R提供了豐富的圖元控制函式和引數,可以方便地描繪出所需的每個元素。但是和我們普通作圖不一樣的是,R作圖沒有橡皮擦,做錯了只能重新來過。但這應該不是什麼問題,R作圖是用語句來進行的,重用這些語句可以繪製出完全一樣的圖,這點正是科學繪圖所需要的。

但是,R把圖形元素的控制全交給了我們,雖然很自由,是不是也很麻煩?這恐怕也是很多人學R作圖過程中退卻的原因吧?但這些設定是有懶辦法的:把常用的作圖引數設定好並作為函式封裝起來(類似與一些軟體的巨集操作),這樣就可以一勞永逸了。《用R語言繪製y軸不連續的柱形圖》中自編的gap.bar函式就是這樣的一個例子,函式自定義的方法請參考《R語言基礎教程6:程式設計基礎》部分。