bioinfoer

找回密码
立即注册
搜索
热搜: 活动 交友 discuz
发新帖

0

收听

12

听众

373

主题
发表于 2025-4-9 18:05:03 | 查看: 76| 回复: 1

背景

虽然有那么多调色板:

https://www.nceas.ucsb.edu/~frazier/RSpatialGuides/colorPaletteCheatsheet.pdf

还有那么多配色方案:

https://cran.r-project.org/web/packages/ggsci/vignettes/ggsci.html

当我为paper结果图选颜色时,还是会对自己的审美不自信。

那就模仿你(或者你老板)心仪的文章的配色方案吧!

应用场景

本套代码要做的就是从你心仪的文章里提取它的配色方案。

如果你需要大量的颜色,那就选一篇颜色丰富的文章。

颜色提取

用到 rPlotter包,先安装它

install.packages(c("ggplot2", "stringr", "reshape2", "dichromat"))

source("http://bioconductor.org/biocLite.R")
biocLite("EBImage")

library(devtools)
install_github("ramnathv/rblocks")
install_github("woobe/rPlotter")

此处以PMID: 28726821这篇文章为例,提取正文Figure的颜色

同一篇文章里的图通常会使用同一套配色方案,这样全文看起来才协调。

因此,通常挑选其中最具代表性的1个Figure提取颜色就够了,例文的Figure 2最为典型。

提取Figure 2的颜色

library(rPlotter)

#其中`num_col =`参数默认值是5,此处设置为30,提取30种颜色
# mycol<-extract_colours("https://media.nature.com/lw926/nature-assets/nature/journal/v547/n7663/images/nature22973-f2.jpg",num_col = 30)
# 链接访问404了,直接读取本地文件如下
mycol<-extract_colours("nature22973-f2.jpg",num_col = 30)
mycol

#展示颜色
library("scales")
show_col(mycol)

#保存颜色和代码到PDF文件,制作配色卡
pdf("Fig2.pdf")
show_col(mycol)
dev.off()

#保存颜色代码到文本文件
write.table(mycol,"Fig2.txt",row.names = F,col.names = F)

show_col(mycol)如下:

提取 Figure 2 - 6的颜色

如果你不满足于一个图的颜色,还可以一步提取全文所有图的颜色。

Paper里的Figure地址都是有规律可循的,拿到一个Figure的地址,就能推测出其他Figure的地址。

找到地址的规律,就可以用 for循环提取所有Figure的颜色。

#library(rPlotter)
allcol<-list()
for (i in 1:6){
  #fig<-paste0("https://media.nature.com/lw926/nature-assets/nature/journal/v547/n7663/images/nature22973-f",i,".jpg")
  #如果网速慢,或者没有在线打开的权限,就提前把图片保存在当前目录
  #从当前目录读取图片文件
  fig<-paste0("nature22973-f",i,".jpg") 
  allcol<-append(allcol,extract_colours(fig, num_col = 30))
}

#去除重复出现的颜色
allcol<-base::unique(unlist(allcol))  

#颜色排序
allcol<-allcol[order(allcol)]

#展示颜色
library("scales")
show_col(allcol)


颜色多了,用一维展示看起来乱,用三维展示

#转换为RGB
allcol_rgb<-data.frame(t(col2rgb(allcol)))
allcol_rgb$col<-allcol

#install.packages("rgl")
library(rgl)
plot3d(allcol_rgb$red,allcol_rgb$green,allcol_rgb$blue,
        xlab = "red",ylab = "green",zlab = "blue",
        col = allcol_rgb$col,
        size = 10,
        lit = F)

#保存颜色
write.table(allcol,"allcol.txt",row.names = F,col.names = F)

增减颜色

  • 增加过渡色。为了产生同一色系,让画图效果更协调,有时会在几种颜色中间添加过渡色。
#例如,想用mycol的前4个颜色:
show_col(mycol[1:4])

#需要扩展成8种颜色
mycol_plus<-colorRampPalette(mycol[1:4],alpha=TRUE)(8)
show_col(mycol_plus)

#保存颜色
write.table(mycol_plus,"Fig2_plus.txt",row.names = F,col.names = F)

mycol_plus如下:

  • 缩减颜色。如果只想要其中一部分颜色,可以手动编辑"allcol.txt"文件,还可以用上面的方法抽取部分颜色。
#例如,allcol颜色太多,只抽取50个颜色
allcol_minus<-colorRampPalette(allcol,alpha=TRUE)(50)
show_col(allcol_minus)

#保存颜色
write.table(allcol_minus,"allcol_minus.txt",row.names = F,col.names = F)

allcol_minus如下:

颜色的用法

上面获得的 mycol就可以用到其他的画图代码中

用法一

替换代码中的自定义颜色,例如画图代码中找到 mycol<-那一行,或者是 colpal<-,或者是 bgcol<-。用下面这三行替换它:

mycol<-read.table("Fig2.txt")#此处使用Figure 2的颜色
mycol<-as.character(mycol$V1)
#mycol

用法二

定义单个颜色,例如在画图代码中找到类似下面这样的语句:

palette = c("red","blue")
colours = c("#2381B3","#F0E366")

用你喜欢的颜色代码替换括号里的颜色代码。

用法三

有几套代码的颜色写在输入文件中,修改输入文件中的颜色,例如染色体图的文件。

打开输入文件,找到颜色列,用你喜欢的颜色代码替换原来的颜色,注意去掉 #符号

收藏回复 显示全部楼层 道具 举报

发表于 2025-4-9 18:06:33

文中所用数据可以关注公众号“生信喵实验柴”
1.png
发送关键词“20250409”获取

回复 显示全部楼层 道具 举报

您需要登录后才可以回帖 登录 | 立即注册

QQ|Archiver|手机版|小黑屋|bioinfoer ( 萌ICP备20244422号 )

GMT+8, 2025-5-10 18:38 , Processed in 0.089862 second(s), 33 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表