(數據科學學習手札38)ggplot2基本圖形簡述


一、簡介

  上一篇中我們介紹了ggplot2的基本語法規則,為了生成各種復雜的疊加圖層,需要了解ggplot2中一些基本的幾何圖形的構造規則,本文便就常見的基礎幾何圖形進行說明;

 

二、各基礎圖形

2.1 abline()、hline()與vline()

  在R的基礎繪圖系統中我們可以在已繪制的圖床上通過abline來添加線條,在ggplot2中當然也有類似的方法:

geom_abline():

  我們主要使用兩個參數控制線條的位置,slope控制斜率,intercept控制截距,下面是一個簡單的例子,我們在散點圖層上疊加截距為20,斜率為2的直線:

library(ggplot2)

p <- ggplot(mtcars, aes(wt, mpg)) + 
  geom_point() +
  geom_abline(intercept = 20,slope = 2)
p

geom_vline():

  如果你想添加的直線垂直於x軸,則可以使用geom_vline()來快捷地添加垂直線條,xintercept傳入的參數即為線條在x軸上的位置,若傳入向量則可同時添加多條線條:

library(ggplot2)

p <- ggplot(mtcars, aes(wt, mpg)) + 
  geom_point() +
  geom_vline(xintercept = 5)
p

 

 

p <- ggplot(mtcars, aes(wt, mpg)) + 
  geom_point() +
  geom_vline(xintercept = 1:5)
p

 

geom_hline():

  同樣的,我們通過在geom_hline()中傳入參數yintercept來繪制垂直於y軸的線條:

p <- ggplot(mtcars, aes(wt, mpg)) + 
  geom_point() +
  geom_hline(yintercept = 20)
p

 

p <- ggplot(mtcars, aes(wt, mpg)) + 
  geom_point() +
  geom_hline(yintercept = 15:25)
p

 

 2.2 area()

   面積圖也是一種很常用的圖,多用於表現某些水平或比例類指標隨時間的變化情況,下面是一個朴素的例子,以huron湖水水平變化數據為例:

library(ggplot2)

p <- ggplot(huron,aes(x=year,y=level))+
  geom_area(fill='springgreen')
p

  實際上面積圖最有表現力的類型是堆積面積圖,下面以美國5個消費指標上5個年份的數據為例繪制堆積面積圖:

library(ggplot2)
library(reshape2)

#將原數據轉置以處理成行對應一個年份的形式
data <- data.frame(t(USPersonalExpenditure))
#添加年份變量
data$year <- as.numeric(row.names(data))
#利用reshape2中的melt函數按照year列將原數據集伸展為“年份、變量名、對應數值”的形式
data <- melt(data, id='year')

h <- ggplot(data, aes(x=year, y=value))+
  geom_area(aes(fill=variable),position = 'fill')+
  theme(legend.position = 'bottom')+
  labs(title='堆積面積圖')+
  theme(plot.title = element_text(hjust=0.5))
h

  這樣得到的圖就比較具有美感和表現力,當然我們更改position參數也可以得到真實的水平逐年變化情況:

h <- ggplot(data, aes(x=year, y=value))+
  geom_area(aes(fill=variable),position = 'identity')+
  theme(legend.position = 'bottom')+
  labs(title='堆積面積圖')+
  theme(plot.title = element_text(hjust=0.5))
h

 

 2.3 bar()

  基礎的條形圖我們前面一篇中已經涉及到了,所以這里我們只與上述的堆積面積圖進行對比,這里注意,geom_bar()默認的統計變換為count,即計算頻數,我們這里想展示真實數值需要將geom_bar()中的stat設置為'identity',即不做任何變換:

library(ggplot2)
library(reshape2)

data <- data.frame(t(USPersonalExpenditure))
data$year <- row.names(data)
data <- melt(data, id='year')

p <- ggplot(data, aes(x=year,y=value))+
  geom_bar(aes(fill=factor(variable)),stat = 'identity')+
  labs(title='消費水平')+
  theme(plot.title=element_text(hjust=0.5))
p

  可以看出這時我們的堆疊條形圖便而可以看作離散的堆積面積圖;

 

2.4 bin2d()

  二維熱圖也是一種非常實用的圖像,我們可以用來一覽數據的某兩個變量上的指標分布情況:

library(ggplot2)

d <- ggplot(diamonds, aes(x, y))+
  geom_bin2d()+
  labs(title='鑽石長寬分布')+
  theme(plot.title=element_text(hjust=0.5))
d

  我們還可以利用bin2d()來直觀的了解數據集的缺失情況:

library(ggplot2)
library(reshape2)

#載入數據
data <- airquality
#統計缺失值位置並保存為矩陣
na.count <- is.na(data[,-6])

#用1表示缺失,0表示未缺失
na.count[na.count == T] <- 1
na.count[na.count == F] <- 0

#將Day按列與na.count拼接並轉為數據框
na.count <- data.frame(cbind(na.count,data[,6]))
names(na.count) <- names(airquality)
#利用melt以Day為b
na.count <- melt(na.count,id='Day')
#繪制數據集缺失情況概括圖,以變量名為分面依據
p <- ggplot(na.count,aes(x=Day,y=value))+
  geom_bin2d()+
  facet_grid(facets = .~variable)
p

 

2.5 density()與density2d()

  很多時候當我們獲取的數據集樣本數量足夠時,通常我們可以繪制密度估計圖來大致描述數據集數據的分布,ggplot2中當然提供了這類方法,我們先從一維的說起:
geom_density():

  和R基本繪圖系統中的密度曲線繪制方法很接近:

library(ggplot2)

data <- data.frame(matrix(rnorm(200),nrow=100))
v <- ggplot(data, aes(x=X1))+
  geom_density(alpha=0.3,fill='springgreen',colour='springgreen')
v

 

geom_density2d():

  和density()類似,只是我們可以通過density2d來繪制二維變量的概率密度分布:

v <- ggplot(data, aes(X1, X2))+
  geom_point()+
  stat_density2d(aes(colour=..level..))
v

  也可以不繪制等高線,將..density..作為fill的傳入參數,注意這里一定要設置contour為F:

# 密度圖函數,通過fill設置填充顏色數據為密度,geom設置繪制柵格圖
p <- ggplot(data, aes(x = X1, y = X2)) +
  stat_density2d(aes(fill = ..density..), geom = "raster", contour = F)
p

  或是在透明度alpha上動手腳:

# 密度圖函數:alpha設置填充透明度數據為密度,geom設置繪制柵格圖
p <- ggplot(data, aes(x = X1, y = X2)) +
  geom_point() +
  stat_density2d(aes(alpha = ..density..), geom = "raster", contour = FALSE)
p

 

2.6 boxplot()

  在統計學描述數據分布的圖形中,箱線圖是非常有代表性的,它通過圖形表現五數概括的情況,在數據基本的描述性統計中具有重要意義,而ggplot2中必然可以繪制箱線圖,而且可以繪制得非常精美,下面先看一個最朴素的分組箱線圖形式:

p <- ggplot(mpg, aes(class, hwy)) +
  geom_boxplot()
p

我們為其賦以分組依據以配上顏色:

p <- ggplot(mpg, aes(class, hwy, fill=factor(class)))
p + geom_boxplot()

為我們的填充設置透明度,並將邊框也賦以對應的顏色:

p <- ggplot(mpg, aes(class, hwy, fill=factor(class), colour=factor(class)))+
  geom_boxplot(alpha=0.55)
p

  還可以將散點圖與箱線圖結合起來(這里施加jitter隨機擾動以組織樣本點重合):

p <- ggplot(mpg, aes(class, hwy, fill=factor(class), colour=factor(class)))+
  geom_boxplot(alpha=0.55)+
  geom_point(position = 'jitter')
p

 

2.7 histogram()

  關於直方圖,因為前面也說過,這里就舉幾個由朴素的直方圖擴展開的示例:

library(ggplot2)


p <- ggplot(diamonds, aes(carat)) +
  geom_histogram()
p

 

p <- ggplot(diamonds, aes(carat,fill=cut)) +
  geom_histogram()
p

 

p <- ggplot(diamonds, aes(carat, fill=cut)) +
  geom_histogram()+
  facet_grid(facets = .~cut)
p

 

2.8 curve()與segment()

  有時候我們需要在已繪制的圖形中添加線段、曲線、小箭頭之類的注解,這時候就可以用到ggplot2中的geom_curve()與geom_segment(),他們的主要參數類似,需要在aes()中定義起點坐標x、y,以及終點坐標xend、yend,如需要線段或曲線上帶有小箭頭,則額外定義參數arrow即可,箭頭方向由之前的起點終點決定:

data <- data.frame(x=c(1,2,3,4),y=c(1,2,3,4))

p <- ggplot(data,aes(x,y))+
  geom_point()
p

p + geom_curve(data=data,aes(x=x[1],y=y[1],xend=x[4],yend=y[4],colour='曲線'))

在原有圖形基礎上添加線段並帶上小箭頭:

p + geom_curve(data=data,aes(x=x[1],y=y[1],xend=x[4],yend=y[4],colour='曲線'))+
  geom_segment(data=data,aes(x=x[2],y=y[2],xend=x[3],yend=y[3],colour='直線'),
               arrow = arrow(length = unit(0.02, 'npc')))

 

2.9 text()與label()

  有些時候我們需要在已繪制的圖形上添加文本類標簽,這種時候就需要用到text()和label()了,下面以不同的示例來說明其常見用法:

用對應每一個樣本的文本標簽代替散點

p <- ggplot(mtcars, aes(wt, mpg, label = rownames(mtcars)))

p + geom_text()

對出現標簽遮擋的情況進行抹除(不建議使用):

p + geom_text(check_overlap = TRUE)

使用別致的標簽:

p + geom_label()

改變文本標簽的大小:

p + geom_text(size = 10)

調整文字標簽位置:

p + geom_point() + geom_text(hjust = 0, nudge_x = 0.05)

調整文字標簽位置:

p + geom_point() + geom_text(vjust = 0, nudge_y = 0.5)

調整文本標簽位置:

p + geom_point() + geom_text(angle = 45)

更精致的標簽類型:

p + geom_label(aes(fill = factor(cyl)), colour = "white", fontface = "bold")

在圖床指定位置添加文本標簽:

df <- data.frame(
  x = c(1, 1, 2, 2, 1.5),
  y = c(1, 2, 1, 2, 1.5),
  text = c("bottom-left", "bottom-right", "top-left", "top-right", "center")
)
ggplot(df, aes(x, y)) +
  geom_text(aes(label = text))

可以看出,落入四角的標簽因為其中心對應坐標點,導致部分內容伸出邊界,這里我們令vjust = "inward", hjust = "inward"使得它自適應的調整位置以顯示全部信息:

ggplot(df, aes(x, y)) +
  geom_text(aes(label = text), vjust = "inward", hjust = "inward")

 

2.10 violin()

  小提琴圖是一種功能和箱線圖類似,但增加了核密度估計功能的圖形,且更為美觀,ggplot2可以繪制出與seaborn中的小提琴圖同樣優美的圖形,因為涉及的內容比較復雜,我准備在之后單獨開一篇來介紹,下面僅展示一張簡單的小提琴圖:

library(ggplot2)

data <- mtcars

p <- ggplot(data, aes(factor(cyl), mpg))+
  geom_violin(aes(fill = cyl,colour=cyl))
p

 

 

  以上就是ggplot2中常規圖形的簡單介紹,其中比較重要且比較復雜的幾種將會在之后單獨開文章詳細介紹,如有筆誤,望指出。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM