首页 > 科研绘图 > 科研巨佬的“万水千山图”是如何绘制的?
2022
07-08

科研巨佬的“万水千山图”是如何绘制的?

最近,在文献中看到这样一个令人惊艳不已的组合图,如下。很明显,这个图至少是由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.



最后编辑:
作者:萌小白
一个热爱网络的青年!

发布评论

表情