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()

從圖中我們可以看到,theme_bw()是白色背景、灰色網格、有邊框。除此之外,還有很多其他主題,讀者可以在rstudio中打出 theme 就會自動彈出選項補全函數。

我們可以使用這種現成的主題,也可以自行定製,或者修改當前主題

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

推薦閱讀:

【譯文】R語言不平衡數據分類指南
【機器學習】確定最佳聚類數目的10種方法
第二篇——用幾分鐘了解R語言入門知識

TAG:R编程语言 | 绘图 | 统计 |