【R畫圖】手把手教你使用ggplot2繪製折線圖

2021-02-13 R語言

折線圖同樣是應用非常廣泛的統計圖之一,通過折線圖可以反映某種現象的趨勢。通常折線圖的橫坐標是為時間變量,縱坐標則是一般性的數值型變量,當然,折線圖也允許橫坐標為離散型數值和數值型數值。下面來解釋一下關於折線圖的繪製。

一、繪製單條折線圖

library(ggplot2)#有關時間序列的折線圖library(lubridate) #處理日期時間相關的R包,非常有用,強烈推薦Year <- year(seq(from = as.Date('2006-01-01'), to = as.Date('2015-01-01'), by = 'year'))Weight <- c(23,35,43,57,60,62,63,66,61,62)df <- data.frame(Year = Year, Weight = Weight)ggplot(data = df, mapping = aes(x = factor(Year), y = Weight, group = 1)) + geom_line() + xlab('Year')

#有關離散變量的折線圖type <- c('A','B','C','D','E')quanlity <- c(1,1.1,2.1,1.5,1.7)df <- data.frame(type = type, quanlity = quanlity)ggplot(data = df, mapping = aes(x = type, y = quanlity, group = 1)) + geom_line()


#有關連續變量的折線圖set.seed(1234)times <- 1:15value <- runif(15,min = 5,max = 15)df <- data.frame(times = times, value = value)ggplot(data = df, mapping = aes(x = times, y = value)) + geom_line()


善於發現的你,可能會注意到上面三段代碼有一個重要的不同之處,那就是第一段和第二段代碼中含有『group = 1』的設置。這樣做是因為橫坐標的屬性設置為了因子,即將連續型的年份和離散型的字符轉換為因子,如果不添加『group = 1』這樣的條件,繪圖將會報錯。故務必需要記住這裡的易犯錯誤的點!

往折線圖中添加標記(點)當數據點密度比較小或採集分布(間隔)不均勻時,為折線圖做上標記將會產生非常好的效果。處理的方法非常簡單,只需在折線圖的基礎上再加上geom_point()函數即可。

set.seed(1234)year <- c(1990,1995,2000,2003,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015)value <- runif(15, min = 10, max = 50)df <- data.frame(year = year, value = vlaue)ggplot(data = df, mapping = aes(x = year, y = value)) + geom_line() + geom_point()


從圖中就可以非常明顯的看出,剛開始採集的點分布非常散,而後面採集的點就比較密集,這也有助於對圖的理解和應用。

二、繪製多條折線圖上面繪製的都是單條這折線圖,對於兩個或兩個以上的折線圖該如何繪製呢?也很簡單,只需將其他離散變量賦給諸如colour(線條顏色)和linetype(線條形狀)的屬性即可,具體參見下文例子。

#基於顏色的多條折線圖set.seed(1234)year <- rep(1990:2015, times = 2)type <- rep(c('A','B'),each = 26)value <- c(runif(26),runif(26, min = 1,max = 1.5))df <- data.frame(year = year, type = type, value = value)ggplot(data = df, mapping = aes(x = year, y = value, colour = type)) + geom_line()


#基於形狀的多條折線圖ggplot(data = df, mapping = aes(x = year, y = value, linetype = type)) + geom_line()


同樣需要注意的是,在繪製多條折線圖時,如果橫坐標為因子,必須還得加上『group=分組變量』的參數,否則報錯或繪製出錯誤的圖形。

以上繪製的折線圖,均採用默認格式,不論是顏色、形狀、大小還是透明度,均沒有給出自定義的格式。其實ggplot2包也是允許用戶根據自己的想法設置這些屬性的。
#自定義線條或點的顏色--scale_color_manual()
#自定義線條類型--scale_linetype_manual()
#自定義點的形狀--scale_shape__manual()
#自定義點的大小或線條的寬度--scale_size__manual()
#自定義透明度--scale_alpha__manual()
綜合的例子:

ggplot(data = df, mapping = aes(x = year, y = value, linetype = type, colour = type, shape = type, fill = type)) + geom_line() + geom_point()+ scale_linetype_manual(values = c(1,2)) + scale_color_manual(values = c('steelblue','darkred')) + scale_shape_manual(values = c(21,23)) + scale_fill_manual(values = c('red','black'))

雖然這幅圖畫的優點誇張,目的是想說明可以通過自定義的方式,想怎麼改就可以怎麼改。前提是aes()屬性的內容與自定義的內容對應上。

三、繪製堆積面積圖
繪製堆疊的面積圖只需要geom_area()函數再加上一個離散變量映射到fill就可以輕鬆實現,先忙咱小試牛刀一下。

set.seed(1234)year <- rep(1990:2015, times = 2)type <- rep(c('A','B'),each = 26)value <- c(runif(26),runif(26, min = 1,max = 1.5))df <- data.frame(year = year, type = type, value = value)ggplot(data = df, mapping = aes(x = year, y = value, fill = type)) + geom_area()

一幅堆疊的面積圖就輕鬆繪製成功,但我們發現,堆疊的順序與圖例的順序恰好相反,不用急,只需要加一句命令即可:

ggplot(data = df, mapping = aes(x = year, y = value, fill = type)) + geom_area() + guides(fill = guide_legend(reverse = TRUE))

如果需要為每一塊面積圖的頂部加上一條直線,可以通過如下兩種方式:

ggplot(data = df, mapping = aes(x = year, y = value, fill = type)) + geom_area(colour = 'black', size =1, alpha = .7) + guides(fill = guide_legend(reverse = TRUE))

其中,colour設置面積圖邊框的顏色;size設置邊框線的粗細;alpha設置面積圖和邊框線的透明度。

ggplot(data = df, mapping = aes(x = year, y = value, fill = type)) + geom_area(alpha = 0.6) + geom_line(colour = 'black', size = 1, position = 'stack', alpha = 0.6) + guides(fill = guide_legend(reverse = TRUE))

該方法是通過添加堆疊線條(必須設置geom_line()中position參數為『stack』,否則只是添加了兩條線,無法與面積圖的頂部重合)。這兩幅圖的區別在於第二種方式沒有繪製面積圖左右邊框和底邊框。在實際應用中,建議不要在面積圖中繪製邊框線,因為邊框的存在可能產生誤導。

四、繪製百分比堆積面積圖
在面積圖中,也可以方便快捷的繪製出百分比堆積面積圖,具體操作如下:

set.seed(1234)year <- rep(1990:2015, times = 4)type <- rep(c('A','B','C','D'),each = 26)value <- c(runif(26),runif(26, min = 1,max = 1.5), runif(26, min = 1.5,max = 2), runif(26, min = 2,max = 2.5))df <- data.frame(year = year, type = type, value = value)ggplot(data = df, mapping = aes(x = year, y = value, fill = type)) + geom_area(position = 'fill', alpha = 0.6) + guides(fill = guide_legend(reverse = TRUE))

但通過這種方式((設置面積圖的positon='fill')存在一點點小缺陷,即無法繪製出百分比堆積面積圖頂部的線條,該如何實現呢?這裡只需要對原始數據集做一步匯總工作,讓後按部就班的繪製面積圖即可。

library(dplyr)df_by_type <- group_by(.data = df, year)df_summarize <- mutate(.data = df_by_type, value2 = value/sum(value))

ggplot(data = df_summarize, mapping = aes(x = year, y = value2, fill = type)) + geom_area(alpha = 0.6) + geom_line(colour = 'black', size = 1, position = 'stack', alpha = 0.6) + guides(fill = guide_legend(reverse = TRUE))

哈哈,大功告成,就這麼簡單。

參考資料:
R語言_ggplot2:數據分析與圖形藝術
R數據可視化手冊

劉順祥,數據分析師,熱愛數據分析與挖掘工作,擅長使用R語言,目前正自學Python語言。

本文由作者劉順祥授權數據人網發表,並經數據人網審核。轉載此文章需經作者同意,並請附上出處(數據人網)及本頁連結:http://shujuren.org/index.php/Article/update/aid/126

更多精彩內容,請點擊閱讀原文。

數據人網(http://shujuren.org),數據人學習、交流和分享的家園,專注於從數據中學習,努力發覺數據之洞見,積極利用數據之價值。為「讓人懂數據、用數據」之使命堅持做點事情。大家可以來投稿,做分享和傳播,可以給反饋。您有什麼想法,請反饋給我們,謝謝。數據人網,我們共建和共享。

公眾號推薦

數據科學自媒體,從數據裡面學習。

長按二維碼圖片,選擇識別二維碼圖片,添加即可。

相關焦點

  • 手把手教你使用ggplot2繪製折線圖
    通常折線圖的橫坐標是為時間變量,縱坐標則是一般性的數值型變量,當然,折線圖也允許橫坐標為離散型數值和數值型數值。下面來解釋一下關於折線圖的繪製。一、繪製單條折線圖有關時間序列的折線圖library(ggplot2)library(lubridate) #處理日期時間相關的R包,非常有用,強烈推薦Year <- year(seq(from = as.Date('
  • ggplot2|從0開始繪製折線圖
    其中折線圖可以反映某種現象的趨勢,本文利用R語言的ggplot2包,從頭帶您繪製各式各樣的線形圖。一  繪製單條折線圖載入數據及函數包library(ggplot2)df <- data.frame(dose=c("A", "B", "C"), len=c(5.16, 10.10, 30))head(df) dose len1 A 5.162
  • 手把手教你使用ggplot2繪製中國地圖
    自從用了ggplot2包,越來越覺得其博大精深,通過圖層的概念可以繪製豐富的可視化圖形,如常見的散點圖、直方圖、條形圖、折線圖等。今天就教大家如何使用ggplot2實現地圖的繪製,以及如何在地圖中加入氣泡圖和條形圖。本文所使用的數據來自於經管之家moonstone作者提供的流行病學樣本數據。有關地理信息數據可至文後的下載連結。
  • 手把手教你使用ggplot2繪製散點圖
    繪製簡單的散點圖ggplot包中的geom_point()函數可以非常方便繪製出所需的散點圖。library(ggplot2)set.seed(1234)x <- rnorm(100,mean = 2, sd = 3)y <- -1.5 + 2*x + rnorm(100)df <- data.frame(x = x, y = y)ggplot(data = df, mapping = aes
  • 微課|ggplot2: 折線圖
    使用ggplot2繪製折線圖.折線圖整體美化.繪製平滑折線圖.繪製多變量折線圖.
  • R語言可視化(二):折線圖繪製
    02.折線圖繪製清除當前環境中的變量rm(list=ls())設置工作目錄setwd("C:/Users/Dell
  • R語言ggplot繪製峰巒圖繪製
    峰巒圖繪製清除當前環境中的變量rm(list=ls())設置工作目錄setwd("C:/Users/Dell/Desktop/R_Plots/19ridge/")使用ggridges包繪製峰巒圖library(ggridges)library(ggplot2)#### Attaching package: 'ggplot2'## The following object is masked from 'package:ggridges':#### scale_discrete_manual# 查看示例數據head
  • R ggplot2 實用系列----折線圖
    ggplot2 是繪製科研論文圖片的強有力工具,是很多其它包依賴的做圖包。
  • R筆記3:ggplot繪製商務圖表--雜誌級商業圖表
    如果你的數據是類似訂單清單這樣的「長數據」,可以直接用來作圖;如果是類似二維統計表格那樣的「寬數據」,就可能需要進行「寬轉長」的數據塑形。和《圖表之道》之前琢磨商業圖表做法一樣,本帖以製作一個常見的簇狀柱形圖為例,來學習ggplot作圖的過程。
  • R與生物專題 |第十二講 R作圖-ggplot2繪製箱式圖
    缺口在中位數及其置信區間,該置信區間通常基於中位數+/- 1.58 * IQR / sqrt(n)。缺口用於比較組;如果兩個箱式的缺口不重疊,則有力證明中位數不同。# 將可變劑量從數字轉換為因子變量ToothGrowth$dose<-as.factor(ToothGrowth$dose)head(ToothGrowth)len supp dose 1 4.2 VC 0.5 2 11.5 VC 0.5 3 7.3 VC 0.5 4 5.8
  • R科研繪圖01——基礎折線圖
    ,type = "o",main = "A")}par(op)目前,基礎函數繪製多個分組折線圖,需要藉助lines()函數。2. ggplot()函數不加任何參數繪製簡單折線圖。library(ggplot2)BOD %>% {  ggplot(.,aes(Time,demand))+geom_line()}
  • 手把手 | 哇!用R也可以跑Python了
    真是個千古難題!如果你主要從事數據分析、統計建模和可視化,R大概是你的不二之選。但如果你還想來搞點深度學習,整個自然語言處理,那你可還真得用Python。如果你處於交叉領域,很可能就需要兩種語言切換。後果是,寫個for loop還出bug真的是家常便飯。報警!面對這種困境的絕不止你一個人!
  • 手把手 |哇!用R也可以跑Python了
    通過安裝包,你現在可以在R上運行Python的安裝包和函數了~今天文摘菌就來教教你咋用這個reticulate包。您在Python中創建的對象可在R中使用(反之亦然)。通過使用repl_python()函數,可以使Python和R交互。
  • 【R畫圖】使用R繪製其他圖形之熱圖及網絡圖
    ,也可以通過ggplot2包中的geom_tile()函數或geom_raster()函數繪製,這裡就以ggplot2包中的函數為例:library(ggplot2)#使用geom_tile()函數ggplot(data = df, mapping = aes(x = Year, y = Quater, fill = Counts)) + geom_tile
  • 跟著Nature Genetics學畫圖:R語言ggplot2畫折線圖並添加誤差線
    折線圖添加誤差線是非常常用的一種可視化方法,今天的推文介紹一下使用R語言的ggplot2作圖的代碼。
  • ggplot2繪製面積圖
    繪製圍繞x軸創建對稱的面積圖。) +  labs(title = "Box office per genre 1977-2019",       x = NULL,       y = "Current dollars, billions")下面來個實際的例子,使用tidytuesday提供的數據來繪製肯亞各縣的不同水源的分布圖
  • 技術貼 | R語言:手把手教你畫upset集合圖
    導讀:venn可以分析不同數據集的交集,另外使用R語言UpSet函數包upset函數繪製集合圖可以更清晰的展示不同數據集的交集情況。你可能還喜歡技術貼 | R語言:ROC分析多樣性指數技術貼 | R語言:ggplot畫柱形圖、排序、著色技術貼 | R語言:手把手教你搞定ggplot柱形圖(一)技術貼 | R語言:手把手教你搞定
  • R筆記7:ggplot繪製商務圖表--地圖上的迷你柱形圖
    本例用ggplot來繪製商業圖表仿的第025號案例,地圖上的迷你柱形圖。
  • R語言的ggplot2做平滑的折線圖簡單小例子
    之前的圖文  跟著Nature Genetics學畫圖~ggplot2畫折線圖並在指定區域添加灰色背景 畫折線圖的遇到的一個問題是:ggplot2默認的折線圖畫出來基本都是帶尖的,有沒有辦法將折線圖變得平滑一點呢?
  • R語言可視化——ggplot圖表中的線條
    不要覺得專門為線條寫一章推送有點小題大做,其實線條對於圖表而言,功不可沒,即便是不起眼的網格、軸線、或者線條的粗線、線型、磅數等都將決定著你的圖表品質。R語言中ggplot函數系統中涉及到線條的地方有很多,最常見的場景就是我們做geom_line()(折線圖)、geom_path()(路徑圖),以及圖表的繪圖區(panel)、圖表區、網格系統(grid)中所涉及到的線條。今天以一個折線圖為例,簡要說明ggplot函數中關於線條的主要參數及其效果。