統計R語言實作筆記系列- 直線abline()、曲線curve()與多邊形polygon()視覺化繪圖

最近的文章中提過如何用 R 產出基本的統計圖表,也示範過用 abline() 函數繪製輔助線,但假如想要加上各種經典曲線在圖形中方便比較差異,或者隨心所欲地繪製自定義的曲線,那麼這篇文章將要介紹的函數 curve() 就能幫上忙。

輔助線之外,適當地繪製面積也是一種替圖表增色的方法,尤其是在面積本身帶有數學意義,例如累積機率,此時標示出面積能幫助圖形資訊的理解,只要使用 polygon() 函數就能做到這點。

繪製簡單直線與迴歸線: abline()、lsfit()

abline() 本身無法直接做圖,得先畫出一張圖表之後再當成輔助線加上去。在此稍微回顧一下繪製直線的函數abline(),它的語法如下:

abline(a = NULL, b = NULL, h = NULL, v = NULL, reg = NULL,coef = NULL, untf = FALSE, …)

其中參數a代表截距常數,參數b則是斜率常數。假如我們已經知道迴歸式等於: Y=1.1X+1,就能使用 abline() 函數來繪製直線。

假如迴歸式未知,也無須另行計算迴歸模型,只要利用 lsfit() 函數快速取得迴歸參數,再配合 abline() 就能得到迴歸直線了,參考以下的例子。

par(mfrow=c(3,1)) #切割繪圖視窗為3X1,方便稍後合併比較

aa <- c(6, 4, 9, 7, 6, 12, 8, 10, 9,13) #先隨意指定一個數列aa

plot(aa) #繪製aa的散佈圖

abline(a=1,b=1.1) #在散佈圖上繪製Y=1+1.1X的直線

abline(lsfit(1:10,aa)) #先利用lsfit()函數以aa共10個資料點計算迴歸參數,再於散佈圖上繪製aa的迴歸線

r-abline-繪圖-範例

前面用到的 lsfit() 函數,語法如下:

lsfit(x, y, wt = NULL, intercept = TRUE,tolerance = 1e-07, yname = NULL)

其中x是自變數,y變數是應變數,intercept參數用來決定迴歸直線中是否要包含截距常數。

一般情況下叫出 lsfit() ,會得到以最小平方法產生的迴歸模型相關資訊(僅列出部分資訊):

lsfit(1:10,aa)
$coefficients
Intercept   X
4.667     0.679
$residuals
[1]
0.655 -2.024  2.297 -0.382
-2.061  3.261 -1.418 -0.097 -1.776  1.545

曲線繪圖: curve()

考慮各領域實務應用中遭遇「非線性」的機會其實很高,直線不見得總是能用來闡釋資料趨勢(暫且不考慮資料轉換的情況),因此還經常需要用到曲線函數 curve() ,來繪製各種類型的曲線。舉例來說,三角函數就可以用 curve() 來繪圖。

不同於 abline() ,只輸入 curve() 就可以產出圖形,當然 curve() 也可以畫最簡單的直線,畢竟直線可視為一個曲線之曲率 = 0 的特例。

curve()的函數語法如下:

curve(expr, from = NULL, to = NULL, n = 101, add = FALSE, type = “l", xname = “x", xlab = xname, ylab = NULL, log = NULL, xlim = NULL, …)

這個函數主要參數 expr 可用來輸入曲線公式, from / to 參數用來指定曲線公式中變數x的範圍,或者使用 xlim=c(,) 的方式來表達,參數 add =TRUE 時則是告訴R把這條曲線加在現存的最後一張圖表上當成輔助線。

expr 中的式子允許以慣用的x符號寫成的公式進行運算,像是這個例子: x 平方。

curve(x^2,from=0,to=10)

r-curve-繪圖-範例

式子更為複雜的情形:

curve(x+x^2+x^3,from=-100,to=100) # x + x 平方 + x 立方

r-curve-繪圖-範例-多次方

curve(log(x)/exp(x*0.05),0,100) # x 取對數再除以自然對數 e 的 x*0.05 次方,x 範圍 0~100

r-curve-繪圖-範例-log

結合R當中的三角函數公式也沒問題:

curve(cos(x)*sin(x)*tan(x),-10,10)

r-curve-繪圖-範例-三角函數

curve(abs(cos(x)),-10,10) #利用 abs() 取絕對值後繪圖

r-curve-繪圖-範例-三角函數2

繪製多邊形與區域面積: polygon()

面積函數 polygon() 可以用來繪製圖形,也可以當成輔助資訊加在現有圖表上,它的基本語法如下:

polygon(x, y = NULL, density = NULL, angle = 45, border = NULL, col = NA, lty = par(“lty"), …, fillOddEven = FALSE)

參數 x , y 須輸入等長的向量資料以決定面積的範圍,而 density 填入數字則可以加上面積的陰影斜線,數字越大斜線也越密集,也可以用 angle 等於給予數字,來指定陰影斜線的角度。

以 R 內建資料「 AirPassengers 」為例繪圖,並加上斜線密度不同的面積圖形。

par(mfrow=c(1,3)) #切割繪圖視窗為 1 X 3

plot(AirPassengers) #以 AirPassengers 資料集繪圖

polygon(x=c(1950,1960,sep=1),y=c(200,600,sep=30), density=5) #指定兩組向量 x,y 各包含 10 個資料點,各以 sep 指定間隔為 1 和 30 ,陰影密度設為 5 。

polygon(x=c(1950,1960,sep=1),y=c(200,600,sep=30), density=50) #同上,但陰影密度設為 50 。

r-polygon-繪圖-範例

安裝套件 agricolae 的話,還可以用另一個同源變種的函數 polygon.freq() 來搭配長條圖, polygon.freq() 的語法如下:

polygon.freq(histogram, frequency=1, …)

其中參數 frequency = 1 時繪製「次數」、 2 時繪製「相對次數」、 3 時繪製「機率密度」。仍以 AirPassengers 資料為例繪圖:

polygon.freq(hist(AirPassengers), frequency=1, col="blue")

r-polygon-繪圖-範例-密度

想以面積輔助圖形,一個實用的技巧是為特定曲線包圍的面積上色。下例以 curve() 加上 dnorm() 繪製常態曲線,再以 polygon() 繪製有色面積。

polyred = curve(dnorm(x), xlim = c(-4,4)) # 先以 dnorm() 產生常態曲線,再用 curve() 繪製成曲線,命名為 polyred

polygon(polyred$x, polyred$y, col = “red") # 呼叫剛才的曲線 x 軸與 y 軸繪圖,是簡易確保向量長度相等的技巧

r-polygon-繪圖-範例2

另外,如果想在座標圖形中加上文字說明,可以使用 text() 函數,參數 x, y 為文字位置的座標點, labels 之後加上文字說明。詳細語法如下:

text(x, y = NULL, labels = seq_along(x), adj = NULL, pos = NULL, offset = 0.5, vfont = NULL, cex = 1, col = NULL, font = NULL, …)

text(0,0.35,"top of the world")

r-polygon-繪圖-範例-加上文字

最近瀏覽了一些不錯的 R 視覺化應用,像是把資料結合世界地圖、等高線圖、熱度圖、網絡圖等特殊圖種,以及如何利用主流的繪圖套件產生 2D 、 3D 的進階統計圖形。先做個預告順便當成 reminder ,有時間再慢慢寫文章介紹吧。

更多精彩內容,千萬別錯過:

* 統計R語言實作筆記系列 – 2D視覺化進階 GGPLOT()的基本架構(一)

* 統計R語言實作筆記系列 – 用 SHINY 套件極速打造你的商業智慧分析網站!

* 統計R語言實作筆記系列- 直線ABLINE()、曲線CURVE()與多邊形POLYGON()

* 統計R語言實作筆記系列 – 2D視覺化入門

* EXCEL 交互參照必學神器, 用 LOOKUP 系列函數一鍵搞定資料比對 : HLOOKUP篇

(Visited 2,667 times, 25 visits today)

Wendell.Huang

科技公司嫌棄太活潑,消費品牌挑剔太沉悶..., 經常必須解釋自己在學什麼, 不小心就摔破對方眼鏡的跨領域玩家。

2 Comments

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *