[R] 如何快速生成許多差異明顯的顏色?


這個需求真的太常見了!注意問題強調的幾個關鍵詞:一是快速,二是大量,三是差異明顯。在生成大量元素比較圖時要明顯區分不同樣本,比如宏基因組中的物種分析:
image.png

方法一:自定義

自定義顏色:優點是選擇差異明顯的顏色,缺點是費時費力,不知選多少種,眼睛都要挑花。
R的顏色板很多網站都可以查,隨意搜一個貼上:https://www.sojson.com/rgb.html

cb_palette <- c("#ed1299", "#09f9f5", "#246b93", "#cc8e12", "#d561dd", "#c93f00", "#ddd53e",
                "#4aef7b", "#e86502", "#9ed84e", "#39ba30", "#6ad157", "#8249aa", "#99db27", "#e07233", "#ff523f",
                "#ce2523", "#f7aa5d", "#cebb10", "#03827f", "#931635", "#373bbf", "#a1ce4c", "#ef3bb6", "#d66551",
                "#1a918f", "#ff66fc", "#2927c4", "#7149af" ,"#57e559" ,"#8e3af4" ,"#f9a270" ,"#22547f", "#db5e92",
                "#edd05e", "#6f25e8", "#0dbc21", "#280f7a", "#6373ed", "#5b910f" ,"#7b34c1" ,"#0cf29a" ,"#d80fc1",
                "#dd27ce", "#07a301", "#167275", "#391c82", "#2baeb5","#925bea", "#63ff4f")

方法二:RColorBrewer包

利用RColorBrewer包中的面板。

library(RColorBrewer)
display.brewer.all()

查看顏色面板有:
image.png
從中選擇顏色區分差異大的面板,也是需要自己挑選,而且數目相對較少:

brewer.pal(9, "Set1") #只有9個
c(brewer.pal(9, "Set1") ,brewer.pal(9, "Set3") ) #也可結合,但顏色區分不大,數目也還是少
colorRampPalette(c("red", "green"))(5)

rainbow(60) #彩虹色很容易生成,但數目一多很難區分,因為是漸變的。

可以結合這些面板,稍微處理下篩選:

library(RColorBrewer)
qual_col_pals = brewer.pal.info[brewer.pal.info$category == 'qual',]
#處理后有73種差異還比較明顯的顏色,基本夠用
col_vector = unlist(mapply(brewer.pal, qual_col_pals$maxcolors, rownames(qual_col_pals))) 
#看下中間60種顏色的效果
pie(rep(1,n), col=sample(col_vector, 60))

image.png
方法二得到的圖:
image.png

方法三:randomcoloR

綜合來說,這種方法是最合適的吧,也最省代碼。但顏色太多的話,必定是有很多近似的。而且這種方法不能重復得到結果,因為是隨機生成的嘛,即使設置種子也不行。

library(randomcoloR)
palette <- randomColor(count = 60)  #隨機生成60種顏色,其實里面有重復的
palette <- distinctColorPalette(60) #差異明顯的60種

這個問題貌似很難完美解決,畢竟主要的顏色也就那么幾種。以下是第三種方法得到的圖:
image.png

方法四:ggsci組合圖

library(ggsci)
colpalettes<-unique(c(pal_npg("nrc")(10),pal_aaas("default")(10),pal_nejm("default")(8),pal_lancet("lanonc")(9),
                      pal_jama("default")(7),pal_jco("default")(10),pal_ucscgb("default")(26),pal_d3("category10")(10),
                      pal_locuszoom("default")(7),pal_igv("default")(51),
                      pal_uchicago("default")(9),pal_startrek("uniform")(7),
                      pal_tron("legacy")(7),pal_futurama("planetexpress")(12),pal_rickandmorty("schwifty")(12),
                      pal_simpsons("springfield")(16),pal_gsea("default")(12)))

pie(1:219,col = colpalettes)

Ref: https://stackoverflow.com/questions/15282580/how-to-generate-a-number-of-most-distinctive-colors-in-r


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM