ggplot2包的繪圖邏輯簡介

2021-02-13 R語言統計與繪圖

在R語言裡,談及繪圖,ggplot2是最出名的繪圖包之一,作為一個繪圖神器,它提供了許許多多的功能給用戶使用,僅用短短幾行代碼,一幅幅高端大氣的圖像便躍然紙上,這可能就是ggplot2包的魅力所在。

我剛開始學習ggplot2的時候只用於學術上的製圖,對深層的製圖一知半解,趁著有空便重新學習了一下ggplot2包,才發現其背後的製圖邏輯竟然跟GIS的圖層疊加有著高度的相似,下面就是我學習到的內容了。

這次使用的數據集是R包內置的iris數據集,是由Edgar Anderson記錄的3種鳶尾花形態數據。其中一個種類與另外兩個種類是線性可分離的,後兩個種類是非線性可分離的。

iris以鳶尾花的特徵作為數據來源,常用在分類操作中。該數據集由3種不同類型的鳶尾花的各50個樣本數據構成。其中的一個種類與另外兩個種類是線性可分離的,後兩個種類是非線性可分離的。

該數據集包含了4個屬性:

Sepal.Length(花萼長度),單位是cm;

②Sepal.Width(花萼寬度),單位是cm;

③Petal.Length(花瓣長度),單位是cm;

④Petal.Width(花瓣寬度),單位是cm;

⑤Species(種類):Iris Setosa(山鳶尾)、Iris Versicolour(雜色鳶尾),以及Iris Virginica(維吉尼亞鳶尾)。

我們用相同的數據,通過plot函數跟ggplot函數分別繪製散點圖來簡單理解一下兩者的差異:

library("ggplot2")    #加載安裝好的ggplot2包plot(iris$Sepal.Length, iris$Sepal.Width) #plot繪圖ggplot(data = iris,aes(x = Sepal.Length,    #ggplot2繪圖                         y=Sepal.Width))+        #繪製底層畫布                         geom_point(color = "darkred")    #在畫布上添加點

從上述代碼可以看出,ggplot繪圖有以下兩個特點

(1)有明確的開始(以ggplot函數開始)與終止(一條語句一幅畫) ;

(2)ggplot2語句可以理解成一條語句一幅畫,然後通過圖層疊加,疊加通過「+」號將繪圖的語句連接起來。

上面介紹的ggplot2繪圖有明確的開始,即以ggplot函數作為開始的標誌,那麼ggplot()有什麼用呢? 

它的主要功能在於初始化一個ggplot對象,且不指定繪圖內容,格式如下:

ggplot(data = NULL, mapping = aes(), ...,environment = parent.frame())

其中,data指的要繪圖的數據集,它會被制定為繪圖環境,載入之後就不需要寫大量的$符號來提取data.frame裡面的向量的操作。如果數據都是向量,那麼也可不指定,但要在聲明中標註data=NULL,否則會有不必要的報錯。 

數據與圖形屬性之間的映射關係稱mapping。

ggplot對象的data存儲了整個屬性框的內容,而mapping則確定如何使用這些數據。圖形的可視屬性包括如形狀、顏色、透明度等美學屬性,確定美學屬性與數據之間的對應關係一般用aes函數。常見的圖形屬性包括x、y、size、color、group.

比如,當data=iris時,mapping= aes(x = Sepal.Length, y = Sepal.Width)表示將花 萼長度作為x軸變量,將花萼寬度作為y軸變量。如果需要將Species映射到形狀或者顏色屬性,可以添加shape=Species或者colour = Species. 使用ggplot函數繪製底層畫布

ggplot(data = iris, aes(x = Sepal.Length,                             y = Sepal.Width,                             colour = Species,                             shape = Species))

除了數據與映射之外,一個圖層還應該至少包含位置、stat、position這三個圖形屬性。

幾何對象簡單來說就是採用展示數據的圖形類型。

如散點圖、條形圖等,ggplot2包提供了許多的圖形類型供用戶使用。

描述

幾何對象函數

描述

geom_abline 

線,由斜率和截距指定

geom_jitter     

點,自動添加了擾動

geom_area   

面積圖

geom_line 


geom_bar

條形圖

geom_path

幾何路徑

geom_bin2d 

二維封箱的熱圖

geom_point 


geom_blank

空的幾何對象,什麼都不畫

geom_pointrange 

一條垂直線,線中間有一個點

geom_boxplot 

箱線圖

geom_polygon  

多邊形

geom_contour

等高線圖

geom_quantile

一組分位數線

geom_crossbar

類似於箱線圖,但無觸鬚和極值點 

geom_rect

二維長方形 

geom_density

密度圖

geom_ribbon

彩虹圖

geom_density2d

二維密度圖

 geom_rug

觸鬚 

geom_errorbar

誤差線

geom_segment

線段 

geom_errorbarh 

水平誤差線

geom_smooth

平滑的條件均值

geom_freqploy 

頻率多邊形

geom_step  

階梯圖 

geom_hex

六邊形圖

geom_text 

文本

geom_histogram

直方圖

geom_tile

瓦片

geom_hline

水平線



如果要在畫布上繪製散點圖的話,則只需在「+」號後面添加函數geom_point即可:
ggplot(data = iris)+   #繪製底層畫布geom_point(aes(x = Sepal.Length,                      y = Sepal,Width,                      colour = Species,                      shape = Species))

統計類型stat是指對數據所應用的統計類型和方法。

上述代碼中沒有指定統計類型,但自動獲得identity,因為ggplot2會默認為每一種幾何類型都指定一種默認的統計類型,反之亦然。其中stat_identity表示不做任何的統計變換。運行代碼如下:

ggplot(iris)+  geom_bar(aes(x = Sepal.Length,               stat = "bin",                binwidth = 0.5))

aes函數設定了數據與圖形屬性的映射關係,但是數據怎麼映射為屬性則是標尺(Scale) 的功能。

對於任何一個圖形屬性,如x,y,alpha,color,fill,linetype,shape,size等,ggplot2都提供以下4種標尺:

(1)scale_*_continuous:將數據的連續取值映射為圖形屬性的取值

(2)scale_*_discrete:將數據的離散取值映射為圖形屬性的取值

(3)scale_*_identity:將數據的值作為圖形屬性的取值 

(4)scale_*_mannual:將數據的離散取值作為手工指定的圖形屬性的取值

隨機從iris數據集的150個樣本中抽取100個樣本,並繪製條形圖以反映100個樣本中各個鳶尾花,並繪製條形圖以反映100個樣本中各個鳶尾花種類的數量情況,然後提供修改標尺參數做前後對比圖。代碼如下:

set.seed(1234)my_iris <- iris[sample(1:150,100,repleace = FALSE)]p <- ggplot(my_iris) +    geom_bar(aes(x = Species,fill = Species))p #修改標尺參數前的圖形p <- p +scale_fill_manual(   values = c("orange","olivedrab","navy")    #顏色設置   breaks = c("setosa","versicolor","virginica")  #圖例和軸要顯示的分段點   name = "my_Species",   #圖例和軸使用的名稱   labels = c("set","ver","vir")   #修改標尺參數後的圖)

可以使用scale_color_manual函數或scale_color_brewer函數修改圖形的顏色。比如對iris數據集中的Sepal.Length與Sepal.Width的散點圖分別使用scale_color_manual函數或scale_color_brewer函數修改圖形顏色,代碼如下:

#圖一:使用scale_color_manual函數ggplot(iris,aes(x = Sepal.Length,                y = Sepal.Width,                colour = Species))+  scale_color_manual(values = c("orange","olivedrab","navy"))+  geom_point(size = 2)

#圖二:使用scale_color_brewer函數ggplot(iris,aes(x = Sepal.Length,                y = Sepal.Width,                colour = Species))+  scale_color_brewer(palette = "Set1") +  geom_point(size = 2)

使用scale_color_manual函數修改顏色

使用scale_color_brewer函數修改顏色

ggplot2默認的坐標系是笛卡爾坐標系

(1)可以使用以下方法指定坐標系的取值範圍coord_cartesian(xlim = c(0,5),ylim = c(0.3))。

(2)如果要讓x軸跟y軸交換位置,則可以使用coord_flip函數。 

(3)如果要使用角度坐標系,可以使用以下方法進行轉換:coord_polar(theta = "x",start =0,direction = 1) ,這裡theta指定角度對應的變量,start指定離12點鐘方向的偏離值若direction = 1,則表示順時針方向;若direction = -1,則表示逆時針方向。

# 1.餅狀圖 = 堆疊長條圖+角度坐標系pie <-ggplot(my_iris,aes(x = factor(1),                         fill = Species))+  geom_bar(width = 1) #堆疊長條圖pie + coord_polar(theta = "y")
# 2. 靶心圖 = 餅狀圖 + polar coordinatespie + coord_polar()
#3. 鋸齒圖 = 柱狀圖 + polar coordinatescxc = ggplot(my_iris,aes(x = Species))+  geom_bar(width = 1,          colour = "black")cxc+coord_polar()

分面就是分組繪圖,即根據定義的規則將數據分為多個子集,每個子集按照一定的規則單獨繪圖,排布在一個頁面上。ggplot2提供兩種分面函數:facet_grid函數和facet_wrap函數。

gather(data,key,value,...,na.rm = FALSE,convert =FALSE,factor_key =FALSE)

這裡,facet_grid函數是一個二維的矩形布局,每個自己的位置由行位置變量和列位置變量控制。下面以Species的取值作為一列,將feature_name的取值作為一行作為示例:

library(ggplot2)library(tidyr)library(dplyr)my_iris1 <-iris %>% gather(feature_name,                           feature_value,                           one_of(c("Sepal.Length",                                    "Sepal.Width",                                    "Petal.Length",                                    "Petal.Width"))) #數據變換ggplot(my_iris1)+  geom_violin(aes(x = Species,                  y = feature_value))+ #繪製小提琴圖  facet_grid(feature_name ~ Species,             scales = "free") #分面

facet_wrap函數會生成一個動態調整的一維布局,根據「~位置變量1+位置變量2+...」來確定每個子集的位置,先逐行排列,放不下了再移到下一行。以my_iris1數據集作為例子,操作代碼如下:

ggplot(my_iris1)+  geom_violin(aes(x = Species,                  y = feature_value))+  facet_wrap(~feature_name + Species,             scales = "free")

ggplot2包提供了ggsave函數進行圖形保存

格式如下:

ggsave(filename,width,height,...)

其中,filename為保存的文件名和路徑,width為圖像寬度,height為圖像高度,例如在當前工作目錄下生成一個名為「test」的PDF圖形,代碼如下:

ggplot(iris,aes(x = Sepal.Length,                y = Sepal.Width,                colour = Species))+  geom_point(size = 2)ggsave(file = "test.pdf",       width = 2,       height = 4)

ggplot2包的繪圖邏輯介紹到這裡了,當然還有很多很多其他東西,這裡就不一一贅述了,想學習更多的可以在某度或者查看幫助文檔喔。學無止境,披荊前行!

相關焦點

  • R語言 ggplot2 繪圖入門,看完你就理解ggplot2的繪圖邏輯了
    R語言最擅長繪圖。R語言最擅長的繪圖包是ggplot2,由於很多朋友沒有接觸過ggplot2,必須要對其語言方式有個初步的認識。
  • R語言繪圖之ggplot2
    那麼今天我們就為大家介紹一下目前在R語言中流行的繪圖包ggplot2。1. ggplot2的安裝:install.packages("ggplot2")。2. ggplot2的繪圖原理: ggplot2的核心理念是將繪圖與數據分離,數據相關的繪圖與數據無關的繪圖分離,並按圖層作圖。
  • R語言——ggplot2的繪圖邏輯
    在R語言裡,談及繪圖,ggplot2是最出名的繪圖包之一,作為一個繪圖神器,它提供了許許多多的功能給用戶使用,僅用短短幾行代碼,一幅幅高端大氣的圖像便躍然紙上,這可能就是ggplot2包的魅力所在。我剛開始學習ggplot2的時候只用於學術上的製圖,對深層的製圖一知半解,趁著有空便重新學習了一下ggplot2包,才發現其背後的製圖邏輯竟然跟GIS的圖層疊加有著高度的相似,下面就是我學習到的內容了。這次使用的數據集是R包內置的iris數據集,是由Edgar Anderson記錄的3種鳶尾花形態數據。
  • ggplot2|詳解八大基本繪圖要素
    按照ggplot2的繪圖理念,Plot(圖)= data(數據集)+ Aesthetics(美學映射)+ Geometry(幾何對象)。本文將從ggplot2的八大基本要素逐步介紹這個強大的R可視化包。
  • Python數據可視化--在Python中調用ggplot進行繪圖
    如果你熟悉R語言,那麼你一定聽過ggplot2,它是R語言中非常好的數據可視化包,容易學習,功能強大。
  • R繪圖之ggplot2—添加注釋
    去掉這行代碼,如何達到花花那樣的效果呢,可以使用下面這行代碼annotate("text",x = 1.8,y = Inf,label = "Kruskal-Wallis,p = 0.00061",vjust = 1)如何更靈活的添加注釋呢,下面我們來詳細的了解一下annotate函數第一部分: 函數簡介
  • 基於ggplot2包繪製SCI學術箱線圖的保姆級教程
    具體含義可通過如下圖表進行說明:圖源網絡,侵刪本期推文使用ggplot2包來繪製箱線圖。1. 加載數據、數據在後臺回復箱線圖即可免費獲取。2. 繪製基本箱線圖使用ggplot2包繪製箱線圖很簡單,主要使用geom_boxplot()函數,先採用默認的參數繪製。
  • 123.R簡介和統計繪圖
    123R簡介和統計繪圖本節作者:劉永鑫 中國科學院遺傳與發育生物學研究所;陳同 中國中醫科學院版本1.0.2,更新日期:2020年
  • ggplot2|theme主題設置,詳解繪圖優化-「精雕細琢」
    學習了ggplot2的基本繪圖元素ggplot2|詳解八大基本繪圖要素,可以初步繪製出需要展示的圖形
  • ggplot繪圖系統精華帖~
    本文轉載自公眾號:每天都有進步ggplot2 Pk 基本繪圖
  • Python語言plotnine VS R語言ggplot2
    ggplot2包是由Hadley Wickham在2005年創造。
  • eoffice包--R繪圖到office
    老師在微信群裡分享了別人寫的一篇推送AI不會,沒關係,R可以導出PPT格式的圖形啦,作者介紹了eoffice這個包。
  • 基於ggplot2包繪製SCI學術散點圖,又是保姆級教程
    本期推文,我們使用ggplot2包繪製學術擬合散點圖。1. 加載數據數據在後臺回復散點圖即可獲取。Tset data",    subtitle = "scatter R-ggplot2 Exercise(no color)",    caption = 'DataCharm 公眾號原創\nR語言統計與繪圖 公眾號轉載')plot
  • ggplot2拓展功能:局部放大和邊際密度圖
    library(ggplot2)p <- ggplot(iris, aes(Sepal.Length, Sepal.Width)) + geom_point(aes(color = Species), size = 3, alpha = 0.6) + scale_color_manual(values = c("#00AFBB", "#E7B800
  • ggplot2|繪製GO富集柱形圖
    本文利用R語言的ggplot2包,從頭帶您繪製可發表級別的GO富集分析結果圖。利用各種生信工具得到富集分析結果,數據列可能不一致,但關鍵幾列都有。3.3 調整label長度後繪圖GO_term_order=factor(as.integer(rownames(data)),labels=labels)COLS <- c("#66C3A5", "#8DA1CB", "#FD8D62")ggplot(data=data, aes(x=GO_term_order,y=Num_of_symbols_in_list_in_GO
  • 微課|ggplot2: 折線圖
    使用ggplot2繪製折線圖.折線圖整體美化.繪製平滑折線圖.繪製多變量折線圖.
  • R語言的ggplot2+ggforce包繪製散點圖並添加分組邊界
    之前的推文介紹過ggplot2繪圖添加橢圓分組邊界和圓形分組邊界,藉助的函數分別是ggforce包裡的geom_circle()函數今天查找桑基圖的資料的時候發現了一份介紹ggforce這個包的使用方法的文章 https://rviews.rstudio.com/2019/09/19/intro-to-ggforce/ ,發現發現添加分組邊界還有其他的實現方法,今天的推文記錄一下
  • ComplexHeatmap |理解繪圖邏輯繪製熱圖
    當然最簡單的還是使用高顏值可定製在線繪圖工具-第三版直接在線繪製。知識學雜了也可以融會貫通,下面看看的Complexheatmap繪圖邏輯,應該會對理解數據、圖形、程序有些新的體會。簡介Complexheatmap是由DKFZ的顧祖光博士創建的繪製熱圖的R包,基於繪圖系統grid,因此如果有相應grid的知識,學習起來應該更順手。
  • 高階可視化繪圖系統:ggplot2入門
    更加深入學習ggplot2,請參考《ggplot2: 數據分析與圖形藝術》。目 錄引言:ggplot2基本要素1.library(ggplot2)#繪製基本ggplot圖base <- ggplot(mpg, aes(displ, hwy)) + geom_point()p1 <- base + geom_smooth() + labs(title="圖1") #如圖1#用%+%調整映射關係中的數據base <- ggpl
  • 數據處理基礎—ggplot2了解一下
    ggplot2是由Hadley Wickham設計的R軟體包,它有助於數據繪圖。在本實驗中,我們將簡要介紹該軟體包的一些功能。如果您想了解更多關於如何使用ggplot2的信息,我們建議您閱讀Hadley Wickham撰寫的「ggplot2 Elegant graphics for data analysis」。