R语言可视化(三十三):三元图绘制

33. 三元图绘制


清除当前环境中的变量

rm(list=ls())

设置工作目录

setwd("C:/Users/Dell/Desktop/R_Plots/33ternary/")

使用Ternary包绘制三元图

# 安装并加载所需的R包
#install.packages("Ternary")
library(Ternary)

# 构建示例数据
coords <- list(
  A = c(1, 0, 2),
  B = c(1, 1, 1),
  C = c(1.5, 1.5, 0),
  D = c(0.5, 1.5, 1)
)
color <- c("red","blue","green","orange")
size <- c(2,3,4,5)
coords
## $A
## [1] 1 0 2
## 
## $B
## [1] 1 1 1
## 
## $C
## [1] 1.5 1.5 0.0
## 
## $D
## [1] 0.5 1.5 1.0

color
## [1] "red"    "blue"   "green"  "orange"

size
## [1] 2 3 4 5

# 使用TernaryPlot函数绘制基础三元图
TernaryPlot(alab = "X",blab = "Y",clab = "Z", lab.offset = 0.1,
            atip = "Top", btip = "Bottom", ctip = "Right", 
            axis.col = "red", grid.col = "gray",grid.minor.lines = F,
            col="gray90")
# 添加箭头
TernaryArrows(coords[1], coords[2:4], col='blue', length=0.2, lwd=1)
# 添加连线
AddToTernary(lines, coords, col='red', lty='dotted', lwd=4)
# 添加散点
TernaryPoints(coords, pch=20, cex=size, col=color)
# 添加文本信息
TernaryText(coords, cex=1.5, col='black', font=2, pos=1)
image.png

使用vcd包绘制三元图

# 安装并加载所需的R包
#install.packages("vcd")
library(vcd)

# 加载示例数据
data("Arthritis")
## Build table by crossing Treatment and Sex
tab <- as.table(xtabs(~ I(Sex:Treatment) + Improved, data = Arthritis))
head(tab)
##                 Improved
## I(Sex:Treatment) None Some Marked
##   Female:Placebo   19    7      6
##   Female:Treated    6    5     16
##   Male:Placebo     10    0      1
##   Male:Treated      7    2      5

## Mark groups
col <- c("red", "red", "blue", "blue")
pch <- c(1, 19, 1, 19)

## 使用ternaryplot函数绘制三元图
ternaryplot(
  tab,
  col = col,
  pch = pch,
  prop_size = TRUE,
  bg = "lightgray",
  grid_color = "white",
  labels_color = "black",
  dimnames_position = "edge",
  border = "red",
  main = "Arthritis Treatment Data"
)
## 添加图例
grid_legend(x=0.8, y=0.7, pch, col, labels = rownames(tab), title = "GROUP")
image.png

使用ggtern包绘制三元图

# 安装并加载所需的R包
#install.packages("ggtern")
library(ggtern)
## Warning: package 'ggtern' was built under R version 3.6.3
## Loading required package: ggplot2
## Warning: package 'ggplot2' was built under R version 3.6.3
## Registered S3 methods overwritten by 'ggtern':
##   method           from   
##   grid.draw.ggplot ggplot2
##   plot.ggplot      ggplot2
##   print.ggplot     ggplot2
## --
## Remember to cite, run citation(package = 'ggtern') for further info.
## --
## 
## Attaching package: 'ggtern'
## The following objects are masked from 'package:ggplot2':
## 
##     aes, annotate, ggplot, ggplot_build, ggplot_gtable,
##     ggplotGrob, ggsave, layer_data, theme_bw, theme_classic,
##     theme_dark, theme_gray, theme_light, theme_linedraw,
##     theme_minimal, theme_void
library(ggplot2)

# 加载并查看示例数据
data(Feldspar)
head(Feldspar)
##    Experiment    Feldspar    Ab    Or    An T.C P.Gpa
## 17         G5     Alkalai 0.333 0.657 0.010 700   0.3
## 18         A4     Alkalai 0.331 0.658 0.011 700   0.3
## 20      G10-9     Alkalai 0.232 0.763 0.005 650   0.3
## 38         A4 Plagioclase 0.763 0.072 0.165 700   0.3
## 40      G10-9 Plagioclase 0.772 0.060 0.168 650   0.3
## 7          K1     Alkalai 0.282 0.700 0.018 800   0.2

#使用ggtern函数绘制基础三元图
ggtern(data=Feldspar,aes(x=An,y=Ab,z=Or)) + 
  geom_point()
image.png
# 设置点的形状、大小和颜色
ggtern(Feldspar,aes(Ab,An,Or)) + 
  geom_point(size=5,aes(shape=Feldspar,fill=Feldspar),color='black') +
  scale_shape_manual(values=c(21,24)) + #自定义形状和颜色
  theme_rgbg() + #更换主题
  labs(title = "Demonstration of Raster Annotation")
image.png
ggtern(Feldspar,aes(Ab,An,Or)) + 
  geom_point(size=5,aes(shape=Feldspar,fill=Feldspar),color='black') +
  scale_shape_manual(values=c(21,24)) + #自定义形状和颜色
  theme_bvbw() + #更换主题
  labs(title = "Demonstration of Raster Annotation") +
  geom_smooth_tern() #添加拟合曲线
image.png
# 加载并查看示例数据
data(Fragments)
head(Fragments)
##   Watershed Position CCWI Precipitation Discharge Relief GrainSize Sample
## 1         2 Tallulah  100           173        81   0.81    Coarse      A
## 2         2 Tallulah  100           173        81   0.81    Coarse      B
## 3         2 Tallulah  100           173        81   0.81    Coarse      C
## 4         2 Tallulah  100           173        81   0.81    Medium      A
## 5         2 Tallulah  100           173        81   0.81    Medium      B
## 6         2 Tallulah  100           173        81   0.81    Medium      C
##   Points   Qm   Qp   Rf    M
## 1    247 13.4 40.0 43.7  2.8
## 2    265 12.5 40.0 44.1  3.4
## 3    263 14.1 38.4 43.0  4.6
## 4    323 35.3 25.7 27.7 11.5
## 5    252 38.9 17.9 31.0 12.3
## 6    264 36.4 20.0 33.4 10.3

# 添加密度曲线,进行分面
ggtern(Fragments,aes(Qm+Qp,Rf,M,colour=Sample)) +
    geom_point(aes(shape=Position,size=Relief)) + 
    theme_bw(base_size=8) + 
    theme_showarrows() + # 更换主题
    geom_density_tern(h=2,aes(fill=..level..),
                    expand=0.75,alpha=0.5,bins=5) + 
    custom_percent('%') + 
    labs(title = "Grantham and Valbel Rock Fragment Data",
         x = "Q_{m+p}", xarrow = "Quartz (Multi + Poly)",
         y = "R_f",     yarrow = "Rock Fragments",
         z = "M",       zarrow = "Mica") + 
    theme_latex() + 
    facet_wrap(~Sample)
image.png
library(plyr)
#Load the Data.
data(USDA)
head(USDA)
##   Clay Sand Silt      Label
## 1 1.00 0.00 0.00       Clay
## 2 0.55 0.45 0.00       Clay
## 3 0.40 0.45 0.15       Clay
## 4 0.40 0.20 0.40       Clay
## 5 0.60 0.00 0.40       Clay
## 6 0.55 0.45 0.00 Sandy Clay

#Put tile labels at the midpoint of each tile.
USDA.LAB <- ddply(USDA,"Label",function(df){
  apply(df[,1:3],2,mean)
})

#Tweak
USDA.LAB$Angle = sapply(as.character(USDA.LAB$Label),function(x){
  switch(x,"Loamy Sand"=-35,0)
})
head(USDA.LAB)
##             Label       Clay      Sand       Silt Angle
## 1            Clay 0.59000000 0.2200000 0.19000000     0
## 2      Sandy Clay 0.41666667 0.5166667 0.06666667     0
## 3 Sandy Clay Loam 0.27500000 0.5750000 0.15000000     0
## 4      Sandy Loam 0.09285714 0.6214286 0.28571429     0
## 5      Loamy Sand 0.06250000 0.8250000 0.11250000   -35
## 6            Sand 0.03333333 0.9166667 0.05000000     0

#Construct the plot.
ggtern(data=USDA,aes(Sand,Clay,Silt,color=Label,fill=Label)) +
  geom_polygon(alpha=0.75,size=0.5,color="black") +
  geom_mask() +  
  geom_text(data=USDA.LAB,aes(label=Label,angle=Angle),
            color="black",size=3.5) +
  theme_rgbw() + 
  theme_showsecondary() +
  theme_showarrows() +
  weight_percent() + 
  #guides(fill='none') + 
  theme_legend_position("topright") + 
  labs(title = "USDA Textural Classification Chart",
       fill  = "Textural Class",
       color = "Textural Class")
image.png
sessionInfo()
## R version 3.6.0 (2019-04-26)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## Running under: Windows 10 x64 (build 18363)
## 
## Matrix products: default
## 
## locale:
## [1] LC_COLLATE=Chinese (Simplified)_China.936 
## [2] LC_CTYPE=Chinese (Simplified)_China.936   
## [3] LC_MONETARY=Chinese (Simplified)_China.936
## [4] LC_NUMERIC=C                              
## [5] LC_TIME=Chinese (Simplified)_China.936    
## 
## attached base packages:
## [1] grid      stats     graphics  grDevices utils     datasets  methods  
## [8] base     
## 
## other attached packages:
## [1] plyr_1.8.4    ggtern_3.3.0  ggplot2_3.3.2 vcd_1.4-8     Ternary_1.2.0
## 
## loaded via a namespace (and not attached):
##  [1] zoo_1.8-6          tidyselect_1.1.0   xfun_0.8          
##  [4] purrr_0.3.2        splines_3.6.0      lattice_0.20-38   
##  [7] latex2exp_0.4.0    colorspace_1.4-1   vctrs_0.3.2       
## [10] generics_0.0.2     htmltools_0.3.6    viridisLite_0.3.0 
## [13] yaml_2.2.0         mgcv_1.8-28        compositions_2.0-0
## [16] rlang_0.4.7        isoband_0.2.2      later_0.8.0       
## [19] pillar_1.4.2       glue_1.4.2         withr_2.1.2       
## [22] lifecycle_0.2.0    robustbase_0.93-5  stringr_1.4.0     
## [25] munsell_0.5.0      gtable_0.3.0       evaluate_0.14     
## [28] labeling_0.3       knitr_1.23         httpuv_1.5.1      
## [31] lmtest_0.9-37      DEoptimR_1.0-8     proto_1.0.0       
## [34] Rcpp_1.0.5         xtable_1.8-4       promises_1.0.1    
## [37] scales_1.0.0       mime_0.7           gridExtra_2.3     
## [40] tensorA_0.36.1     digest_0.6.20      stringi_1.4.3     
## [43] dplyr_1.0.2        shiny_1.3.2        tools_3.6.0       
## [46] magrittr_1.5       tibble_2.1.3       crayon_1.3.4      
## [49] pkgconfig_2.0.2    Matrix_1.2-17      MASS_7.3-51.4     
## [52] bayesm_3.1-4       rmarkdown_1.13     R6_2.4.0          
## [55] nlme_3.1-139       compiler_3.6.0
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352

推荐阅读更多精彩内容