R語言(繪圖入門)

2021-02-15 Java大數據與數據倉庫

原文連結:https://wklchris.github.io/R-plotting-basic.html

R 的繪圖功能一直為業內所津津樂道。用了 Python 的 matplolibt 和 R 的 ggplot2 後,我再也不想用 MATLAB 畫圖了。

我現在這裡先給出本博文用到的包:

library(Hmisc)

Loading required package: lattice
Loading required package: survival
Loading required package: Formula
Loading required package: ggplot2

Attaching package: 'Hmisc'

The following objects are masked from 'package:base':

format.pval, round.POSIXt, trunc.POSIXt, units

library(vioplot)

Loading required package: sm
Package 'sm', version 2.2-5.4: type help(sm) for summary information

使用 dev.new() 命令新建一個圖片視圖,這樣你可以輸出多個圖片到屏幕,而不是讓之後輸出的覆蓋之前的圖形。關於 dev.next(), dev.prev(), dev.set() 及 dev.off() 等內容,參考 help(dev.cur).

基本的繪圖類型有以下幾種,使用 type= 參數指定:

p:僅數據點,默認值。

l:僅線段

b:線段與點

c:僅線段,但點的位置留出空白

o:線段與點,但線段會延伸到點內部

h:直方圖風格,即帶豎直密度線

s:階梯圖

S:其他特殊情況

n;不繪製圖形。用於指定標題、坐標軸名稱的情況

將畫圖的內容輸出到文件,可以指定路徑,不指定就輸出到當前工作目錄。例如輸出 pdf:

pdf("plot.pdf")
plot(c(1, 2, 3), c(3, 4, 2))
dev.off()

除了 pdf() 外,其他可用的輸出格式對應函數:

例子。詳細的參數在下文討論。

x <- 1:4y <- c(2, 4, 3, 1)plot(x, y, type="b")

繪圖參數:par()

函數 par() 用來獲取當前圖形的參數。如果加入 no.readonly=TRUE, 表示該參數列表是非只讀的,即用戶可以進行修改。例如對於上圖,我們獲取其參數,進行更改後再傳到新的圖中(pch 參數可能有些費解,我們在下文討論):

# 方法一:類交互式的更改方法opar <- par(no.readonly=T)par(pch=17) # 更改點樣式plot(x, y, type="b")par(opar)# 方法二:部分繪圖參數支持直接傳入參數# plot(x, y, type="b", pch=17)

點樣式、線寬與線型

參數可選值pch 點樣式0空方塊,1空圓,2空三角,3加號,4乘號,5斜空方塊,6空倒三角,7叉方塊,8星號,9斜叉方塊,10圈加號,11六芒星,12田,13圈乘號,14加框尖角,15方塊,16圓點,17三角,18斜方塊,19帶邊線圓點,20帶邊線2/3圓點,21填充圓,22填充方塊,23填充斜方塊,24填充三角,25填充倒三角。cex 點大小數字,例如 0.5。lty 線型1實線,2短虛線,3點線,4點劃線,5長虛線,6長短劃線。lwd 線寬數字。

注: pch = 19 相比 pch = 16,主要體現在 lwd 與 cex 不同時,帶邊線圓點的尺寸較大。

調整顏色的參數有:

col: 繪圖顏色。

col.axis:坐標軸刻度顏色。

col.lab:坐標軸名稱顏色。

col.main:圖形標題顏色。

col.sub:副標題顏色。

fg:圖形前景色。

bf:圖形背景色。

指定顏色的方式有如下幾種:

數字下標:col=1

名稱:col=」white」

十六進位值:col=」#FFFFFF」

標準化RGB/HSV值:col=rgb(0,1,1)/hsv(0,0,1)

至於 R 支持的顏色名稱,多達 600 餘種,這裡給出一些我認為常見的:

OutputColors <- function(color.names, titleStr="", showText=F) {
plot(1,1, axes=F, xlim=c(0, 6), ylim=c(0, 6), main=titleStr, xlab="", ylab="")
for (i in c(1:5)) {
for (j in c(1:5)) {
par(new=T)
plot(i, 6-j, cex=3, xlim=c(0, 6), ylim=c(0, 6), axes=F,
main="", xlab="", ylab="", pch=19,
col=color.names[(i-1)*5+j])
if (showText) {
text(i, 6-j-0.1, pos=1, color.names[(i-1)*5+j])
}
}
}}colorLst <- c("white", "red", "green", "blue", "brown",
"cyan", "gold", "gray", "plum", "magenta",
"orange", "purple", "yellow", "black", "violet",
"darkblue", "darkgreen", "darkred", "darkgray", "dimgray",
"lightblue", "lightgreen", "lightgray", "orchid", "pink")OutputColors(colorLst, "25 Useful Colors", T)

R 中還有其他方式可以生成一系列的顏色,比如:

par(mfrow=c(2 ,3))OutputColors(rainbow(25), "Rainbow")OutputColors(heat.colors(25), "HeatMap")OutputColors(terrain.colors(25), "TerrainMap")OutputColors(topo.colors(25), "Topo")OutputColors(cm.colors(25), "CM")# 灰度:需要標準化OutputColors(gray(1/25*c(0:25)), "Gray")

從上文可以看出端倪,標籤與標題參數有:

標題/副標題:title/sub

坐標軸標題:xlab/ylab

在標題中使用上文介紹的參數:

title(main="My Title", col.main="red",
sub="My Subtitle", col.sub="blue",
xlab="My X label", ylab="My Y label",
col.lab="green", cex.lab=0.75)

要定義它們的字體,可添加的參數有:

參數含義cex基礎縮放倍數cex.axis坐標軸刻度的縮放倍數cex.lab坐標軸標題的縮放倍數cex.main圖形標題的縮放倍數cex.sub圖形副標題的縮放倍數font字體樣式。1常規,2加粗,3加斜,4加粗加斜,5符號字體font.axis坐標軸刻度的字體樣式font.lab/ main/ sub類推ps字體磅值。文字的最終大小為 cex * psfamily字族。例如 serif襯線, sans無襯線, mono等寬

字族的使用需要注意:Windows 中,等寬映射為 Courier New,襯線 Times New Roman,無襯線 Arial。你可以使用 windowsFonts() 函數來更改或者創建映射,例如我個人常用的 DejaVu 等寬字體:

windowsFonts(
M=windowsFont("DejaVu Sans Mono"))plot(1, 1, type="n")# 字體示例text(1, 1.05, paste("DejaVu Sans Mono\n",
"0123456789!@#$%^&*()[]{}:;,.<>'/?`~",
"abcdefghijklmnopqrstuvwxyz",
"ABCDEFGHIJKLMNOPQRSTUVWXYZ",
sep="\n"), pos=1, family="M")

如果你需要將圖片輸出到 pdf,這個參數也是可以使用的:

pdf(file="filename.pdf", family="M")

參數 pin 用於指定圖形尺寸(英寸),例如 pin=c(4, 3) 表示 4 英寸寬 3 英寸高。

用 mai()/mar() 依次指定下左上右四個方向的邊距,單位分別是英寸與英分。默認是 mar(c(5, 4, 4, 2)) + 0.1

函數 side() 用於自定義坐標軸:

axis(side, at=, labels=, pos=, lty=, col=, las=, tck=, ...)

如果想使用次要刻度,請安裝 Hmisc 包。次要刻度的長度將會是主刻度的 tick.ratio 倍。

網格線使用 abline() 命令,並分別用 h/v 指定網格線是豎直還是水平。

# 需要加載:library(Hmisc)plot(1:3, 1:3, type="b", xlim=c(0, 4), ylim=c(0, 4))minor.tick(nx=2, ny=4, tick.ratio=0.5)abline(v=seq(0, 4, 0.5), h=seq(0, 4, 0.25), lty=2, col="darkred")

命令 legend() 用於添加圖例。

legend(location, legend, [title=, ...])

參數含義:

例子參見「直方圖」一節的最後一例。

主要有兩個函數:text() 與 mtext()。前者向繪圖區添加標註,後者向圖形的邊界添加標註。

text(location, "string", pos, ...)
mtext("string", side, line=n, ...)

可以參考「標籤和標題文本」一節的例子。其中:

類似 LaTeX 的標註方式,不過實質上仍有一些區別:

代碼效果代碼效果代碼效果x%+-%yx±yx±yx%/%yx÷yx÷yx%*%yx×yx×yx%.%yx⋅yx⋅yx[i]xixix^2x2x2x%prop%yx∝yx∝ysqrt(x, y)y√xxyx!=yx≠yx≠yx%~~%yx≈yx≈yx%=~%yx≅yx≅yx%==%yx≡yx≡y

部分字體相關的命令:

plain(x):正體

italic(x):義大利字族(加斜)

bold(x):加粗

bolditalic(x):加斜加粗

underline(x):下劃線

疊加繪圖最簡單的方法,就是使用繪圖的 new=TRUE:

plot( ... )plot( ... , new=TRUE) # 記得用 axes=FALSE 將坐標軸、標籤、標題隱藏掉

如果想要添加額外的點、線,使用 points() 命令與 lines() 命令。以及上面提到的參考線 abline() 命令:

plot(1:3, c(1,3,2), type="b", pch=2)points(1:3, seq(1.5, 2.5, 0.5), col="blue", pch=16)lines(1:3, seq(1.5, 2.5, 0.5), col="red")abline(v=1.5, h=2.25, lty=2,col="purple")

函數 layout() 是一個強大的命令。例如:

layout(matrix(c(1,1,2,3), 2, 2, byrow = TRUE))

就指定了圖 1 佔用第一行,圖 2 和 3 共用第二行。也可以用 widths=/heights= 參數指定各列寬/各行高之間的比例:

tmp <- c(rep("Cat", 3), rep("Dog", 4), rep("Rabbit", 2))dt <- table(tmp)layout(matrix(c(1, 1, 2, 3), 2, 2, byrow = TRUE),
widths=c(3, 1), heights=c(1, 2))barplot(dt)barplot(dt)barplot(dt)

前文介紹過的 par() 中的 mfrow= 參數也是一個控制子圖的方式。下例是兩行兩列的子圖:

opar <- par(no.readonly=TRUE)
par(mfrow=c(2,2))
plot(...) # 圖 1,左上
plot(...) # 圖 2,右上
plot(...) # 圖 3,左下
plot(...) # 圖 4,右下
par(opar)

這種方式支持你以任何的位置、組合任意的圖形。它比規整的 layout() 更加靈活。以下不使用 0.8 而使用 0.65 是為了看上去更緊湊。

opar <- par(no.readonly=TRUE)par(fig=c(0, 0.8, 0, 0.8)) # 主圖:橫向範圍與縱向範圍(左下為原點)barplot(dt)par(fig=c(0, 0.8, 0.65, 1), new=TRUE) # 上方的圖。注意 new 參數barplot(dt, axes=F)par(fig=c(0.65, 1, 0, 0.8), new=TRUE) # 右側的圖barplot(dt, axes=F, names.arg="")

直接上例子。

tmp <- c(rep("Cat", 3), rep("Dog", 4), rep("Rabbit", 2))dt <- table(tmp)barplot(dt, main="Title of Barplot", xlab="Pets", ylab="Number",
col="green", border="blue", density=c(5, 15, 25),
names.arg=paste("Pet", 1:3, sep=" "))

並不推薦的統計圖類型,因此 R 中的功能也很有限。

pie(x, labels=, ...)

dt <- 1:4lbl <- c("A", "B", "C", "D")pie(dt, labels=paste(lbl, " ", round(dt/sum(dt)*100), "%", sep=""),
col=topo.colors(length(lbl)), main="Pie Chart with Percentage")

直方圖表示的是一維的數據(連續型)特徵,縱軸是其在對應橫軸區間內的頻數或者頻率。

hist(x, freq=TRUE, breaks=, ...)

其中 freq 參數默認指定縱軸為頻數而不是頻率,break 用於指定橫軸上分組的個數。

set.seed(123)dt <- rnorm(100, mean=0, sd=1)par(mfrow=c(1,2))# 左圖:頻率直方圖,以及軸須圖hist(dt, freq=F, breaks=10, col="cyan", main="Hist fig 1")rug(jitter(dt)) # 如果有許多相同值,參數 amount=0.01 可將其隨機化lines(density(dt), col="purple", lwd=2)# 右圖:頻數直方圖,以及正態密度曲線h.plot <- hist(dt, breaks=10, col="lightgreen", main="Hist fig 2")xfit <- seq(min(dt), max(dt), length.out=40)yfit <- dnorm(xfit, mean=mean(dt), sd=sd(dt))yfit <- yfit*diff(h.plot$mids[1:2])*length(dt)lines(xfit, yfit, col="blue", lwd=2)box()

軸須圖是一種一維的數據呈現,而上面的左圖中的密度曲線是一種核密度估計。要比較核密度圖,參考 sm 包的 sm.density.compare() 函數。如果只是要繪製,使用 density() 函數輔助即可:

plot(density(dt), main="Kernel Denisty")polygon(density(dt), col="lightgreen", border="blue", lwd=2) # 繪製多邊形的函數# 疊加正態曲線xfit <- seq(min(dt), max(dt), length.out=40)yfit <- dnorm(xfit, mean=mean(dt), sd=sd(dt))lines(xfit, yfit, col="red", lwd=2)legend("topright", lty=c(1,1), col=c("blue", "red"),
legend=c("Kernel Density", "Normality Curve"))

或者叫箱線圖、盒須圖。它描述了連續變量的五個特徵參數:

fig <- boxplot(dt, main="Box Plot")paras <- c("Min", "25 percentile", "Mean", "75 percentile", "Max")text(1.25, fig$stats, paras, pos=4)text(0.9, fig$out, "Abnormal Points", pos=2)

如果是 dataframe 數據集中的類別型變量 A ,使用如下語句生成並列箱形圖:

boxplot(y~A, data=dataframe)

如果將公式改寫成 y~A*B,那麼會將類別型變量 A 和 B 的各水平兩兩組合,再生成箱形圖。

其他參數:

varwidth=F/T:為 TRUE 時,箱形圖的寬度與樣本數的算術平方根成正比。

horizontal=F/T:為 TRUE 時,箱形圖被橫置。

notch=F/T:為 TRUE 時,箱形圖在繪製時會顯示「凹槽」。

df <- data.frame(x=dt, type=NA)df <- df[order(df$x),]df$type <- c(rep("Smaller", 50), rep("Larger",50))boxplot(x ~ type, data=df, col="darkgray", main="Boxplot")

最後再提一下箱形圖與核密度圖的一個結合體:小提琴圖(violin plot)。這種圖的繪製需要 vioplot 包。

在小提琴圖中,核密度曲線被豎直放置,並對稱地顯示於數據軸的兩側:

# 需要加載:library(vioplot)vioplot(df$x[df$type == "Larger"], df$x[df$type == "Smaller"],
names=c("L", "S"), col="gold")

用於在水平刻度上繪製大量標籤。本例選自參考書目同名章節。各參數:

groups:選定一個因子,作為分組依據。

gcolor:各組標籤的顏色。

# mtcars 是 R 預裝的數據集,其 cyl 變量有三個水平x <- mtcars[order(mtcars$mpg),]x$cyl <- factor(x$cyl)x$color[x$cyl==4] <- "red"x$color[x$cyl==6] <- "blue"x$color[x$cyl==8] <- "darkgreen"dotchart(x$mpg,
labels = row.names(x),
cex=.7,
groups = x$cyl,
gcolor = "black",
color = x$color,
pch=19,
main = "Gas Mileage for Car Models\ngrouped by cylinder",
xlab = "Miles Per Gallon")

MySQL 面試之必會知識點

R語言文本分詞之——Rwordseg包

Python科學計算:pandas

Python科學計算:numpy

kmeans算法python代碼——可直接運行

梯度下降算法

相關焦點

  • R 語言入門學習路線與資源匯總
    剛開始學習R語言,可以看一些免費入門視頻,可以在B站上面搜,B站有很多免費的R語言入門視頻,比如《尚學堂尹鴻的R語言速成實戰》[1],這個視頻是免費的,視頻講義素材來源於《R語言實戰》的第一章到第六章,這幾章可以邊看書邊跟著視頻學習,用來簡單入門基本夠了。
  • R語言從入門到精通:Day1
    今天是我們的系統教程《R語言從入門到精通》的第一講,前面的背景講解中《從今天開始,每天學點R語言~》,已經深入探討過R語言的重要性以及學習R語言的必要性
  • 【萬字長文】R語言入門學習路線與資源匯總
    剛開始學習R語言,可以看一些免費入門視頻,可以在B站上面搜,B站有很多免費的R語言入門視頻,比如《尚學堂尹鴻的R語言速成實戰》[1],這個視頻是免費的,視頻講義素材來源於《R語言實戰》的第一章到第六章,這幾章可以邊看書邊跟著視頻學習,用來簡單入門基本夠了。
  • R語言從入門到精通:Day1-R語言的安裝
    今天是我們的系統教程《R語言從入門到精通》的第一講,前面的背景講解中《從今天開始,每天學點R語言~》,已經深入探討過R語言的重要性以及學習R語言的必要性
  • R編程與R繪圖
    這時候R語言編程就會派上用場。例如從大的方面來看,投資方要決定在何處建立風力發電場,就需要採集天氣數據加以建模分析,評估各項目方案。從小的方面來看,個人是否應該購買某個理財產品,你需要獲取過去的市場信息,模擬未來可能的變化,計算該項資產未來的期望收益和標準差。所以說學習R編程就是學習在數據環境中解決問題,從中磨練技術、鍛鍊智力,還能得到滿足的快感。
  • 手把手教學,R語言基礎繪圖
    R語言是用於統計分析、繪圖的語言和操作環境。R的統計分析能力突出,有強大的數據展示能力。
  • Matlab入門教程 | 010 Matlab 繪圖的萬能公式
    Matlab入門教程 | 008二維作圖:一文講透plot用法。Matlab入門教程 | 009二維作圖:看完此文,所有初等函數的圖像都會畫了!裡面的方法你都實操了嗎?掌握了嗎?這個笑話的深意就是:如何簡明而有效地表達複雜思想——藉助數學語言!言歸正傳!
  • R語言從入門到精通:Day2
    今天,我們就開始進入到《R語言從入門到精通》的第二節:R和RStudio的使用。上節課程中,我們講解了R和RStudio的安裝,本節內容我們來學習如何使用他們。有同學可能覺得簡單,那不就是打開軟體直接敲擊幾個命令就行了嘛。其實不然哦,R和RStudio是我們這一系列課程最重要的基礎,特別是RStudio的使用,所以我們有必要把它們兩個詳細系統地給大家講解一下。
  • 123.R簡介和統計繪圖
    本文教程的原始碼見123R簡介和統計繪圖.Rmd,實戰代碼詳見R.Rmd。為什麼要學習R圖. R常用圖形 https://www.r-graph-gallery.com/為什麼選擇R?多領域的資源, CRAN收錄16170個R包 (20年9月1日),涵蓋了統計學、經濟學、生態學、進化生物學、生物信息學、物理、化學等多學科。
  • R語言 ggplot2 繪圖入門,看完你就理解ggplot2的繪圖邏輯了
    R語言最擅長繪圖。R語言最擅長的繪圖包是ggplot2,由於很多朋友沒有接觸過ggplot2,必須要對其語言方式有個初步的認識。
  • R語言學習路線和常用數據挖掘包
    對於初學R語言的人,最常見的方式是:遇到不會的地方,就跑到論壇上吼一嗓子,然後欣然or悲傷的離去,一直到遇到下一個問題再回來。那麼,眾多書籍中,一個生手應該從哪一本著手呢?入門之後如何才能把自己練就成某個方面的高手呢?相信這是很多人心中的疑問。有這種疑問的人有福了,因為筆者將根據自己的經歷總結一下R語言書籍的學習路線圖以使Ruser少走些彎路。本文分為6個部分,分別介紹初級入門,高級入門,繪圖與可視化,計量經濟學,時間序列分析,金融等。
  • R語言繪圖(ggplot2、ggpurb)從入門到精通01--課程介紹
    本系列課程要求大家有一定的R語言基礎,對於完全零基礎的同學,建議去聽一下師兄的《生信必備技巧之——R語言基礎教程》。本課程將從最基本的繪圖開始講解,深入淺出的帶大家理解和運用強大而靈活的ggplot2包。內容包括如何利用ggplot2繪製散點圖、線圖、柱狀圖、添加註解、修改坐標軸和圖例等。
  • R語言書單:從入門到進階都在這!
    從事大數據行業的人都清楚,R是用於統計分析、繪圖的語言和操作環境,同時它還是一個用於統計計算和統計製圖的優秀工具。
  • R語言從入門到精通:Day10-R語言統計入門代碼大全
    到目前為止,R語言的數據操作和基礎繪圖部分已經講解完畢,換句話說,大家應該已經能將數據導入R中,並運用各種函數處理數據使其成為可用的格式,然後將數據用各種基礎圖形展示
  • R語言——ggplot2的繪圖邏輯
    在R語言裡,談及繪圖,ggplot2是最出名的繪圖包之一,作為一個繪圖神器,它提供了許許多多的功能給用戶使用,僅用短短幾行代碼,一幅幅高端大氣的圖像便躍然紙上,這可能就是ggplot2包的魅力所在。,    #ggplot2繪圖                         y=Sepal.Width))+        #繪製底層畫布                         geom_point(color = "darkred")    #在畫布上添加點從上述代碼可以看出,ggplot繪圖有以下兩個特點:(1)有明確的開始
  • R語言從入門到精通:Day6-R語言數據操作進階及控制結構
    最近經過前面幾次推文的學習,我們的R語言教程已經講解了快1/3的內容,相信大家對R語言已經有了初步的了解,特別是感受了R語言在數據處理領域的強大功能
  • 快速入門 | 學習 R 語言
    與 C 語言和 Python 不同x[3][1] 4提取子集注意:R 語言中的範圍包含最後一個元素,即使用閉區間 [a, b]!函數入門與 Python 類似,函數同樣是 R 語言編程的核心下面的函數統計向量中奇數的個數其中 %% 是求餘操作符(Python 中是 %)oddcount <- function(x) { k <- 0 for (n in x) { if (n %% 2 == 1) k <
  • 【零基礎入門】手把手帶你系統化學習R語言
    如果說有一門簡單易學、通俗易懂並且集上述功能為一體的程式語言讓科研人員從中解脫出來,R語言當仁不讓。 R語言是一款免費開源軟體,其提供了超過12000個R包,幾乎所有類型的數據分析任務都可以在R中完成。
  • R語言之plot繪圖函數的使用
    R有強大的繪圖功能,plot()函數是一種常用的繪圖函數,用其可以繪製散點圖、曲線圖等。plot函數的語法格式R語言中plot()函數的基本格式如下:plot(x,y,...)主要參數的含義如下:(1)type為一個字符的字符串,用於給定繪圖的類型,可選的值如下:"p":繪點(默認值);"l":繪製線;"b":同時繪製點和線;"c":僅繪製參數
  • R語言繪圖之ggplot2
    當我們看到很多優美的繪圖時,你是否會有據為己有的衝動?我反正是有的。