前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >跟着Nature学作图:R语言ggplot2山脊图添加辅助线/图例添加到左下角

跟着Nature学作图:R语言ggplot2山脊图添加辅助线/图例添加到左下角

作者头像
用户7010445
发布2023-01-06 19:09:30
7520
发布2023-01-06 19:09:30
举报
文章被收录于专栏:小明的数据分析笔记本

论文

Graph pangenome captures missing heritability and empowers tomato breeding

https://www.nature.com/articles/s41586-022-04808-9#MOESM8

没有找到论文里的作图的代码,但是找到了部分组图数据,我们可以用论文中提供的原始数据模仿出论文中的图

今天的推文重复一下论文中的Figure2a

image.png

主要知识点

  • 如何在山脊图上添加辅助线
  • 另外一个知识点是如何把图例放到整个图的左下角

部分示例数据截图

image.png

读取数据

代码语言:javascript
复制
library(readxl)

dat.fig2a<-read_excel("data/20220711/41586_2022_4808_MOESM6_ESM.xlsx",
                      sheet = "Fig2a",
                      skip = 1)

数据转换为长格式

代码语言:javascript
复制
library(tidyverse)
library(stringr)
reshape2::melt(dat.fig2a) %>% 
  select(variable,value) %>% 
  mutate(new_col01 = str_split_fixed(variable,'_',2)[,1],
         new_col02 = str_split_fixed(variable,'_',2)[,2]) -> new.df

这里还有一个知识点是 指定分隔符拆分字符串函数 str_split_fixed()可以指定拆分成多少个

赋予因子水平

代码语言:javascript
复制
new.df$new_col02<-factor(new.df$new_col02,
                         levels = c("snps","indels","svs",
                                    "snps_indels","snps_indels_svs"))

基本作图代码

代码语言:javascript
复制
ggplot(data=new.df,aes(x=value,y=new_col02))+
  geom_density_ridges(aes(fill=new_col01,color=new_col01),
                      alpha=0.4,
                      bandwidth=0.04,
                      quantile_lines=TRUE, 
                      quantile_fun=function(x,...)mean(x),
                      #linetype="dashed",
                      scale=1,
                      vline_linetype="dashed")+
  scale_fill_manual(values = c("graph"="#ca612d",
                               "linear"="#2772a7"))+
  scale_color_manual(values = c("graph"="#ca612d",
                               "linear"="#2772a7"))+
  theme_classic() +
  guides(fill="none",color="none") -> p1
p1

image.png

这里有一个问题是辅助线的位置是在平均值,这里通过一个求平均值的函数实现,如果是任意数值应该怎么做暂时想不到方法

添加文本

代码语言:javascript
复制
new.df %>% 
  group_by(new_col01,new_col02) %>% 
  summarise(mean_value=mean(value)) %>% 
  ungroup() %>% 
  mutate(new_col02 = fct_relevel(new_col02,
                                 c("snps","indels","svs",
                                   "snps_indels","snps_indels_svs"))) %>% 
  mutate(new_col03=as.numeric(new_col02)) -> new.df01

p1+
  scale_y_discrete(labels=c("SNP","Indel","SV","SNP + Indel","SNP + Indel + SV"))
  geom_text(data=new.df01 %>% filter(new_col01=="graph"),
            aes(y=new_col03+0.1,x=mean_value,
                label=round(mean_value,2)),
            hjust=-0.5,color="#ca612d")+
  geom_text(data=new.df01 %>% filter(new_col01=="linear"),
            aes(y=new_col03+0.1,x=mean_value,
                label=round(mean_value,2)),
            hjust=1.5,color="#2772a7")

绘制图例

代码语言:javascript
复制
ggplot(data=new.df,aes(x=value,y=new_col02))+
  geom_density_ridges(aes(fill=new_col01,color=new_col01),
                      alpha=0.4)+
  scale_fill_manual(values = c("graph"="#ca612d",
                               "linear"="#2772a7"),
                    name="",
                    label=c("TGG1.1-332","SL5.0-332"))+
  guides(color="none")-> p2

library(ggpubr)

as_ggplot(get_legend(p2)) -> p3

将图例和图组合到一起

代码语言:javascript
复制
library(latex2exp)

pdf(file = "Rplot13.pdf",
    width=9.4,height = 4)
p1+
    scale_y_discrete(labels=c("SNP","Indel","SV","SNP + Indel",
                              "SNP + Indel + SV"))+ 
  geom_text(data=new.df01 %>% filter(new_col01=="graph"),
            aes(y=new_col03+0.1,x=mean_value,
                label=round(mean_value,2)),
            hjust=-0.5,color="#ca612d")+
    geom_text(data=new.df01 %>% filter(new_col01=="linear"),
              aes(y=new_col03+0.1,x=mean_value,
                  label=round(mean_value,2)),
              hjust=1.5,color="#2772a7")+
  labs(x=TeX(r"(\textit{h}$^2$)"),y="")+
  annotation_custom(grob=ggplotGrob(p3),
                    xmin=-0.35,xmax = -0.35,ymin = 1,ymax = 1)+
    coord_cartesian(clip="on")+
  theme(plot.margin = unit(c(0.1,0.1,0.1,1),'cm'))+
  annotate(geom = "text",
           x=0.8,y=1.5,
           label=TeX(r"(\textit{P} = 1.70 \times 10$^{-217}$)"),
           vjust=-0.5)

dev.off()

image.png

示例数据和代码可以自己到论文中获取

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-07-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小明的数据分析笔记本 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 论文
  • 主要知识点
  • 部分示例数据截图
  • 读取数据
  • 数据转换为长格式
  • 赋予因子水平
  • 基本作图代码
  • 添加文本
  • 绘制图例
  • 将图例和图组合到一起
相关产品与服务
图数据库 KonisGraph
图数据库 KonisGraph(TencentDB for KonisGraph)是一种云端图数据库服务,基于腾讯在海量图数据上的实践经验,提供一站式海量图数据存储、管理、实时查询、计算、可视化分析能力;KonisGraph 支持属性图模型和 TinkerPop Gremlin 查询语言,能够帮助用户快速完成对图数据的建模、查询和可视化分析。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档