R|ggplot2(一)|一個完整的繪圖流程
這一塊內容包括如下幾個部分
- 首先簡單畫一個圖出來
- 做一些等價調整
- 接受另一種類型的數據
- 簡單的參數調整
- 縱坐標使用百分比表示
- 更改橫縱軸坐標、標題等
- 在圖中增加標註的文字
- 調整字體、背景等,達成excel的效果
- 保存圖形
首先簡單畫一個圖出來
# 我們拿到這樣的數據name <- c("多","中","少","中","少")data <- data.frame(name) # 轉化為數據框library(ggplot2)# 簡單地畫出一個圖ggplot(data,aes(x=name)) + geom_bar()
從上面我們知道如下信息
- ggplot2作圖需要輸入數據框
- 作圖時我們沒有輸入頻數,函數會自動數出三種類型有多少
- ggplot函數中一般接兩個參數,一個是數據框data,一個是用來做圖的列,放在aes裡面,這一點讀者先記住就好,我們會在講分組作圖的部分中詳細解釋
- 使用數據框中的列時,不需要使用$引用,直接使用列名就可以(只有放在aes中才可以)
- 前面ggplot函數指定使用的數據,使用」+」來連接其他函數,geom_類函數表示作圖類型,geom_bar是做柱狀圖的函數,如果要做點圖就 + geom_point(),當然,點圖的話前面就要加入兩個參數x和y
# 畫點圖代碼如下,讀者可以自己運行data1 <- data.frame(a=1:3,b=3:1)ggplot(data1,aes(a,b)) + geom_point()
下面我們做一點微調
- 指定哪一列的aes()放在ggplot函數還是geom_bar函數中無所謂
- 先做好的部分可以賦值保存,再去加其他內容
下面幾種作圖等價
ggplot(data,aes(x=name)) + geom_bar()ggplot(data) + geom_bar(aes(x=name))p <- ggplot(data,aes(x=name)) p + geom_bar()
接受另一種類型的數據
我們畫柱狀圖是使用的數據一般有兩種
- 一種是像上面那種,所有內容列出來,函數內部自己數
- 一種是 名字-頻數 對應形式
當我們得到的是 名字-頻數 形式的數據,也可以作圖
data1 <- data.frame(table(name)) # 將數據轉化為 名字-頻數 形式data1# name Freq# 1 多 1# 2 少 2# 3 中 2ggplot(data1,aes(x=name,y=Freq)) + geom_bar(stat="identity") # 和上圖相同
上面我們發現以下信息
- aes()中接受了兩個參數,分別代表 名字-頻數
- geom_bar函數中加了一個參數stat=」identity」,表示不要像之前一樣去查數,而是就使用數據Freq本身作為頻數
簡單的參數調整
上面的圖片中,我們發現簡單的代碼就能畫出比較高大上的圖形。仔細觀察這張圖片。會發現函數默認設置了灰色背景、深灰色柱子、白色網格線、去掉圖片邊框等,正是這些默認的設置,讓ggplot2包的簡單代碼作圖遠勝於基礎函數作圖。
不過如果你對這些設置還不滿意,這些都是可以調整的,下面圖形沒有巨大改變,就不放圖片了,讀者可以自行嘗試
p <-ggplot(data,aes(x=name))p + geom_bar(col="red") # 調整柱子邊框顏色為紅色(注意這裡col不是柱子顏色)p + geom_bar(fill="red") # 調整柱子顏色為紅色(fill才是柱子內部顏色)p + geom_bar(width_=0.5) # 調整柱子寬度,1時兩個柱子挨在一起,0.5則寬度是1時的一半
縱坐標使用百分比表示
library(dplyr) # ggplot2 包常常和dplyr包一起使用data1 <- data.frame(table(name))data2 <- data1 %>% mutate(f=Freq/sum(Freq))# 使用scales包中很方便的方法ggplot(data2,aes(name,f)) + geom_bar(stat="identity") + scale_y_continuous(labels = scales::percent)# 另外一種實現方法ggplot(data2,aes(name,f)) + geom_bar(stat="identity") + scale_y_continuous(breaks=seq(0,0.4,len=5), labels=paste(seq(0,0.4,len=5)*100,"%"))
這裡使用的 scale_y_continuous 函數表示當y軸是連續數值時,調整其標度。如上面代碼所示,第一種是使用scales包中的特殊表示方法,如果是常規使用方法,應該是下面這種表示方式。breaks表示在軸上哪些點的位置標標籤,labels表示標什麼標籤。
如果想讓坐標軸表示0-0.5的範圍也只要用 limits 參數調整即可
ggplot(data2,aes(name,f)) + geom_bar(stat="identity") + scale_y_continuous(breaks=seq(0,0.4,len=5), labels=paste(seq(0,0.4,len=5)*100,"%"), limits = c(0,0.5))
更改橫縱軸坐標、標題等
p1 <- ggplot(data,aes(x=name)) + geom_bar(width_=0.7)p1 + xlab("種類") + ylab("") + ggtitle("運動情況")
所以更改 橫縱軸坐標、標題 都是通過 + 特定的函數來實現的,而不可以在原有函數中增加參數來實現。
在圖中增加標註的文字
p2 <- ggplot(data,aes(x=name)) + geom_bar(width_=0.7,fill=rgb(50,163,221,maxColorValue=255)) + xlab("種類") + ylab("") + ggtitle("運動情況")(p3 <- p2 + geom_text(stat="count", label=paste(table(name)/sum(table(name))*100,"%",sep=""), colour = "black", vjust=-0.5, size=4.7))
增加標註文字使用geom_text函數,參數label表示標什麼,後面參數調整顏色、位置和大小。
調整字體、背景等,達成excel的效果
這裡調整也要使用函數,還涉及到ggplot2包中使用比較麻煩的一塊——theme設置
ggplot2中默認使用的主題是灰色背景、白色網格、無邊框,同時,它還定義了一些特殊的主題,只要通過+連接就可以使用
p3 + theme_bw()
我們可以使用這種現成的主題,也可以自行定製,或者修改當前主題
mytheme <- theme_bw() + theme(plot.title=element_text(size=rel(2),hjust=0.5), axis.title=element_text(size=rel(1.5)), axis.text=element_text(size=rel(1.5)), panel.grid.major=element_line(color="white"), panel.grid.minor=element_line(color="white"), panel.border=element_rect(color="white"), axis.line=element_line(color="gray",size=1))p3 + mytheme
這樣自己定義好的主題,就可以應用到其他各種圖形中
下面解釋一下theme函數中的參數。這裡應該說有兩層參數,一層是plot.title等theme函數的參數,第二層是size等element_函數參數,這就是theme設置複雜的原因。
參數的作用都可以根據名字顧名思義了
- plot.title 調整標題文字,size 和 hjust參數則調整大小和位置(此處居中)
- 後面調整軸名、標註名、網格線、坐標軸顯示情況等內容
theme的問題我們之後會專門講述,這裡只是想讓讀者知道,這些設置都要在theme中調整,而不要以R中基礎繪圖的思路,想直接在geom_bar函數中使用參數設置。
保存圖形
ggplot2包中有專門的保存函數ggsave
ggsave("1.png", dpi=300) # 默認保存最近的作圖ggsave("1.png", dpi=300, plot=p3) # 自己指定保存的圖片
到這裡,我們講述了一個簡單柱狀圖繪製的基本流程。當然,很多時候沒有必要調整那麼多參數,直接使用默認的圖形就已經非常令人滿意了,作圖保存兩行代碼就搞定。這裡講這麼多是為了能應對更多需求,完善自己的知識體系。
接下來,我會具體講述更加複雜的需求,和一些需求的具體解釋。
專欄信息
專欄主頁:Data Analysis
專欄目錄:目錄文末彩蛋
這裡講一下各種賦值符號的區別,R語言中賦值符號有如下幾種:= <- -> <<-
它們的區別有一下幾點
- <- 是R語言中對變數賦值的符號,這和其他語言使用=不同
- =是函數中對參數的賦值,不過用於變數賦值也可以,但是還是推薦用 <-
- -> 是把前面內容賦值給後面參數的符號,為了代碼規範,不推薦使用
- <<- 是改變作用域的賦值,在函數中使用,變數名在函數外面依然可以使用
->的使用
a <- 1:41:4 -> ba;b # 都可以實現賦值
=與<- 的區別
m=1:4;mn <- 1:4;n # 正常賦值沒區別f <- function(y,x) x+1f(x=2) # 讓參數x為2,正常返回3f(x <- 2) # 報錯f <- function(y,x) x+1f(0,2) # 3f(0,aa <- 2) # 3f(0,aa = 2) # 報錯,沒有這個參數aa
在函數中使用<- 的邏輯是,先賦值2給x,再讓這個結果作為函數f的第一個參數,也就是讓y是2,而函數要使用x進行計算,自然會報錯
<-與<<-的區別
f1 <- function(x) (y<-x+1)f2 <- function(x) (y<<-x+1)f1(2)y # Error: object "y" not foundf2(2)y # 3
這說明在函數中使用<<-賦值,變數名可以函數外面被調用,這涉及到變數的作用空間問題,本專欄以後還會專門講述
不過如果調用函數時使用了賦值號,這個變數是可以再外部使用的,因為它相當於在外部賦值之後,再作為參數傳輸進去的
f1(abcd <- 2)abcd # 2f1(abc <<- 2)abcf1(x = 2)x # Error: object "x" not found
推薦閱讀: