手把手教你使用ggplot2繪製折線圖

2021-02-19 數據分析1480

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

一、繪製單條折線圖

有關時間序列的折線圖

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:15

value <- 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』,否則只是添加了兩條線,無法與面積圖的頂部重合)。這兩幅圖的區別在於第二種方式沒有繪製面積圖左右邊框和底邊框。在實際應用中,建議不要在面積圖中繪製邊框線,因為邊框的存在可能產生誤導

四、繪製百分比堆積面積圖

在上一期中,我們繪製了堆疊條形圖和百分比堆疊面積圖,具體可參見:

手把手教你使用ggplot2繪製條形圖

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

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

有關dplyr包的用法可參考:

強大的dplyr包實現數據預處理

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畫圖】手把手教你使用ggplot2繪製折線圖
    通常折線圖的橫坐標是為時間變量,縱坐標則是一般性的數值型變量,當然,折線圖也允許橫坐標為離散型數值和數值型數值。下面來解釋一下關於折線圖的繪製。一、繪製單條折線圖library(ggplot2)#有關時間序列的折線圖library(lubridate) #處理日期時間相關的R包,非常有用,強烈推薦Year <- year(seq(from = as.Date('2006-01-01'), to = as.Date('2015-01-01'), by = 'year'))Weight <- c
  • 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
  • 基於ggplot2包繪製SCI學術箱線圖的保姆級教程
    具體含義可通過如下圖表進行說明:圖源網絡,侵刪本期推文使用ggplot2包來繪製箱線圖。1. 加載數據、數據在後臺回復箱線圖即可免費獲取。2. 繪製基本箱線圖使用ggplot2包繪製箱線圖很簡單,主要使用geom_boxplot()函數,先採用默認的參數繪製。
  • Graphpad 繪圖教程|手把手教你繪製折線圖
    折線圖可以顯示隨時間(根據常用比例設置)而變化的連續數據,因此非常適用於顯示在相等時間間隔數據的變化趨勢。今天給大家講解 Graphpad 繪製折線圖,話不多說,直接進入教程。2.點擊 creat,鍵入數據,完善表格。3.點擊 graphs 下的 new analysis,按下圖選擇,生成草圖。4.
  • R ggplot2 實用系列----折線圖
    ggplot2 是繪製科研論文圖片的強有力工具,是很多其它包依賴的做圖包。
  • ggplot2|繪製GO富集柱形圖
    本文利用R語言的ggplot2包,從頭帶您繪製可發表級別的GO富集分析結果圖。利用各種生信工具得到富集分析結果,數據列可能不一致,但關鍵幾列都有。library(ggplot2)data <- read.csv("GO_enrichment_significant.csv",header=TRUE)head(data)參照之前ggplot2使用方法,更改geom即可繪製簡單的bar圖,按照
  • R科研繪圖01——基礎折線圖
    ,type = "o",main = "A")}par(op)目前,基礎函數繪製多個分組折線圖,需要藉助lines()函數。2. ggplot()函數不加任何參數繪製簡單折線圖。library(ggplot2)BOD %>% {  ggplot(.,aes(Time,demand))+geom_line()}
  • 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
  • ggplot2繪製時間序列變化圖
    ggplot2繪製時間序列變化圖疫情時間序列變化涉及主要方法:list.files遍歷文件read_excel讀取EXCEL文件theme標題、坐標軸、圖例等文字格式、文字大小、位置設置geom_smooth平滑曲線繪製geom_point散點繪製
  • R筆記3:ggplot繪製商務圖表--雜誌級商業圖表
    如果你的數據是類似訂單清單這樣的「長數據」,可以直接用來作圖;如果是類似二維統計表格那樣的「寬數據」,就可能需要進行「寬轉長」的數據塑形。和《圖表之道》之前琢磨商業圖表做法一樣,本帖以製作一個常見的簇狀柱形圖為例,來學習ggplot作圖的過程。
  • 在Python中使用ggplot2風格及語法: plotnine與ggplot|可視化系列05
    Hadley Wickham編寫的ggplot2 在R語言中聲名遠揚,使得統計數據可視化能力成為R語言的一大優勢(這位大神還寫了dplyr、tidyr等影響深遠的R包)。本文用這兩個庫實踐日常可視化的需求,包括繪製基礎圖形和分面主題等,通過對比使用plotnine和ggplot兩個庫,去理解圖形語法的理念。
  • 36分文章的折線圖該怎麼畫?
    關於繪製原理,主要是使用ggplot2包繪製折線圖(geom_line+geom_point),然後再為每個散點添加豎線(geom_segment)。下面就先讀入範例數據,載入ggplot2包,開始繪製吧。
  • 技術貼 | R語言:手把手教你畫upset集合圖
    導讀:venn可以分析不同數據集的交集,另外使用R語言UpSet函數包upset函數繪製集合圖可以更清晰的展示不同數據集的交集情況。你可能還喜歡技術貼 | R語言:ROC分析多樣性指數技術貼 | R語言:ggplot畫柱形圖、排序、著色技術貼 | R語言:手把手教你搞定ggplot柱形圖(一)技術貼 | R語言:手把手教你搞定
  • ggplot2繪製面積圖
    繪製圍繞x軸創建對稱的面積圖。) +  labs(title = "Box office per genre 1977-2019",       x = NULL,       y = "Current dollars, billions")下面來個實際的例子,使用tidytuesday提供的數據來繪製肯亞各縣的不同水源的分布圖
  • 【ggplot2】為條形圖和折線圖添加誤差線
    ggplot2隻能處理 data.frame數據,每列作為一個變量,是一個指標.折線圖繪製帶有誤差線和95%置信區間線的折線圖和點圖# 帶有標準誤差線的折線圖# Standard error of the meanggplot
  • 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