科研巨佬的“万水千山图”是如何绘制的?
卖萌控的博客
点击这里进入电脑版页面!体验更好
科研巨佬的“万水千山图”是如何绘制的?
2022-7-8 萌小白


最近,在文献中看到这样一个令人惊艳不已的组合图,如下。很明显,这个图至少是由8个小图表组合而成的,通过坐标轴粗细和图表间隔的不一致可以看出来。可见,熟练使用Ai(Adobe illustrator)也是成为科研巨佬的必备技能。






(The Plant Cell, 2020)



除去两侧的聚类树和条形图,组合图的中间部分其实是一种比较新颖的山峦图,也称作山脊线图(Ridgeline plots),可以用作图软件一次性画出来。



山峦图本质上是多个核密度曲线图的相互重叠组合,当然,你也可以看作是只有半个“小提琴”的横向小提琴图。山峦图的用法与小提琴图、箱形图相似,主要用于展示和比较数据(比如基因的表达量、物种的丰度等)的分布情况,而外形上却具有中国山水画的美感。






可以说,能用箱形图、小提琴图展示的数据都以试试山峦图,可能会得到出乎预料的效果。那么,如何绘制这样的山峦图呢?这里推荐使用基于ggplot2的ggridges包。



一、 R包安装与数据导入



山峦图的绘制主要用到ggridges包的geom_density_ridges函数,无需统计分析,可直接使用原始数据绘制密度曲线。



#安装ggridges包;



#install.packages("ggridges")



#载入ggridges和ggplot2包;



library(ggridges)



library(ggplot2)



#读入本地数据;



dt<- read.csv( "test.csv",header = T,row.names = 1)



#查看数据的前12行;



head(dt,12)






二、绘制无分组山峦图



#建立单样本的映射关系;



p1<- ggplot(dt, aes(x = expression, y = cluster,



color= cluster, fill = cluster))



p1






#添加“山峦”图层,查看初始绘图效果;



#scale参数设置绘图区域重叠部分的大小,scale=1 时刚好没有重叠(以最高的为准),数值越大,重叠部分越多;



#alpha设置填充颜色的透明度;



p2<- p1+ geom_density_ridges(scale = 1.6, alpha = 0.3)



p2






#去掉密度曲线两侧的“尾巴”;



p3<- p1+ geom_density_ridges(scale = 1.6, alpha = 0.5,rel_min_height=0.01)



p3



参数rel_min_height用于设置曲线的最小高度(相对于对应曲线最大高度的百分比)。一般来说,rel_min_height=0.01或更大时可去掉密度曲线两侧的“尾巴”。






#添加分位线(中位线);



#线的样式可选solid、dashed、dotted、dotdash、longdash、twodash等。也可指定单一颜色,如vline_color="black";



p3<- p1+ geom_density_ridges(scale = 1.6, alpha = 0.4,



rel_min_height=0.01,



quantile_lines= TRUE,



quantiles= 0.5,



vline_size=0.3,



vline_linetype= "dashed")



p3






#调整坐标轴,修改标题,去掉空余区域;



#coord_cartesian(clip = "off")可避免图形边缘被绘图区剪切;



p4<- p3+scale_y_discrete( name = "") +



scale_x_continuous(name = "Expression levels")+



coord_cartesian(expand=FALSE, clip = "off")



p4






#自定义颜色,并隐藏图例;



mycolor<- c( "#0077c1", "#00a99e", "#6bc72b", "#ff5a20", "#ff1620", "#752995")



p5<- p4+scale_fill_manual(values = rev(mycolor), guide = "none") +



scale_color_manual(values = rev(mycolor), guide = "none")



p5



#p5+theme_ridges(grid = FALSE)






#自定义图形主题;



#去掉panel.background填充颜色;



#去掉纵轴的刻度、横轴的网格线;



#设置坐标轴线、网格线的颜色、粗细;



#Line/border size 的单位是 mm,text size 的单位是 pts;



#设置绘图区边距,顺序为top, right, bottom, left;



mytheme<- theme(panel.background = element_rect(fill = NA),



plot.margin = margin(t=10,r=10,b=5,l=5,unit = "mm"),



axis.ticks.y = element_blank,



axis.ticks.x = element_line(colour = "grey40",size = 0.5),



axis.line.x = element_line(colour = "grey40",size = 0.5),



axis.text.x = element_text(size = 10),



axis.title.x = element_text(size = 12),



panel.grid.major.y = element_line(colour = rev(mycolor),size = 0.5),



panel.grid.major.x = element_blank)



#应用自定义主题;



p5+mytheme






当然,也可以令coord_cartesian(expand=TRUE, clip = "off"),通过panel.grid.major.y = element_line(colour = NA,size = 0.5) 隐藏主刻度线,效果如下。






三、 绘制分组山峦图



#建立分组映射并绘制山峦图;



p6<- ggplot(dt, aes(x = expression, y = cluster, color = sex, fill = sex))+



geom_density_ridges(scale = 1.6, alpha = 0.4,rel_min_height=0.01,



quantile_lines= TRUE,



quantiles= 0.5,



vline_size=0.3,



vline_linetype= "dashed")



p6






#自定义图形主题,图形的个性化调整同上,这里不再赘述;



mytheme1<- theme(panel.background = element_rect(fill = NA),



plot.margin = margin(t=10,r=10,b=5,l=5,unit = "mm"),



axis.ticks.y = element_blank,



axis.ticks.x = element_line(colour = "grey40",size = 0.5),



axis.line.x = element_line(colour = "grey40",size = 0.5),



axis.text.x = element_text(size = 10),



axis.title.x = element_text(size = 12),



panel.grid.major.y = element_line(colour = NA,size = 0.5),



panel.grid.major.x = element_blank)



#自定义颜色和图例;



mycolor1<- c( "#00a99e", "#6bc72b")



p7<- p6+scale_y_discrete( name = "")+



scale_x_continuous(name = "Expression levels")+



coord_cartesian(expand=FALSE, clip = "off")+



scale_fill_manual(values = mycolor1) +



scale_color_manual(values = mycolor1)+



guides(fill = guide_legend(override.aes = list(fill = mycolor1,color = NA)))



p7+mytheme1






这样,分组山峦图的绘制就完成了。除此之外,ggridges包还有很多更复杂的绘图的功能,比如通过使用jittered_points = TRUE,point_shape = "|" 参数可以添加密度线,如下图,图形颜色还可以使用渐变色或者按照分位线着色等。






本次分享就先到这里啦,更多复杂的绘图功能欢迎查看官方的使用教程。



链接:



https://wilkelab.org/ggridges/index.html






参考文献






Sucher J, Mbengue M, Dresen A, et al.
Phylotranomics of the Pentapetalae reveals frequent regulatory variation
in plant local responses to the fungal pathogen Sclerotinia
sclerotiorum[J]. The Plant Cell, 2020, 32(6): 1820-1844.



发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容