在R語言中指定畫圖邊框時,通常使用兩種單位, lines 和 inches
當然,這兩個單位之間是可以相互轉換的,那么 1 inch = ? line
答案是1 inches = 5 lines
下面給出具體的分析過程:
par 函數中有兩個參數,返回的是margin的寬度,只不過單位不同:
mar : 返回邊框的寬度, 返回值的單位為 lines
mai: 返回邊框的寬度, 返回值的單位為 inches
看下二者的返回值
> par("mar")
[1] 5.1 4.1 4.1 2.1
> par("mai")
[1] 1.02 0.82 0.82 0.42
因為二者返回的是同一個東西, 1.02 inches = 5.1 lines,
所以 1inch = 5 line
明白了不同單位之間的轉換比之后,如何利用這些信息,准確的指定邊距呢?
看下面這個場景,在圖片的右側通過mtext 添加了一個字符串,但是字符串太長了,所以沒顯示全
為了顯示繪圖區域的范圍,我用box 畫出了對應的邊框,從圖中可以看到,因為坐標系和繪圖邊框之間的距離(也就是margin) 太窄了,所以文字沒顯示完整
為了讓文字完整顯示,需要將右側的margin調大一點,我們知道,默認的margins = c(5, 4, 4, 2) + 0.1 lines ,最直接的方式就是把右側對應的數值調大一點,代碼如下:
par(oma = c(1,1,1,1), mar = c(5.1, 4.1, 4.1, 5.5)) plot(1:5, 1:5, type = "n") mtext(side = 4, "metagenome", las = 1) box(which = "inner")
調整完之后,效果圖如下:
上述的方法存在的一個問題就是,我需要不斷嘗試不同的值,直到滿足要求為止,而且不能夠精確的控制所需邊框的寬度,那么有沒有解決方案呢?
在R語言中,有strwidth 和 strheight 兩個函數,用來計算一個字符串所占的寬度和長度,返回的長度可以自已選擇
通過strwidth 計算出 "metagenome" 這個字符所占的寬度,然后將對應的margin 設置成這個值就可以了
a <- strwidth("metagenome", units = "inches", cex = 1) right_margin <- 5 * a par(oma = c(1,1,1,1), mar = c(5.1, 4.1, 4.1, right_margin)) plot(1:5, 1:5, type = "n") mtext(side = 4, "metagenome", las = 1) box(which = "inner")
生成的圖片如下:
從圖中可以看出,通過這種方式指定邊距,非常的精確,不多也不少,保證在所有情況下,都會顯示出對應的邊距