如何用对应于相对丰度图的颜色标签制作复合图例?

如何解决如何用对应于相对丰度图的颜色标签制作复合图例?

我想复制以下paper中的图形。

Fig.1c

它被卡在分隔X1列上。我想使用正则表达式,但不知道如何使用。 我有一个计划,用下划线分隔符分隔每个单词(我有一个列表),然后分别将[-tes&-ria]和[-ceae]后缀单词提取到Phylum和Family中。在那之后,家庭之后的话应该被归为属。为了准确起见,可能会将“未分类”和少于5个字符的单词的条件分组到前面的单词。

还有,是否可以在每个家族中添加与相对丰度图相对应的小颜色标签?

library(tidyverse)
james <- read_csv("tableS2a.csv")
james <- james %>% mutate(
    Cecum = rowSums(select(james,contains("Caecum"))),Transverse = rowSums(select(james,contains("Transv"))),Sigmoid = rowSums(select(james,contains("Sigmoi")))
  )
james2 <- james %>% 
  select(X1,Cecum,Transverse,Sigmoid) 

james.tab <- james2 %>%
  mutate(meanAbundance = 
           rowMeans(
             column_to_rownames(james2,var = "X1")
             )
         ) %>%
  arrange(desc(meanAbundance)) %>%
  top_n(30,meanAbundance) # extract top30

write.csv2(james.tab,"jamestab.csv")

james.tab2 <- 
  as.data.frame(
    apply(
      select(
        james.tab,Sigmoid),2,function(x) x / sum(x) * 100)
    )

james.tab3 <-
  bind_cols(
    as.data.frame(
      select(james.tab,X1)),as.data.frame(james.tab2)
    )

james.X1 <- select(james.tab3,X1)

# Separate X1 to Phylum(-tes/-ria),Family (-ceae),and genus
james.list <- strsplit(pull(james.X1,X1),"_")
james.class <-
  if_else(grepl("(ceae)",james.X1) == T,mutate(james.X1,Family =
                   grep(
                     "[[:alpha:]]ceae(_)",strsplit(pull(james.X1,"_"),value = T
                   )))

我是R的新手,上面的代码大部分是我以前的工作中粘贴的。如果代码效率低下,请原谅我。数据集:Original table-> Top30 csv (pastebin)

APPEND

这是最近的结果 我没有成功实现ggtext包,可能是主题地址错误?

library(tidyverse)
library(patchwork)
library(ggtext)
library(glue)

james <- read_csv("tableS2a.csv")
james2 <- james %>% 
  mutate(
  Cecum = rowSums(select(james,contains("Sigmoi")))
  ) %>% 
  select(X1,Sigmoid) %>% 
  filter(grepl("(ceae)",james$X1)) # Filter rows with -ceae suffix only

# extract family value with selecting -ceae/les suffix word
family.naming0 <-
  regmatches(james2$X1,regexpr("(?<=_)(.*?(ceae|les)(?=_))",james2$X1,perl = T))
#in between "_" to fail-safe double -ceae. E.g. Bacteria_Bacteriaceae_Aceae

family.naming1 <-
  regmatches(james2$X1,regexpr("(?<=ceae_|les_)\\d",perl = T))

family.naming2 <- 
  regmatches(james2$X1,regexpr("(?<=ceae_|les_)unclassified",perl = T))

family.naming3 <-
  ifelse(
    grepl("(?<=[(ceae_)|(les_)])\\d",perl = T),paste0(family.naming0," ",family.naming1),ifelse(
      grepl("(?<=[(ceae_)|(les_)])unclassified",family.naming2),paste0(family.naming0)
    ))  

james3 <- james2 %>% 
  gather("Cecum","Transverse","Sigmoid",key = "location",value = "abundance") %>% 
  mutate(relativeAbundance=abundance/sum(abundance) * 100) %>%
  mutate(phylum=gsub("(_.*)","",X1)) %>% # extract phylum value with selecting first word
  mutate(family=
           ifelse(
             grepl("(?<=[(ceae_)|(les_)])\\d",X1,ifelse(
               grepl("(?<=[(ceae_)|(les_)])unclassified",paste0(family.naming0)
             ))) %>% 
  mutate(genus=gsub("_",sub("(.*ceae)+?_((unclassified|\\d)*(_)*)",X1)))

# change it into percentage
james4 <-
  bind_cols(select(james2,as.data.frame(
    apply(
      select(
        james2,function(x) x / sum(x) * 100)))

jamesReg <- james4 %>% 
  mutate(james4,meanAbundance=rowMeans(select(james4,Sigmoid))) %>% 
  arrange(desc(meanAbundance)) %>% 
  top_n(30,meanAbundance) %>% 
  pull(X1)

# collect top 30 from james4X reference
james5 <- james3 %>% 
  filter(X1 %in% jamesReg)

# change order
james5$location_f <- 
  factor(james5$location,labels = c("Cecum","Sigmoid"))

james6 <- 
  select(james5,location_f,relativeAbundance,genus)

# First plot
james.plot <-
  ggplot(james6,aes(x = location_f,y = relativeAbundance,fill = genus)) +
  geom_bar(position = "fill",stat = "identity",show.legend = F) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1)) + # y axis percentage
  #theme_minimal() +
  theme(axis.title.x = element_blank(),panel.background = element_blank()) +
  ylab("Relative abundances (%)") +
  scale_fill_hue(l=60,c=80)


james.table <- data.frame("relativeAbundance"=james5$relativeAbundance[1:30]+
                            james5$relativeAbundance[31:60]+
                            james5$relativeAbundance[61:90],"phylum"=james5$phylum[1:30],"family"=james5$family[1:30],"genus"=james5$genus[1:30])

# get colour pattern 
ggplotColours <- function(n = 6,h = c(0,360) + 15) {
  if ((diff(h) %% 360) < 1)
    h[2] <- h[2] - 360 / n
  hcl(h = (seq(h[1],h[2],length = n)),c = 100,l = 65)
}

family <- pull(select(james.table,family))
genus <- pull(select(james.table,genus))
james.table2 <- james.table %>% 
  mutate(color=ggplotColours(nrow(james.table))) %>% # just in case 
  mutate(asv=glue("{family}: <i>{genus}</i>"))

# color for long vertical tile (phylum tile)
james.phyl.col <- c("#fddb47","#58b9b2","#6585c3","#e25a4b")

# legend making or second plot
james.legend <- 
  ggplot(james.table2,aes(y = asv)) +
  geom_tile(aes(x = 1,fill = asv),width = 0.9,height = 0.9) +
  geom_tile(aes(x = 0.2),fill = james.phyl.col[as.numeric(as.factor(james.table2$phylum))],width = 0.4) +
  scale_y_discrete(position = "right",expand = c(0,0),name = "") +
  scale_x_continuous(expand = c(0,breaks = NULL,name = "") +
  scale_fill_discrete(guide = "none") +
  facet_grid(phylum ~ .,scales = "free_y",space = "free_y",switch = "y") +
  theme(axis.ticks = element_blank(),strip.background = element_blank(),aspect.ratio = 1,axis.text.y = element_markdown())

# patchwork
james.plot + james.legend

最终图片final

解决方法

这是一个示例,说明如何开始将图例制作为单独的图,以后可以将其拼凑到主图旁边。

基本上,您要为每个项目制作图块,然后按组对其进行分面。使刻面与刻面的比例完全为1:1有点棘手,因此您必须使用width = ...height = ...来使其看起来正确。

library(ggplot2)

# Example of item-group relations
df <- data.frame(
  group = c("Actinobacteria","Actinobacteria","Bacteroidetes","Firmicutes","Firmicutes"),item = c("Bifidobacteriaceae","Coriobacteriaceae","Bacteroidaceae","Porphyromonadacea","Acidaminococcacaea","Clostridiacea","Clostridiales")
)

group_colours <- c("blue","green","red")

ggplot(df,aes(y = item)) +
  geom_tile(aes(x = 1,fill = item),width = 0.9,height = 0.9) +
  geom_tile(aes(x = 0.2),fill = group_colours[as.numeric(as.factor(df$group))],width = 0.4) +
  scale_y_discrete(position = "right",expand = c(0,0),name = "") +
  scale_x_continuous(expand = c(0,breaks = NULL,name = "") +
  scale_fill_discrete(guide = "none") +
  facet_grid(group ~ .,scales = "free_y",space = "free_y",switch = "y") +
  theme(axis.ticks = element_blank(),strip.background = element_blank(),aspect.ratio = 1)

reprex package(v0.3.0)于2020-08-18创建

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-