Rで解析:3要素の関係を示す!三角ダイアグラムをプロット「ggtern」パッケージ

Rの解析に役に立つ記事
スポンサーリンク

3要素の相対的な割合を表現する図として薬学、化学、遺伝学、ゲーム理論、鉱物学などでは三角ダイアグラム(ternary diagrams)が利用されています。大変有効な表現方法だと思います。

「ggplot2」システムを利用して三角ダイアグラムを手軽にプロットできる「ggtern」パッケージを紹介します。かなり多くのコマンドが収録されているだけでなく、細かい体裁の調整が可能です。

パッケージバージョンは3.4.1。windows11のR version 4.2.2で確認しています。

スポンサーリンク

パッケージのインストール

#パッケージのインストール
install.packages("ggtern")

実行コマンド

詳細はコメント、パッケージのヘルプを確認してください。

#ライブラリの読み込み
library("ggtern")

###データ例の作成#####
#tidyverseパッケージがなければインストール
if(!require("tidyverse", quietly = TRUE)){
  install.packages("tidyverse");require("tidyverse")
}
#viridisパッケージがなければインストール
if(!require("viridis", quietly = TRUE)){
  install.packages("viridis");require("viridis")
}
set.seed(1234)
TestData <- tibble(X = runif(30),
                   Y = runif(30),
                   Z = runif(30))
########

#&#19977;&#35282;&#12480;&#12452;&#12450;&#12464;&#12521;&#12512;&#12398;&#22522;&#26412;&#12434;&#20316;&#25104;:ggtern&#12467;&#12510;&#12531;&#12489;
TerDia <- ggtern(data = TestData, aes(X, Y, Z))
#&#20869;&#23481;&#30906;&#35469;
#TerDia

#TerDia&#12395;&#12300;geom_point&#12301;&#12300;geom_line&#12301;&#12434;&#36861;&#21152;
TerDiaPoint <- TerDia +
  geom_point(col = "blue") +
  geom_line(col = "red")
#&#19977;&#35282;&#12480;&#12452;&#12450;&#12464;&#12521;&#12512;&#12398;&#22522;&#26412;&#12364;&#23436;&#25104;
#&#20197;&#38477;&#12300;TerDiaPoint&#12301;&#12434;&#35519;&#25972;&#12375;&#12390;&#12356;&#12365;&#12414;&#12377;
TerDiaPoint

#&#21454;&#37682;&#12486;&#12540;&#12510;&#12434;&#32057;&#20171;
TerDiaPoint +
  #&#38738;&#32209;&#33590;&#12398;&#33394;&#21512;&#12356;&#12434;&#36969;&#24540;:theme_rgbw&#12467;&#12510;&#12531;&#12489;
  theme_rgbw() + 
  #&#20182;&#12398;&#33394;&#21512;&#12356;&#12398;&#12486;&#12540;&#12510;
  #theme_gray(),theme_dark(),theme_rgbg(),
  #theme_tropical(),theme_bluedark(),theme_bluelight(),
  #theme_bvbw(),theme_bvbg()
  
  #&#30690;&#21360;&#38263;&#12373;&#12434;&#35519;&#25972;:theme_arrowlength&#12467;&#12510;&#12531;&#12489;1
  #&#38283;&#22987;,&#32066;&#20102;:start&#12458;&#12503;&#12471;&#12519;&#12531;;0-1,&#21021;&#26399;&#20516;:getOption("tern.arrow.start")
  #finish&#12458;&#12503;&#12471;&#12519;&#12531;;0-1,&#21021;&#26399;&#20516;:getOption("tern.arrow.start")
  theme_arrowlength(start = 0.5, finish = 1)
  #&#20197;&#19979;&#30690;&#21360;&#12395;&#38306;&#12377;&#12427;&#12486;&#12540;&#12510;
  #theme_arrowsmall(),theme_arrowshort(),theme_arrownormal(),
  #theme_arrowdefault(),theme_arrowlarge()
  
#&#25351;&#23450;&#12375;&#12383;&#36794;&#12363;&#12425;&#32218;&#12434;&#24341;&#12367;:geom_Tline/geom_Lline/geom_Rline&#12467;&#12510;&#12531;&#12489;
#&#38283;&#22987;&#20301;&#32622;:T|L|Rintercept&#12458;&#12503;&#12471;&#12519;&#12531;;0-1
#&#30690;&#21360;&#35373;&#23450;:arrow&#12458;&#12503;&#12471;&#12519;&#12531;;ggplot2::arrow()&#12467;&#12510;&#12531;&#12489;&#12392;&#32068;&#12415;&#21512;&#12431;&#12379;&#12427;
TerDiaPoint +
  #&#24038;&#12363;&#12425;&#21491;&#20596;:geom_Tline&#12467;&#12510;&#12531;&#12489;
  geom_Tline(Tintercept = .5, arrow = ggplot2::arrow(),
             colour = "yellow", size = 1.5) +
  #&#24213;&#36794;&#12363;&#12425;&#21491;&#20596;:geom_Lline&#12467;&#12510;&#12531;&#12489;
  geom_Lline(Lintercept = .2, arrow = ggplot2::arrow(),
             colour = "#4b61ba", size = 1.5) +
  #&#21491;&#20596;&#12363;&#12425;&#24213;&#36794;:geom_Rline&#12467;&#12510;&#12531;&#12489;
  geom_Rline(Rintercept = .1, arrow = ggplot2::arrow(),
             colour = "#a87963", size = 1.5)

#&#12487;&#12540;&#12479;&#20998;&#24067;&#12434;&#12464;&#12521;&#12487;&#12540;&#12471;&#12519;&#12531;&#12391;&#34920;&#31034;:stat_density_tern&#12467;&#12510;&#12531;&#12489;
#&#22793;&#25563;&#26041;&#24335;:base&#12458;&#12503;&#12471;&#12519;&#12531;;identity:&#30452;&#25509;&#30340;&#12394;&#12487;&#12459;&#12523;&#12488;&#31354;&#38291;,
#ilr:&#12450;&#12452;&#12477;&#12513;&#12488;&#12522;&#12483;&#12463;&#23550;&#25968;&#27604;
ggtern(data = TestData, aes(X, Y, Z)) +
  stat_density_tern(geom = "polygon",
                    aes(fill = ..level..),
                    base = "ilr") +
  scale_fill_viridis()

#&#12487;&#12540;&#12479;&#20998;&#24067;&#12434;&#20845;&#35282;&#24418;&#12391;&#34920;&#31034;:stat_geom_hex_tern&#12467;&#12510;&#12531;&#12489;
#&#12499;&#12531;&#12434;&#35373;&#23450;:binwidth&#12458;&#12503;&#12471;&#12519;&#12531;;0-1
TerDiaPoint +
  geom_hex_tern(binwidth = 0.1) +
  scale_fill_viridis()
               
#&#22259;&#12434;&#22238;&#36578;:theme_rotate&#12467;&#12510;&#12531;&#12489;
#&#24230;&#25968;:degrees&#12458;&#12503;&#12471;&#12519;&#12531;
TerDiaPoint + 
  theme_rotate(degrees = 90)

#&#22806;&#21608;&#12395;&#30690;&#21360;&#12434;&#36861;&#21152;:theme_showarrows&#12467;&#12510;&#12531;&#12489;
TerDiaPoint +
  theme_showarrows()

#&#21508;&#22806;&#21608;&#30690;&#21360;&#12398;&#12521;&#12505;&#12523;&#21517;&#12434;&#22793;&#26356;:Tarrowlab/Larrowlab/Rarrowlab&#12467;&#12510;&#12531;&#12489;
TerDiaPoint +
  theme_showarrows() +
  #&#21491;&#20596;
  Tarrowlab(label = "&#12363;&#12425;&#12384;&#12395;") +
  #&#24038;&#20596;
  Larrowlab(label = "&#12356;&#12356;&#12418;&#12398;") +
  #&#24213;&#36794;&#20596;
  Rarrowlab(label = "&#12383;&#12414;&#12395;&#26356;&#26032;") 

#&#21508;&#38914;&#28857;&#12398;&#12521;&#12505;&#12523;&#21517;&#12434;&#22793;&#26356;:Tlab/Llab/Rlab&#12467;&#12510;&#12531;&#12489;
TerDiaPoint +
  #&#19978;
  Tlab(label = "&#12363;&#12425;&#12384;&#12395;") +
  #&#24038;&#19979;
  Llab(label = "&#12356;&#12356;&#12418;&#12398;") +
  #&#21491;&#19979;
  Rlab(label = "&#12383;&#12414;&#12395;\n&#26356;&#26032;") 

#&#21508;&#12471;&#12531;&#12508;&#12523;&#12363;&#12425;&#21508;&#36794;&#12408;&#32218;&#12434;&#24341;&#12367;:geom_Tmark,_Lmark,_Rmark,_crosshair_tern&#12467;&#12510;&#12531;&#12489;
TmTerDiaPoint <- TerDiaPoint + geom_Tmark(col = "#4b61ba") + 
  labs(title = "geom Tmark")
LmTerDiaPoint <- TerDiaPoint + geom_Lmark(col = "#a87963") +
  labs(title = "geom Lmark")
RmTerDiaPoint <- TerDiaPoint + geom_Rmark(col = "#505457") + 
  labs(title = "geom Rmark")
CHTerDiaPoint <- TerDiaPoint + geom_crosshair_tern(col = "#deb7a0") +
  labs(title = "geom chrosshair tern")
#&#20869;&#23481;&#30906;&#35469;
grid.arrange(TmTerDiaPoint, LmTerDiaPoint, RmTerDiaPoint, CHTerDiaPoint)

#&#21508;&#38914;&#28857;&#12363;&#12425;&#32218;&#12434;&#24341;&#12367;:geom_Tisoprop,geom_Lisoprop,geom_Risoprop&#12467;&#12510;&#12531;&#12489;
#&#20301;&#32622;&#12434;&#25351;&#23450;:value&#12458;&#12503;&#12471;&#12519;&#12531;
TpTerDiaPoint <- TerDiaPoint +
  geom_Tisoprop(col = "#4b61ba", value = c(.4, .6)) +
  labs(title = "geom Tisoprop")
LpTerDiaPoint <- TerDiaPoint +
  geom_Lisoprop(col = "#a87963", value = c(.4, .6)) +
  labs(title = "geom Lisoprop")
RpTerDiaPoint <- TerDiaPoint +
  geom_Risoprop(col = "#505457", value = c(.4, .6)) +
  labs(title = "geom Risoprop")
TLRTerDiaPoint <- TerDiaPoint +
  geom_Tisoprop(col = "#4b61ba", value = c(.4, .6)) +
  geom_Risoprop(col = "#505457", value = c(.4, .6)) +
  geom_Lisoprop(col = "#a87963", value = c(.4, .6)) +
  labs(title = "ALL isoprop")
#&#30906;&#35469;
grid.arrange(TpTerDiaPoint, LpTerDiaPoint, RpTerDiaPoint, TLRTerDiaPoint)

出力例

・三角ダイアグラムの基本を作成:ggternコマンド

・収録テーマを紹介

・指定した辺から線を引く:geom_Tline/geom_Lline/geom_Rlineコマンド

・データ分布をグラデーションで表示:stat_density_ternコマンド

・データ分布を六角形で表示:stat_geom_hex_ternコマンド

・図を回転:theme_rotateコマンド

・各外周矢印のラベル名を変更:Tarrowlab/Larrowlab/Rarrowlabコマンド

・各シンボルから各辺へ線を引く:geom_Tmark,_Lmark,_Rmark,_crosshair_ternコマンド

・各頂点から線を引く:geom_Tisoprop,geom_Lisoprop,geom_Risopropコマンド


少しでも、あなたの解析が楽になりますように!!

タイトルとURLをコピーしました