核密度圖的繪製

2021-02-20 基迪奧生物

我們先看一下別人家文章中的核密度圖。

那麼,怎麼做出這樣的圖呢?這種核密度圖到底想表達或表現什麼呢?

所謂「眼過千遍不如手過一遍」,數據我們這裡用Wikipedia文中的這6個數: −2.1, −1.3,−0.4,1.9,5.1,6.2。我們用ggplot2繪製這6個數的核密度圖(兩種方法,代碼對應下圖的p1和p2)、直方圖和密度圖的組合比較(下圖p3),與其「鏡像翻轉」數列「相加」後新數列的密度圖(下圖p4,橙色)。代碼如下:

> library("ggplot2", lib.loc="~/R/win-library/3.4")

> x<-c(-2.1,-1.3,-0.4,1.9,5.1,6.2)

> x

[1] -2.1 -1.3 -0.4  1.9  5.1  6.2

# 載入數據

> p<-ggplot(data=NULL,aes(x=x))

> p1<-p+geom_density(adjust=0.55,fill="#f4876a",colour="black",alpha=0.6,size=1)+xlim(-10,14)

> p1

# 第一種畫法,利用geom_density()畫的核密度圖,「面積」可填充顏色(見下圖,p1)。這裡的adjust用來調整bw(帶寬),數值為默認值的倍數。這裡geom_density()默認的核函數為Gaussian,關於帶寬的解釋見下文。

> p2<-p+geom_line(stat ="density",adjust=0.55,color="blue",size=1)+xlim(-10,14)

> p2

# 第二種畫法,方法相類似,最後的結果與p1一致,只是不能填充顏色(下圖p2)。

> p3<-p+geom_histogram(binwidth =2,center=1,fill="blue",color="white",alpha=0.8,size=1)

+geom_line(stat ="density",adjust=0.55,color="red",size=1)+xlim(-5,10)

> p3

# 同樣的數據,用geom_histogram()畫直方圖作比較,某種意義上可為bw的調整做參考。

> m<-c(1,1,1,1,1,1,2,2,2,2,2,2)

> z<-c(-8.3,-6.4,-2.3,2.3,6.4,8.3)

> n<-c(z,x)

> data<-data.frame(m,n)

> data

   m    n

1  1 -8.3

2  1 -6.4

3  1 -2.3

4  1  2.3

5  1  6.4

6  1  8.3

7  2 -2.1

8  2 -1.3

9  2 -0.4

10 2  1.9

11 2  5.1

12 2  6.2

> p1<-ggplot(data=data,aes(x=n,group=factor(m),color=factor(m),fill=factor(m)))

> w1<-w+geom_density(adjust=0.55,alpha=0.6,size=1,colour="black")+xlim(-15,15)

> p4

# 將x這列數據乘以負1,從順序顛倒後與x相加,生成z,z和x組成數據框,繪製分組核密度圖,見p4。本文對圖表主題,文字不做調整,調整方法見上一篇文章《ggplot2繪圖學習筆記分享》,這裡不再贅述。

核密度估計(kernel density estimation,KDE)是根據已知的一列數據(x1,x2,…xn)估計其密度函數的過程,即尋找這些數的概率分布曲線。我們最常見的密度函數莫過於正態分布(也稱高斯分布)的密度函數:

而密度估計就是給定一列數據,分布未知的情況下估計其密度函數。

例如上文的6個數據:c(x1 = −2.1,x2 = −1.3, x3 = −0.4, x4 = 1.9, x5 = 5.1, x6= 6.2),我們看下這列數據的「密度」如何。

畫頻率直方圖就是一種密度估計的方法(如下圖,組距為2),這裡的「密度」(density)可以感性得理解為一個區間(直方圖的組距)內數據數量的多少,右圖即為這6個數據的密度曲線(這裡簡稱為密度圖),它是左圖的外輪廓化,數據量越多,直方圖的頂點也越接近一條線。

https://en.wikipedia.org/wiki/

直方圖和密度圖都是一組數據在坐標軸上「疏密程度」的可視化,只不過直方圖用條形圖顯示,而密度圖使用擬合後的(平滑)的曲線顯示,「峰」越高,表示此處數據越「密集」。「密度」越高,如下圖。

https://en.wikipedia.org/wiki/

核密度估計是用用下面的函數去估計一個分部未知的獨立樣本的分布:

其中K,也就是「核」(kernel)表示核函數,部分常見的核函數如下圖(看到Gaussian的函數是不是覺得很眼熟?另為,R中的kernel 有"gaussian","epanechnikov","rectangular","triangular","biweight","cosine","optcosine")。

公式裡的「h」,被稱為「帶寬」 (bandwidth,也寫作bw),為平滑參數,可簡單理解為直方圖的「組距」,帶寬越大曲線越平滑,見下圖。

核密度估計實際上是表現一組數據的分布情況,轉錄組中用來展示所有樣本基因的表達量豐度分布,將FPKM取對數後替換本文第1部分繪圖的數據,即可畫出樣本中所有基因表達量的分布圖。一般情況下,它可用來比較某個樣本跟其它樣本間的差異。

當然,也可以用於其他的數據分布的分析,除了箱型圖,還可考慮核密度圖。

想學ggplot2作圖的童鞋可以點擊「閱讀原文」到在線課堂看周老師的視頻教程,每個視頻都可下載課件和數據。今天的就到這裡啦,若覺得本文還不錯要記得分享哦~

參考文獻:

Hebenstreit, Daniel, et al. "RNA sequencing reveals two major classes of gene expression levels in metazoan cells." Molecular systems biology 7.1 (2011): 497.

Shah, Sohrab P., et al. "The clonal and mutational evolution spectrum of primary triple-negative breast cancers." Nature486.7403 (2012): 395-399.

相關焦點

  • Python-plotnine 核密度空間插值可視化繪製
    還會繼續推出R-Python 的基礎圖表繪製推文系列。可能會根據粉絲的需求或者感興趣圖表進行專門的推文教程,大家可以給我發私信,我們會針對需求較多的圖表繪製要求進行專門推文。好了,下面我們就開始今天的推文內容,本期推文主要包括:scipy.stats.gaussian_kde()函數進行核密度估計計算geopandas 繪製空間地圖及裁剪操作在上期推文中Python-geopandas 中國地圖繪製 中,我們使用了geopandas
  • Python可視化25|seaborn繪製矩陣圖
    矩陣圖即用一張圖繪製多個變量之間的關係,數據挖掘中常用於初期數據探索;本文介紹python中seaborn.pairplot(傻瓜版)和seaborn.PairGrid(更個性化版)繪製矩陣圖本文內容速覽
  • 小範帶你學空間計量之三:默認窗寬、窗寬變動及核函數變動條件下核密度估計的Matlab模擬
    % 錄入原始數據;n = 500;X = randn(n,1);% 調用經驗分布函數ecdf,計算x1處的經驗分布函數值f_ecdf1;[f_ecdf1,x1] = ecdf(X);% 新建圖形窗口,繪製直方圖;figure(1);ecdfhist(f_ecdf1,x1,10);
  • 繪製頻率分布直方圖的三種方法,總結的很用心!
    ,必須將直方圖頻數更改為頻率,即normed參數設置成True#直方圖df.年齡.plot(kind="hist",bins=20,color="steelblue",edgecolor="black",normed=True,label="直方圖")#加核密度圖df.年齡.plot(kind="kde",color="red",label="核密度圖")
  • 用核密度估計法來進行警務大數據預測犯罪
    在警務預測系統中,城市中不同街道的犯罪發生概率和周圍環境有密切關係,將城市看做一張二維平面圖的話,其每個地區的犯罪發生概率並不服從任何已知的分布,如正態分布、泊松分布等等,因此就不能參照任何已知表達式寫出犯罪發生的概率密度,也不能為犯罪發生概率設定參數。此時就需要核密度估計法來估計犯罪發生概率的表達式。
  • R繪圖筆記 | 箱形圖的繪製
    前面介紹了一些:R繪圖筆記 | 一般的散點圖繪製R繪圖筆記 | 柱狀圖繪製R繪圖筆記 | 直方圖和核密度估計圖的繪製R繪圖筆記 | 二維散點圖與統計直方圖組合R繪圖筆記 | 散點分布圖與柱形分布圖這裡介紹箱形圖的繪製,這些圖形在文章中是很常見的,也是必須要掌握的。
  • 核密度估計和非參數回歸
    核密度估計讓我們考慮另一個例子。由於某種原因,你可能會對德國的汽油價格感興趣。因此,你可以上網搜索所有14,000個加油站的當前價格。圖5中是該數據的常見表示形式:直方圖。直方圖顯示汽油價格的分布。塊的帶寬是關鍵參數,不同的選擇會導致不同的直方圖(類似於移動平均估計器的不同帶寬)。
  • 非參數估計的根基,核密度估計大陳述
    第二部分是核密度估計,介紹了它對比直方圖有哪些改進和更一般性的特點。最後一部分是,為了從數據中抽取所有重要的特徵,怎麼樣選擇最合適,漂亮的核函數。為了在圖上顯示的方便我們只使用了部分的數據,否則一些點就會變得稠密看不清。數據點在x軸上用十字叉表示。
  • R語言繪製密度提琴圖
    某日,老大發問,有這樣的一張圖,有什麼思路解決它嗎。(來源文獻「A genome-based model for adjusting radiotherapy dose (GARD): a retrospective, cohort-based study」)其它的都還好說,貌似唯一難點就是怎樣根據「提琴寬度」分配漸變色了。所謂提琴寬度,也就是對應數值的頻數分布(密度)。
  • Day4.五種常見圖形的繪製
    第一張散點圖用matplotlib繪製,第二張用seaborn繪製。折線圖折線圖能夠顯示數據的變化趨勢,在matplotlib使用plot函數繪製,而在seaborn使用 lineplot(x,y,data=None)函數;data是傳入的數據,一般是pandas中的DataFrame數據結構。
  • R語言與非參數統計(核密度估計)
    核密度估計的方法是這樣的:                                                                   其中K為核密度函數,h為設定的窗寬。      核密度估計的原理其實是很簡單的。在我們對某一事物的概率分布的情況下。
  • 統計學有大用處,利用核密度估計法來進行警務大數據預測犯罪
    在警務預測系統中,城市中不同街道的犯罪發生概率和周圍環境有密切關係,將城市看做一張二維平面圖的話,其每個地區的犯罪發生概率並不服從任何已知的分布,如正態分布、泊松分布等等,因此就不能參照任何已知表達式寫出犯罪發生的概率密度,也不能為犯罪發生概率設定參數。此時就需要核密度估計法來估計犯罪發生概率的表達式。
  • 有邊界區間上的核密度估計
    一、一個例子核密度估計應該是大家常用的一種非參數密度估計方法,從某種程度上來說它的性質比直方圖更好,可以替代直方圖來展示數據的密度分布。但是相信大家會經常遇到一個問題,那就是有些數據是嚴格大於或等於零的,在這種情況下,零附近的密度估計往往會出現不理想的情況。
  • Python可視化24|seaborn繪製多變量分布圖(jointplot|JointGrid)
    本文內容速看 seaborn.jointplot繪製兩個變量分布圖seaborn.JointGrid繪製兩個變量分布圖(更個性化)目錄 1、繪圖數據準備2、seaborn.jointplot 圖形基本設置 修改中部圖 修改邊際圖 kind參數設置 給中部散點圖加上核密度圖
  • 用於IMDD-UFMC的核密度估計非均勻量化方法
    一.原理非參數核密度估計(KDE)是一種基於統計學習理論的非參數估計算法。
  • python-數據分布型圖表-箱形圖系列-多數據系列箱形圖
    多數據系列的箱形圖多數據系列的箱形圖:多數據系列的箱形圖使用geom_boxplot()函數,只需要將兩組變量映射到填充顏色(fill