每天一個R語言小技巧(3)——畫圖中座標軸相關(標籤,範圍,原點位置)


以後的文章都會加入這個摘要部分,這樣就可以直接看到文章中有沒有想看的問題了。
吐槽一下,格式問題真的搞得我好累,哎 可愛可恨的markdown…

問題

1. 畫圖的時候,明明設置了x軸y軸的範圍,爲什麼座標軸的長度還是會多出一塊呢?

失敗案例:plot(runif(10,0,10),type="l",xlim=c(0,10),ylim=c(0,10))

圖片名稱

2. 想使原點在圖中間或使座標在圖中間交匯,應該咋整捏?


錯誤示例:plot(-10:9,runif(20,-10,10),type="l",xlim=c(-10,10),ylim=c(-10,10))

圖片名稱

期望的效果:

圖片名稱

3. 座標軸上的label朝向應該怎麼旋轉呢?或者說 參數las應該怎麼設置呢?


解決方案

1. 使用 xaxis/yaxis=“i”

在R中默認會畫出增加4%的座標軸,如果想畫出正好是xlim或ylim的長度,可以使用 xaxis/yaxis="i"
示例代碼: plot(runif(10,0,10),type="l",xlim=c(0,10),ylim=c(0,10),yaxs="i",xaxs="i")

圖片名稱

2. 用axis()重製座標軸

爲了完成問題2的任務,我們需要在原圖的基礎上重新畫座標。
簡單的介紹以下幾個函數及概念。

  • 低級畫圖函數: 需要在已有圖/畫布上才能發揮作用的函數,例如:rect(), text(), lines()…
    區分低級畫圖函數與畫圖函數:函數中帶plot四個字母的就肯定不是低級的!例如xyplot(), boxplot(),barplot()…
  • axis(): 畫座標軸的低級函數,可以最大程度的實現座標軸自定義效果。
  • plot.new(): 用於創建新畫布。在創建新畫布後,低級函數就可以發揮作用了。
    (故低級函數只能搭配plot.new()使用,或者是與已有的plot搭配進行圖的再加工)
  • plot.window(): 定義畫布的座標系統,參數必須包括 xlim/ylim。該函數一般和plot.new()搭配使用。

Ps:只使用plot.new()而不用plot.window(),則會創建 座標系統則爲xlim=ylim=c(0,1)的單位畫布
Ps2: 爲了便於理解,我才引入“畫布”這個詞,這並不是一個官方的叫法,事實上我並不清楚這個東西到底是怎麼稱呼。。

瞭解了以上內容之後,可以想到將座標原點放在畫布中間這個任務可以使用

  • 新建畫布
  • 定義座標系統
  • 繪製座標軸
  • 繪製圖案

這樣的流程來完成。


代碼實現:

plot.new()
plot.window(xlim=c(-10,10),ylim=c(-10,10))
lines(-9:9,runif(19,-10,10),col="red")
axis(1,pos=0)
axis(2,pos=0)
圖片名稱

3. 使用參數las

在上圖中,座標軸的label是不是相當難受了,應該如何旋轉它呢?

這裏我們用到的是參數las, 他有四個值可選:0,1,2,3。
更具體的講,我把它分成了兩個部分。
las=1及las=3:表現的是標籤的絕對狀態:las=1 爲豎直,las=3爲水平


圖片名稱

las=0及las=2:表現d的是標籤相對座標軸的方向:
las=0爲標籤垂直與座標軸,las=2爲標籤平行於座標軸。


圖片名稱

另:附上圖的代碼

# 第一組
par(mfrow=c(1,2))
par(mai=c(0.5,0.4,0.4,0.2))
plot(0:5,las=1,ann=F)
title(main="las=1")
par(mai=c(0.4,0.4,0.4,0.2))
plot(0:5,las=3,ann=F)
title(main="las=3")

#第二組
par(mfrow=c(1,2))
par(mai=c(0.5,0.4,0.4,0.2))
plot(0:5,las=0,ann=F)
title(main="las=0")
par(mai=c(0.5,0.4,0.4,0.2))
plot(0:5,las=2,ann=F)
title(main="las=2")

回到上面問題二的圖,怎麼能讓原點在中間的座標軸更加美觀呢?

  • 使用axis()中的at參數, 將座標軸的標籤位置固定
plot.new()
plot.window(xlim=c(-10,10),ylim=c(-10,10))
lines(-9:9,runif(19,-10,10),col="red")
axis(1,pos=0,at=c(-10,-5,5,10))
axis(2,pos=0,at=c(-10,-5,5,10),las=1)
圖片名稱
  • 當然,標籤內容可用labels參數進行自定義
plot.new()
plot.window(xlim=c(-10,10),ylim=c(-10,10))
lines(-9:9,runif(19,-10,10),col="red")
axis(1,pos=0,at=c(-10,-5,5,10),labels=c("Day 1","Day 2","Day 3","Day 4"))
axis(2,pos=0,at=c(-10,-5,5,10),las=1)

圖片名稱
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章