什么是三元相圖
三元圖是重心圖的一種,它有三個(gè)變量,但需要三者總和為恒定值谎懦。在一個(gè)等邊三角形坐標(biāo)系中,圖中某一點(diǎn)的位置代表三個(gè)變量間的比例關(guān)系溃斋。在群體遺傳學(xué)中界拦,它被稱做Finetti圖;在博弈論中梗劫,常被稱為simplex圖享甸。
在高通量測(cè)序分析領(lǐng)域中,最常用的是兩組間的比較梳侨,展示的方式有火山圖蛉威、曼哈頓圖等,而三組互相兩兩比較需要展示三個(gè)圖嗎走哺?就沒有更好的展示方式了嗎蚯嫌?三元圖的引入解決了這一問題。近年來丙躏,常用于展示三組間的相對(duì)基因表達(dá)或OTU豐度择示,即美觀,又有意義晒旅。
三元相圖怎么看
常用三角形來表示三元合金的成分栅盲,這樣的三角形稱為濃度三角形或成分三角形(CompositionTriangle)。常用的成分三角形是等邊三角形和直角三角形以及等腰三角形废恋。是應(yīng)用最為廣泛的還是等邊三角形谈秫,這里也主要介紹等邊三角形的三元相圖。
如圖所示:
oa+ob+oc=AB=BC=CA
由于oa=bC=WA
ob=Ac=WB
oc=Ba=WC
因此鱼鼓,可用
oa代表A組元的含量孝常,
ob代表B組元的含量,
oc代表C組元的含量蚓哩。
所以你需要畫一個(gè)等邊三角形還模擬一下构灸,需要注意的是箭頭的方向,還有就是三角形是等邊的很是對(duì)稱,所以要把字母標(biāo)好喜颁。相信我稠氮,你會(huì)亂的,然后就好了半开。
快速看誰多誰少
快速理解位置意義:重心圖隔披,你看目標(biāo)點(diǎn)離那個(gè)角近,就是它在相應(yīng)的組中相對(duì)比例高寂拆;反之離某個(gè)角遠(yuǎn)奢米,其相對(duì)比例也低。精確讀三組比例
- 雙平行線/小等邊三角形法:由點(diǎn)向底邊做兩條平行線建立小正三角形纠永,將底邊分成三段鬓长,中間為頂部組所占比例,左段為右側(cè)組比例尝江,右段為左側(cè)組比例涉波。
垂線法:點(diǎn)向三條邊做垂線,穿越的格數(shù)炭序,即對(duì)角組中所占比例啤覆;
向各邊零坐標(biāo)方向作平行線法:按坐標(biāo)系組的顏色和數(shù)值直接讀各組比例;
三元圖規(guī)律
三角形邊平等線上的點(diǎn)惭聂,在平行線對(duì)應(yīng)的頂點(diǎn)組所占比例是恒定的窗声。
頂點(diǎn)到底邊直線上的點(diǎn),上面任意點(diǎn)中兩底角組相對(duì)比例恒定辜纲。三元圖點(diǎn)大小的意義
通常代表基因/OTU的相對(duì)表達(dá)/豐度笨觅,而且為了防止點(diǎn)過大或過小,數(shù)據(jù)通常還需要經(jīng)過log2變換侨歉,將表達(dá)范圍從0-1百萬,轉(zhuǎn)換為0-20的區(qū)間揩魂;如果是OTU的千分比幽邓,則轉(zhuǎn)換為0-10的區(qū)間。三元圖優(yōu)點(diǎn)
打破了普通兩兩比較火山圖展示方式火脉,可將三組兩兩比較和三組的相對(duì)關(guān)系展示在同張圖中牵舵;
兩組只能比較一次,三組可以比較三次倦挂,可説的結(jié)果非常多畸颅;
三是個(gè)非常好的數(shù)字,2組比較太常見且單調(diào)方援,4組及以上信息量大讓人暈没炒,三組正好高端大氣上檔次,而且還有內(nèi)涵犯戏。
用R繪制三元相圖
Software送火、
根據(jù)wikipedia的介紹目前有以下方法可以繪制三元相圖:
- JMP
- Origin
- R packages:
- Statgraphics
- Veusz
- ternary, a python library for ternary plotting
- ternplot for Matlab
- PGFplots for LaTeX
- ternaryplot.com online tool for ternary plotting
當(dāng)然拳话,我們就介紹集中R做的三元相圖。
用來作圖的數(shù)據(jù)是這樣的:
- vcd 包
library(vcd)
data = read.table("otu_table_group.g.relative.xls",head=T,sep="\t",comment.char = "")
data1=head(data,n=12)
s=data1[c("AA","BB","CC")]
smM<-as.matrix(s)
smM<-smM+0.000000000000000000001
colors<-c("#DC143C","#0000FF","#20B2AA","#FFA500","#9370DB","#98FB98","#F08080","#1E90FF","#7CFC00","#808000","#7B68EE","#483D8B")
ternaryplot(smM,prop_size = TRUE,grid_color = "black",labels_color = "black",main ="ternaryplot",labels = "outside",col=c("#DC143C","#0000FF","#20B2AA","#FFA500","#9370DB","#98FB98","#F08080","#1E90FF","#7CFC00","#808000","#7B68EE","#483D8B"))
grid_legend(0.85, 0.7, 19,colors,data1[,1],frame = FALSE,size=1)
dev.off()
?ternaryplot()# 獲得示例文檔种吸。
- ggtern包
喜歡(習(xí)慣)ggplot的朋友可能會(huì)更加喜歡ggtern包弃衍。它是基于ggplot2的,參數(shù)設(shè)置方面也是一致的坚俗。
library(ggtern)
?ggtern()
s$DD<-apply(s,1,sum)
colors<-c("#DC143C","#0000FF","#20B2AA","#FFA500","#9370DB","#98FB98","#F08080","#1E90FF","#7CFC00","#808000","#7B68EE","#483D8B")
ggtern(data=s,aes(AA,BB,CC)) +
geom_point(aes(size=DD),col=colors) + #define data geometry
theme_showarrows() + #draw labeled arrows beside axes
ggtitle("My Favorite Color") + #add title
xlab("AA") + #replace default axis labels
ylab("CC") +
zlab("BB")+
theme(legend.position="none")
grid_legend(0.85, 0.7, 19,colors,data1[,1],frame = FALSE,size=1)
如果變量較多可采用核密度估算镜盯,并使用輪廓顯示結(jié)果.
#Or you can apply a color gradient to space between the contour lines
ggtern(data=s,aes(AA,BB,CC)) + #define data sources
stat_density_tern(aes(fill=..level.., alpha=..level..),geom='polygon') +#now you need to use stat_density_tern
scale_fill_gradient2(high = "red") + #define the fill color
guides(color = "none", fill = "none", alpha = "none") +#we don't want to display legend items
#theme_bvbg()
#theme_bvbw()
#theme_bluelight()
theme_tropical()
#theme_matrix()
#theme_custom()
#theme_void()
#theme_rgbg()
#theme_bw()
#theme_minimal()
#theme_rgbw()
#theme_light()
#theme_dark()
ggtern(data=s,aes(AA,BB,CC)) +
stat_density_tern(aes(fill=..level.., alpha=..level..), geom='polygon') +
scale_fill_gradient2(high = "blue") +
geom_point() +
theme_showarrows() +
ggtitle("My Favorite Color") +
xlab("AA") +
ylab("BB") +
zlab("CC") +
guides(color = "none", fill = "none", alpha = "none")
- Ternary
如果你想一步一步地構(gòu)建一個(gè)三元相圖那么Ternary也許是一個(gè)不錯(cuò)的選擇。
#install.packages('Ternary')
library('Ternary')
par(mfrow=c(2, 2), mar=rep(0.5, 4))
for (dir in c('up', 'right', 'down', 'le')) {
TernaryPlot(point=dir, atip='A', btip='B', ctip='C', alab='Aness', blab='Bness', clab='Cness')
TernaryText(list(A=c(10, 01, 01), B=c(01, 10, 01), C=c(01, 01, 10)), col=cbPalette8[4], font=2)
}
par(mfrow=c(1, 2), mar=rep(0.3, 4))
TernaryPlot(alab="Redder\u2192", blab="Greener \u2192", clab="Bluer \u2192",
point='right', lab.cex=0.8, grid.minor.lines = 0,
grid.lty='solid', col=rgb(0.9, 0.9, 0.9), grid.col='white',
axis.col=rgb(0.6, 0.6, 0.6), ticks.col=rgb(0.6, 0.6, 0.6),
padding=0.08)
data_points <- list(
R = c(255, 0, 0),
O = c(240, 180, 52),
Y = c(210, 222, 102),
G = c(111, 222, 16),
B = c(25, 160, 243),
I = c(92, 12, 243),
V = c(225, 24, 208)
)
AddToTernary(points, data_points, bg=vapply(data_points, function (x) rgb(x[1], x[2], x[3], 128, maxColorValue=255), character(1)), pch=21, cex=2.8)
AddToTernary(text, data_points, names(data_points), cex=0.8, font=2)
legend('bottomright',
pch=21, pt.cex=1.8,
pt.bg=c(rgb(255, 0, 0, 128, NULL, 255),
rgb(240, 180, 52, 128, NULL, 255),
rgb(210, 222, 102, 128, NULL, 255),
rgb(111, 222, 16, 128, NULL, 255)),
legend=c('Red', 'Orange', 'Yellow', 'Green'),
cex=0.8, bty='n')
###
# Next plot:
###
TernaryPlot('Steam', 'Ice', 'Water',
grid.lines=5, grid.lty='dotted',
grid.minor.lines = 1, grid.minor.lty='dotted',
point='West')
HorizontalGrid()
middle_triangle <- matrix(c(
30, 40, 30,
30, 30, 40,
55, 20, 25
), ncol=3, byrow=TRUE)
TernaryPolygon(middle_triangle, col='#aaddfa', border='grey')
TernaryLines(list(c(0, 100, 0), middle_triangle[1, ]), col='grey')
TernaryLines(list(c(0, 0, 100), middle_triangle[2, ]), col='grey')
TernaryLines(list(c(100, 0, 0), middle_triangle[3, ]), col='grey')
Ternary plot
百科三元相圖
擴(kuò)增子圖片解讀7三元圖:美的不要不要的猖败,再多用也不過分
Creating ternary plots with Ternary
DRAFT Triad Data Visualizations: Part 1
Legends (ggplot2)