审美不够,配色来凑,数量不够,拿啥来凑?

科技   2024-11-14 15:55   广东  
 今天是生信星球陪你的第1020天

   
公众号里的文章大多数需要编程基础,如果因为代码看不懂,而跟不上正文的节奏,可以来找我学习,相当于给自己一个新手保护期。我的课程都是循环开课,点进去咨询微信↓
生信分析直播课程(每月初开一期,春节休一个月)
生信新手保护学习小组(每月两期)
单细胞陪伴学习小组(每月两期)

这个问题分R和python两个部分来讲。

首先是R

配色R包很多,比如ggsci,RcolorBrewer,我最喜欢的当属paletteer,它集百家之长,是大量配色R包的合体。

library(paletteer)
paletteer_d("RColorBrewer::Set1")

除了这个之外的选择可以看

View(palettes_d_names)

颜色数量少就不报错

颜色的数量总是有限的比如这里只有9种颜色,假如你需要10种就会报错啦。

n = 8

dat = data.frame(cas = LETTERS[1:n],
va = rnorm(n))
library(ggplot2)
library(paletteer)
ggplot(dat,aes(cas,va,color = cas))+
geom_point()+
scale_color_paletteer_d("RColorBrewer::Set1")

ggplot(dat,aes(cas,va,color = cas))+
geom_point()+
scale_color_manual(values = paletteer_d("RColorBrewer::Set1"))

颜色数量多了就报错

#只要n>9就报错啦。
n = 20
dat = data.frame(cas = LETTERS[1:n],
va = rnorm(n))
library(ggplot2)
ggplot(dat,aes(cas,va,color = cas))+
geom_point()+
scale_color_paletteer_d("RColorBrewer::Set1")
ggplot(dat,aes(cas,va,color = cas))+
geom_point()+
scale_color_manual(values = paletteer_d("RColorBrewer::Set1"))
## Error in `palette()`:
## ! Insufficient values in manual scale. 20 needed but only 9 provided.

报错信息说的很清楚啦,需要20种颜色,但是只提供了9种。

怎么把9种颜色变成20种颜色呢?

难道只能换个配色风格么。当然不是!

其实热图的帮助文档教我们了:

运行这句代码你会发现他就是把RdYlBu分成了100种。

library(RColorBrewer)
colorRampPalette(rev(brewer.pal(n = 7, name =
"RdYlBu")))(100)
##   [1] "#4575B4" "#4979B6" "#4E7DB8" "#5282BB" "#5786BD" "#5C8BBF" "#608FC2"
## [8] "#6594C4" "#6998C6" "#6E9DC9" "#73A1CB" "#77A6CE" "#7CAAD0" "#80AFD2"
## [15] "#85B3D5" "#8AB8D7" "#8EBCD9" "#93C0DB" "#98C3DD" "#9CC6DF" "#A1CAE1"
## [22] "#A6CDE2" "#ABD0E4" "#B0D3E6" "#B4D6E8" "#B9D9E9" "#BEDCEB" "#C3E0ED"
## [29] "#C8E3EF" "#CCE6F0" "#D1E9F2" "#D6ECF4" "#DBEFF6" "#E0F3F7" "#E1F3F4"
## [36] "#E3F4F1" "#E5F5ED" "#E7F5EA" "#E9F6E6" "#EBF7E3" "#EDF8DF" "#EFF8DC"
## [43] "#F0F9D8" "#F2FAD5" "#F4FBD2" "#F6FBCE" "#F8FCCB" "#FAFDC7" "#FCFDC4"
## [50] "#FEFEC0" "#FEFEBD" "#FEFCBA" "#FEFAB7" "#FEF8B5" "#FEF6B2" "#FEF4AF"
## [57] "#FEF2AC" "#FEF0A9" "#FEEFA6" "#FEEDA3" "#FEEBA1" "#FEE99E" "#FEE79B"
## [64] "#FEE598" "#FEE395" "#FEE192" "#FEDF8F" "#FDDA8C" "#FDD589" "#FDD085"
## [71] "#FDCB82" "#FDC67F" "#FDC17B" "#FDBC78" "#FDB775" "#FCB271" "#FCAD6E"
## [78] "#FCA86B" "#FCA367" "#FC9E64" "#FC9961" "#FC945D" "#FC8F5A" "#FA8A57"
## [85] "#F88454" "#F67E51" "#F4794E" "#F1734B" "#EF6D48" "#ED6845" "#EB6242"
## [92] "#E85D3F" "#E6573C" "#E45139" "#E24C36" "#DF4633" "#DD4030" "#DB3B2D"
## [99] "#D9352A" "#D73027"

如果但看编号,体会不到着100种颜色具体是什么,但Rstudio的脚本编辑器是可以显示背景色的,把上面的结果复制一下就能显示出来啦。

括号里的数值是几就会变成几种颜色啦!这样就不用频繁的改动代码,换风格。

python里面也是有类似的方法。

然后是python

可搞笑了,我画图时,以为get_camp就是拆分颜色用的,结果当细胞亚群数量多的时候,画出来的图居然有重复色!那不就尴尬了吗,不同的细胞亚群应该是不同的颜色才对的!

探索后发现:颜色是

好嘛,我多要几种颜色,你不给我渐变,你给我重复几次啊!什么玩意。

mcolors.LinearSegmentedColormap.from_list

换了一个函数就好啦

import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
import numpy as np
original_colors = plt.cm.Set1(np.linspace(0, 1, 12))
colors = mcolors.LinearSegmentedColormap.from_list('colors', original_colors, N=100)
colors

original_colors = plt.cm.twilight(np.linspace(0, 1, 20))
colors = mcolors.LinearSegmentedColormap.from_list('colors', original_colors, N=10)
colors

N=几就是拆分成几种颜色。

拆完之后图上就没有重复色啦

这些配色风格都是来自matplotlib,除了上面用到的twilight和Set1之外还有很多:

以下来自kimi:

matplotlib中,有多种预定义的颜色映射(colormaps),每种颜色映射包含了一系列的颜色。这些颜色映射可以用于图形的着色、数据的可视化等。以下是一些常用的matplotlib颜色映射:

  1. Perceptually Uniform Colormaps:
  • viridis
  • plasma
  • inferno
  • magma
  • Sequential Colormaps:
    • Greys
    • Blues
    • Greens
    • Oranges
    • Reds
    • Purples
    • Browns
  • Diverging Colormaps:
    • coolwarm
    • bwr
    • seismic
  • Cyclic Colormaps:
    • twilight
    • twilight_shifted
    • hsv
  • Qualitative Colormaps:
    • Set1
    • Set2
    • Set3
    • Accent
    • tab10
    • tab20
    • tab20b
    • tab20c
  • Miscellaneous Colormaps:
    • flag
    • prism
    • ocean
    • gist_earth
    • terrain
    • nipy_spectral
    • gist_ncar
    • cubehelix

    这些颜色映射可以通过matplotlib.cm模块访问。



    生信星球
    一个零基础学生信的平台-- 原创结构化图文/教程,精选阶段性资料,带你少走弯路早入门,收获成就感,早成生信小能手~
     最新文章