三元图适合展示一个事件在三个类别之间的组成倾向。这里每个点代表一个基因或突变事件位置由 Low Grade Glioma、Primary GBM 和 Secondary GBM 三组比例共同决定。图片来源项目内容文章Mutational Landscape of Secondary Glioblastoma Guides MET-Targeted Trial in Brain Tumor期刊/年份Cell, 2018图号Figure 1BDOI/链接https://doi.org/10.1016/j.cell.2018.09.038这张图用三元坐标把不同基因改变在低级别胶质瘤、原发 GBM、继发 GBM 中的相对富集方向放到同一个三角形里非常适合做“三组组成比例”的可视化复现。图片解读这是一张 ternary plot三元比例图。三角形三个顶点分别代表三个类别顶点含义顶部Low Grade Glioma左下角Primary GBM右下角Secondary GBM每个点代表一个基因改变或分子事件。点越靠近某个顶点说明它在该类别中的比例越高。点的大小可以映射事件强度、频率或重要性点的颜色可以映射其中一个类别的比例例如 Secondary GBM 占比。输入数据输入数据需要是长表每一行代表一个基因或事件三组比例相加最好为 100。列名含义alteration基因或事件名称low_grade_gliomaLow Grade Glioma 中的比例primary_gbmPrimary GBM 中的比例secondary_gbmSecondary GBM 中的比例score点大小映射值label_dx标签横向微调label_dy标签纵向微调library(tidyverse)dat-read_csv(input_data.csv,show_col_typesFALSE)需要示例数据的后台添加小编领取调整好数据结构以下代码可以直接复制粘贴运行。第一步把三组比例转换成三角坐标三元图本质上是把三个比例映射到一个等边三角形中。这里不依赖额外三元图包直接用坐标变换完成。tri_h-sqrt(3)/2to_xy-function(low_grade_glioma,primary_gbm,secondary_gbm){total-low_grade_gliomaprimary_gbmsecondary_gbm tibble(x(secondary_gbm0.5*low_grade_glioma)/total,ytri_h*low_grade_glioma/total)}point_df-bind_cols(dat,to_xy(dat$low_grade_glioma,dat$primary_gbm,dat$secondary_gbm))|mutate(lab_xxlabel_dx,lab_yylabel_dy)第二步绘制三角边框和内部网格三元图的阅读依赖网格线。这里分别绘制三个方向的 20、40、60、80 辅助线。triangle-tibble(xc(0,1,0.5,0),yc(0,0,tri_h,0))make_seg-function(type,value,start,end){tibble(typetype,valuevalue,xstart$x,ystart$y,xendend$x,yendend$y)}grid_df-purrr::map_dfr(seq(20,80,by20),function(v){bind_rows(make_seg(low,v,to_xy(v,100-v,0),to_xy(v,0,100-v)),make_seg(primary,v,to_xy(100-v,v,0),to_xy(0,v,100-v)),make_seg(secondary,v,to_xy(100-v,0,v),to_xy(0,100-v,v)))})第三步添加刻度、顶点标签和方向箭头顶点标签用不同颜色强调三个类别方向箭头用于提示三组比例变化趋势。tick_low-tibble(valueseq(20,80,by20))tick_low-bind_cols(tick_low,to_xy(tick_low$value,100-tick_low$value,0))|mutate(labelas.character(value),angle-60,xx-0.045,yy)tick_primary-tibble(valueseq(20,100,by20))tick_primary-bind_cols(tick_primary,to_xy(0,tick_primary$value,100-tick_primary$value))|mutate(labelas.character(value),angle55,xx-0.018,yy-0.040)tick_secondary-tibble(valueseq(20,100,by20))tick_secondary-bind_cols(tick_secondary,to_xy(0,100-tick_secondary$value,tick_secondary$value))|mutate(labelas.character(value),angle0,xx,yy-0.043)axis_lab-tribble(~label,~x,~y,~col,~hjust,Low Grade Glioma,0.50,tri_h.045,blue,0.5,Primary\nGBM,-0.085,-0.055,magenta,0.5,Secondary\nGBM,1.085,-0.055,red,0.5)arrow_df-tribble(~x,~y,~xend,~yend,~col,-0.11,0.46,-0.23,0.30,#bb33ff,0.50,-0.11,0.72,-0.11,#e0007a,1.10,0.30,0.94,0.47,#4050ff,1.10,0.30,1.21,0.17,#d81b60)第四步叠加突变点和基因标签点的位置由三组比例决定点大小用score控制颜色用secondary_gbm控制。标签可以通过label_dx和label_dy做局部微调。p-ggplot()geom_segment(datagrid_df,aes(x,y,xendxend,yendyend),color#e6e6e6,linewidth0.25)geom_path(datatriangle,aes(x,y),linewidth0.42,colorblack)geom_text(databind_rows(tick_low,tick_primary,tick_secondary),aes(x,y,labellabel,angleangle),size1.80,color#3a3a3a)geom_curve(dataarrow_df,aes(x,y,xendxend,yendyend,colorcol),curvature0,linewidth0.60,arrowarrow(lengthunit(0.055,inches)),show.legendFALSE)geom_point(datapoint_df,aes(x,y,sizescore,fillsecondary_gbm),shape21,colorblack,stroke0.32,alpha0.96)geom_segment(datapoint_df,aes(x,y,xendlab_x,yendlab_y),color#333333,linewidth0.16,alpha0.55)geom_text(datapoint_df,aes(lab_x,lab_y,labelalteration),size2.05,fontfaceitalic,color#202020)geom_text(dataaxis_lab,aes(x,y,labellabel,colorcol,hjusthjust),size2.15,lineheight0.90,show.legendFALSE)scale_fill_gradientn(coloursc(#f1d8f8,#7a237d,#cf0017),limitsc(0,100))scale_size(rangec(1.30,4.55),guidenone)scale_color_identity()coord_equal(xlimc(-0.23,1.23),ylimc(-0.13,tri_h0.08),clipoff)theme_void()theme(legend.positionnone,plot.backgroundelement_rect(fillwhite,colorNA),plot.marginmargin(10,14,12,14))第五步导出图片ggsave(ternary_glioma_alteration.png,p,width3.7,height3.05,dpi420,bgwhite)ggsave(ternary_glioma_alteration.pdf,p,width3.7,height3.05,bgwhite)完整代码library(tidyverse)library(scales)dat-read_csv(input_data.csv,show_col_typesFALSE)tri_h-sqrt(3)/2to_xy-function(low_grade_glioma,primary_gbm,secondary_gbm){total-low_grade_gliomaprimary_gbmsecondary_gbm tibble(x(secondary_gbm0.5*low_grade_glioma)/total,ytri_h*low_grade_glioma/total)}point_df-bind_cols(dat,to_xy(dat$low_grade_glioma,dat$primary_gbm,dat$secondary_gbm))|mutate(lab_xxlabel_dx,lab_yylabel_dy)triangle-tibble(xc(0,1,0.5,0),yc(0,0,tri_h,0))make_seg-function(type,value,start,end){tibble(typetype,valuevalue,xstart$x,ystart$y,xendend$x,yendend$y)}grid_df-purrr::map_dfr(seq(20,80,by20),function(v){bind_rows(make_seg(low,v,to_xy(v,100-v,0),to_xy(v,0,100-v)),make_seg(primary,v,to_xy(100-v,v,0),to_xy(0,v,100-v)),make_seg(secondary,v,to_xy(100-v,0,v),to_xy(0,100-v,v)))})tick_low-tibble(valueseq(20,80,by20))tick_low-bind_cols(tick_low,to_xy(tick_low$value,100-tick_low$value,0))|mutate(labelas.character(value),angle-60,xx-0.045,yy)tick_primary-tibble(valueseq(20,100,by20))tick_primary-bind_cols(tick_primary,to_xy(0,tick_primary$value,100-tick_primary$value))|mutate(labelas.character(value),angle55,xx-0.018,yy-0.040)tick_secondary-tibble(valueseq(20,100,by20))tick_secondary-bind_cols(tick_secondary,to_xy(0,100-tick_secondary$value,tick_secondary$value))|mutate(labelas.character(value),angle0,xx,yy-0.043)axis_lab-tribble(~label,~x,~y,~col,~hjust,Low Grade Glioma,0.50,tri_h.045,blue,0.5,Primary\nGBM,-0.085,-0.055,magenta,0.5,Secondary\nGBM,1.085,-0.055,red,0.5)arrow_df-tribble(~x,~y,~xend,~yend,~col,-0.11,0.46,-0.23,0.30,#bb33ff,0.50,-0.11,0.72,-0.11,#e0007a,1.10,0.30,0.94,0.47,#4050ff,1.10,0.30,1.21,0.17,#d81b60)p-ggplot()geom_segment(datagrid_df,aes(x,y,xendxend,yendyend),color#e6e6e6,linewidth0.25)geom_path(datatriangle,aes(x,y),linewidth0.42,colorblack)geom_text(databind_rows(tick_low,tick_primary,tick_secondary),aes(x,y,labellabel,angleangle),size1.80,color#3a3a3a)geom_curve(dataarrow_df,aes(x,y,xendxend,yendyend,colorcol),curvature0,linewidth0.60,arrowarrow(lengthunit(0.055,inches)),show.legendFALSE)geom_point(datapoint_df,aes(x,y,sizescore,fillsecondary_gbm),shape21,colorblack,stroke0.32,alpha0.96)geom_segment(datapoint_df,aes(x,y,xendlab_x,yendlab_y),color#333333,linewidth0.16,alpha0.55)geom_text(datapoint_df,aes(lab_x,lab_y,labelalteration),size2.05,fontfaceitalic,color#202020)geom_text(dataaxis_lab,aes(x,y,labellabel,colorcol,hjusthjust),size2.15,lineheight0.90,show.legendFALSE)scale_fill_gradientn(coloursc(#f1d8f8,#7a237d,#cf0017),limitsc(0,100))scale_size(rangec(1.30,4.55),guidenone)scale_color_identity()coord_equal(xlimc(-0.23,1.23),ylimc(-0.13,tri_h0.08),clipoff)theme_void()theme(legend.positionnone,plot.backgroundelement_rect(fillwhite,colorNA),plot.marginmargin(10,14,12,14))ggsave(ternary_glioma_alteration.png,p,width3.7,height3.05,dpi420,bgwhite)ggsave(ternary_glioma_alteration.pdf,p,width3.7,height3.05,bgwhite)复现结果参考链接DOI: https://doi.org/10.1016/j.cell.2018.09.038文章链接: https://www.cell.com/cell/fulltext/S0092-8674(18)31250-9