วิธีสร้างสีที่โดดเด่นที่สุดใน R?


130

ฉันกำลังวางแผนชุดข้อมูลเด็ดขาดและต้องการใช้สีที่โดดเด่นเพื่อแสดงประเภทที่แตกต่างกัน รับจำนวนnวิธีการที่ฉันจะได้รับnจำนวนสีที่โดดเด่นที่สุดใน R? ขอบคุณ


1
เกี่ยวข้อง: stackoverflow.com/questions/6075140/…
Ben Bolker

1
เกี่ยวข้อง: stackoverflow.com/questions/9563711/…
Kevin Wright

คำตอบ:


108

ฉันเข้าร่วมจานสีคุณภาพทั้งหมดจากRColorBrewerแพ็คเกจ จานสีคุณภาพควรให้สีที่โดดเด่นที่สุด X แต่ละสี แน่นอนว่าการผสมพวกมันเข้าด้วยกันเป็นหนึ่งเดียวกับสีที่คล้ายกัน แต่นั่นเป็นสิ่งที่ดีที่สุดที่ฉันจะได้รับ (74 สี)

library(RColorBrewer)
n <- 60
qual_col_pals = brewer.pal.info[brewer.pal.info$category == 'qual',]
col_vector = unlist(mapply(brewer.pal, qual_col_pals$maxcolors, rownames(qual_col_pals)))
pie(rep(1,n), col=sample(col_vector, n))

colour_Brewer_qual_60

โซลูชันอื่น ๆ คือนำสี R ทั้งหมดจากอุปกรณ์กราฟิกและตัวอย่างจากสีนั้น ฉันลบเฉดสีเทาเนื่องจากมันคล้ายกันเกินไป สิ่งนี้ให้ 433 สี

color = grDevices::colors()[grep('gr(a|e)y', grDevices::colors(), invert = T)]

ชุด 20 สี

pie(rep(1,n), col=sample(color, n))

มี 200 สีn = 200:

pie(rep(1,n), col=sample(color, n))

ชุด 200 สี


มีความเป็นไปได้ที่จะแปลงรหัสฐานสิบหกcolเป็นชื่อสีที่สอดคล้องกันหรือไม่
Prradep

@ Prradep colคุณหมายถึงอะไร? colorจากอุปกรณ์กราฟิกมีชื่อ หากคุณหมายถึงโดยทั่วไปรหัสฐานสิบหกไม่ใช่ทุกคนที่มีชื่อสีที่ตรงกัน (มีเพียง 433 สีในgrDevicesแต่รหัสฐานสิบหกอื่น ๆ อีกมากมาย)
JelenaČuklina

ฉันกำลังพูดถึงcol=sample(col_vector, n)จากRColorBrewerแพคเกจในข้อมูลโค้ดของคุณ ตัวอย่างเช่นวิธีการหาชื่อสีสำหรับ ใช้ได้จาก#B3E2CD, #E78AC3, #B3DE69 sample(col_vector,3)หรือวิธีการหารหัสฐานสิบหกทั้งหมดที่กำหนดโดยbrewer.palฟังก์ชั่นที่มีชื่อสีของพวกเขา
Prradep

2
@ Prradep เนื่องจากพาเล็ตRColorBrewerไม่ได้มาจากgrDevicesสีที่มีการแมปชื่อ แต่เป็นเพียงรหัสฐานสิบหกสำหรับความรู้ของฉันคุณไม่สามารถทำสิ่งนี้กับพาRColorBrewerเล็ตหรือแม้แต่ในเชิงคุณภาพ
JelenaČuklina

1
@ytu ดังนั้นสีจึงไม่สามารถแยกแยะได้ หากจำเป็นอย่างยิ่งฉันขอแนะนำให้มองหา "การสร้างความลาดชัน" ใน R แล้วใช้การสุ่มตัวอย่างสีแบบสุ่ม แต่การจับคู่จากสีกับปัจจัยจะไม่ได้ผลการรับรู้ของมนุษย์สามารถจัดการได้ 20 - 40 สีส่วนที่เหลือก็ไม่ได้แตกต่างกันมากนัก
JelenaČuklina

70

นี่คือตัวเลือกไม่กี่:

  1. ดูpaletteฟังก์ชั่น:

     palette(rainbow(6))     # six color rainbow
     (palette(gray(seq(0,.9,len = 25)))) #grey scale
  2. และcolorRampPaletteฟังก์ชั่น:

     ##Move from blue to red in four colours
     colorRampPalette(c("blue", "red"))( 4) 
  3. ดูcolorBrewerแพ็คเกจ (และเว็บไซต์ ) หากคุณต้องการเปลี่ยนสีให้เลือกdivergingบนเว็บไซต์ ตัวอย่างเช่น,

     library(colorBrewer)
     brewer.pal(7, "BrBG")
  4. ฉันต้องการสีเว็บไซต์จะช่วยให้จำนวนของจานดี อีกครั้งเพียงเลือกจานสีที่คุณต้องการ ตัวอย่างเช่นคุณสามารถรับสี rgb จากไซต์และสร้างจานสีของคุณเอง:

     palette(c(rgb(170,93,152, maxColorValue=255),
         rgb(103,143,57, maxColorValue=255),
         rgb(196,95,46, maxColorValue=255),
         rgb(79,134,165, maxColorValue=255),
         rgb(205,71,103, maxColorValue=255),
         rgb(203,77,202, maxColorValue=255),
         rgb(115,113,206, maxColorValue=255)))

ขอบคุณสำหรับคำตอบ. มันสร้างสี แต่บางตัวก็ไม่ได้โดดเด่นเหมือนกัน บางทีฉันควรจะเน้นไปที่คำถามนั้น
RNA

1
@RNAer ฉันได้อัปเดตคำตอบแล้ว คุณสามารถใช้ข้อเสนอแนะที่ 3 และ 4 จะได้รับการแยกจาน
csgillespie

1
I want hueเป็นเว็บไซต์ที่ยอดเยี่ยม นี่คือสิ่งที่ฉันต้องการ กำหนดจำนวนวิธีสร้างจานสีจำนวนสี แต่เราสามารถทำได้ใน R โดยอัตโนมัติ?
RNA

มันเจ๋งนะ. อย่างไรก็ตามมีเครื่องจักรจำนวนมากอยู่เบื้องหลังเว็บไซต์นั้น ฉันไม่คิดว่ามันจะเป็นเรื่องไม่สำคัญที่จะนำมาใช้ใหม่ มันจะดีถ้าi want hueมี API ที่อนุญาตให้ทำการสอบถามอัตโนมัติ (อาจเป็น - ฉันใช้เวลาไม่นาน)
Ben Bolker

8
@BenBolker - ผมได้ทำสรุปสาระสำคัญสำหรับรุ่น R ของi want hue, ที่นี่ สามารถปรับปรุงประสิทธิภาพได้ (เช่นการบันทึกตัวอย่างสีเป็นวัตถุข้อมูล) แต่มีแนวคิดทั่วไปอยู่ที่นั่น (โหลดด้วยdevtools::source_gist('45b49da5e260a9fc1cd7'))
jbaums

36

คุณสามารถลองrandomcoloRแพ็คเกจได้ด้วย :

library(randomcoloR)
n <- 20
palette <- distinctColorPalette(n)

คุณจะเห็นว่ามีการเลือกชุดของสีที่แตกต่างกันอย่างมากเมื่อเห็นภาพในแผนภูมิวงกลม (ตามคำแนะนำของคำตอบอื่น ๆ ที่นี่):

pie(rep(1, n), col=palette)

ป้อนคำอธิบายรูปภาพที่นี่

แสดงในแผนภูมิวงกลมที่มี 50 สี:

n <- 50
palette <- distinctColorPalette(n)
pie(rep(1, n), col=palette)

ป้อนคำอธิบายรูปภาพที่นี่


3
ขอบคุณ ฉันต้องใช้unname(distinctColorPalette(n))เพื่อทำงานกับ ggplot นี้ ฉันเดาว่า ggplot ต้องการเวกเตอร์ที่ไม่มีชื่อ col_vector <- unname(distinctColorPalette(n))และจากนั้น... + scale_color_manual(values=col_vector) ...
Gaurav

19

ไม่ใช่คำตอบสำหรับคำถามของ OP แต่มันคุ้มค่าที่จะกล่าวถึงว่ามีviridisแพ็คเกจที่มีจานสีที่ดีสำหรับการเรียงลำดับข้อมูล พวกเขามีความสม่ำเสมอของสีบอดสีปลอดภัยและเป็นมิตรกับเครื่องพิมพ์

viridis_pal()ที่จะได้รับจานเพียงแค่ติดตั้งแพคเกจและการใช้งานฟังก์ชั่น มีสี่ตัวเลือก "A", "B", "C" และ "D" เพื่อเลือก

install.packages("viridis")
library(viridis)
viridis_pal(option = "D")(n)  # n = number of colors seeked

ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่

นอกจากนี้ยังมีการพูดคุยที่ยอดเยี่ยมที่อธิบายถึงความซับซ้อนของ colormaps ที่ดีใน YouTube:

Colormap เริ่มต้นที่ดีกว่าสำหรับ Matplotlib SciPy 2015 | นาธาเนียลสมิ ธ และStéfan van der Walt


17
ไม่เหมาะสำหรับสีที่โดดเด่น
Christopher John

13

คุณสามารถใช้colorRampPaletteจากฐานหรือRColorBrewerแพ็คเกจ:

ด้วยcolorRampPaletteคุณสามารถระบุสีดังต่อไปนี้:

colorRampPalette(c("red", "green"))(5)
# [1] "#FF0000" "#BF3F00" "#7F7F00" "#3FBF00" "#00FF00"

คุณสามารถระบุรหัสฐานสิบหกได้เช่นกัน:

colorRampPalette(c("#3794bf", "#FFFFFF", "#df8640"))(5)
# [1] "#3794BF" "#9BC9DF" "#FFFFFF" "#EFC29F" "#DF8640"
# Note that the mid color is the mid value...

ด้วยRColorBrewerคุณสามารถใช้สีจากจานสีที่มีอยู่แล้ว:

require(RColorBrewer)
brewer.pal(9, "Set1")
# [1] "#E41A1C" "#377EB8" "#4DAF4A" "#984EA3" "#FF7F00" "#FFFF33" "#A65628" "#F781BF"
# [9] "#999999"

ดูRColorBrewerแพ็คเกจสำหรับพาเล็ตอื่น ๆ หวังว่านี่จะช่วยได้


1
ขอบคุณ brewer.palผมชอบตัวเลือกสุดท้าย แต่ จำกัด ได้สูงสุด 9 สี ฉันมีมากกว่า 9 หมวดหมู่ ทางเลือกแรกสร้างสีไล่ระดับสีซึ่งไม่โดดเด่นเท่าที่ฉันต้องการ
RNA

2
คุณจะไม่สามารถเลือกสี "แตกต่าง" มากมาย คุณสามารถรับได้สูงสุด 12 ฉันคิดว่า คุณควรตรวจสอบcolorbrewer2.orgและรับสี (มี 1 12 สีจานสีถ้าฉันถูก)
อรุณ

กำลังมองหา colouts ที่โดดเด่นมากกว่า 12 อันจะเป็นเรื่องยาก - ฉันคิดว่ามีการอภิปรายเกี่ยวกับเรื่องนี้ในหน้า
colorbrewer

ไม่เป็นไรตราบใดที่พวกเขาเป็นสีที่โดดเด่น "มากที่สุด" ที่มีอยู่แม้ว่าพวกเขาจะมีความโดดเด่นน้อยลงเมื่อจำนวนขึ้น
RNA

3
หากปัญหาของคุณมีสีที่คล้ายคลึงกันเมื่อกำหนดให้กับหมวดหมู่ที่อยู่ติดกัน (เนื่องจากจานสีรุ้งจะทำ) จากนั้นคุณสามารถสุ่มเอาท์พุทรุ้งกับสิ่งที่ชอบ: รุ้ง (n = 10) [ตัวอย่าง (10)]
David Roberts

11

ฉันขอแนะนำให้ใช้แหล่งภายนอกสำหรับจานสีขนาดใหญ่

http://tools.medialab.sciences-po.fr/iwanthue/

มีบริการในการเขียนขนาดของจานสีตามพารามิเตอร์ต่างๆและ

/graphicdesign/3682/where-can-i-find-a-large-palette-set-of-contrasting-colors-for-coloring-many-d/3815

กล่าวถึงปัญหาทั่วไปจากมุมมองของนักออกแบบกราฟิกและยกตัวอย่างของจานสีที่ใช้งานได้

ในการประกอบจานสีจากค่า RGB คุณเพียงแค่คัดลอกค่าในเวกเตอร์ดังเช่น:

colors37 = c("#466791","#60bf37","#953ada","#4fbe6c","#ce49d3","#a7b43d","#5a51dc","#d49f36","#552095","#507f2d","#db37aa","#84b67c","#a06fda","#df462a","#5b83db","#c76c2d","#4f49a3","#82702d","#dd6bbb","#334c22","#d83979","#55baad","#dc4555","#62aad3","#8c3025","#417d61","#862977","#bba672","#403367","#da8a6d","#a79cd4","#71482c","#c689d0","#6b2940","#d593a7","#895c8b","#bd5975")

3

ฉันพบเว็บไซต์ที่เสนอรายการสีพิเศษ 20 รายการ: https://sashat.me/2017/01/11/list-of-20-simple-distinct-colors/

col_vector<-c('#e6194b', '#3cb44b', '#ffe119', '#4363d8', '#f58231', '#911eb4', '#46f0f0', '#f032e6', '#bcf60c', '#fabebe', '#008080', '#e6beff', '#9a6324', '#fffac8', '#800000', '#aaffc3', '#808000', '#ffd8b1', '#000075', '#808080', '#ffffff', '#000000')

คุณสามารถลอง!


1
สิ่งนี้ไม่ได้ตอบคำถามซึ่งเกี่ยวกับการสร้างn สีที่แตกต่างไม่ใช่ชุดของสีที่กำหนดไว้ ลองอัปเดตคำตอบของคุณ
Michal

1

คุณสามารถสร้างชุดสีดังนี้:

myCol = c("pink1", "violet", "mediumpurple1", "slateblue1", "purple", "purple3",
          "turquoise2", "skyblue", "steelblue", "blue2", "navyblue",
          "orange", "tomato", "coral2", "palevioletred", "violetred", "red2",
          "springgreen2", "yellowgreen", "palegreen4",
          "wheat2", "tan", "tan2", "tan3", "brown",
          "grey70", "grey50", "grey30")

สีเหล่านี้แตกต่างกันมากที่สุด สำหรับสีที่คล้ายกันเหล่านั้นจะสร้างการไล่ระดับสีเพื่อให้คุณสามารถบอกความแตกต่างระหว่างสีเหล่านั้นได้อย่างง่ายดาย


0

ในความเข้าใจของฉันการค้นหาสีที่โดดเด่นเกี่ยวข้องกับการค้นหาอย่างมีประสิทธิภาพจากหน่วยลูกบาศก์โดยที่สามมิติของลูกบาศก์มีสามเวกเตอร์ตามแกนสีแดงสีเขียวและสีน้ำเงิน สิ่งนี้สามารถทำให้ง่ายขึ้นในการค้นหาในทรงกระบอก (การเปรียบเทียบ HSV) ซึ่งคุณสามารถแก้ไขความอิ่มตัว (S) และค่า (V) และค้นหาค่าฮิวแบบสุ่ม มันทำงานได้ในหลายกรณีและดูที่นี่:

https://martin.ankerl.com/2009/12/09/how-to-create-random-colors-programmatically/

ใน R

get_distinct_hues <- function(ncolor,s=0.5,v=0.95,seed=40) {
  golden_ratio_conjugate <- 0.618033988749895
  set.seed(seed)
  h <- runif(1)
  H <- vector("numeric",ncolor)
  for(i in seq_len(ncolor)) {
    h <- (h + golden_ratio_conjugate) %% 1
    H[i] <- h
  }
  hsv(H,s=s,v=v)
}

อีกทางเลือกหนึ่งคือใช้แพ็คเกจ R "สม่ำเสมอ" https://cran.r-project.org/web/packages/uniformly/index.html

และฟังก์ชั่นที่เรียบง่ายนี้สามารถสร้างสีที่โดดเด่น:

get_random_distinct_colors <- function(ncolor,seed = 100) {
  require(uniformly)
  set.seed(seed)
  rgb_mat <- runif_in_cube(n=ncolor,d=3,O=rep(0.5,3),r=0.5)
  rgb(r=rgb_mat[,1],g=rgb_mat[,2],b=rgb_mat[,3])
}

ใคร ๆ ก็นึกถึงฟังก์ชั่นที่เกี่ยวข้องมากกว่านี้โดยการค้นหากริด:

get_random_grid_colors <- function(ncolor,seed = 100) {
  require(uniformly)
  set.seed(seed)
  ngrid <- ceiling(ncolor^(1/3))
  x <- seq(0,1,length=ngrid+1)[1:ngrid]
  dx <- (x[2] - x[1])/2
  x <- x + dx
  origins <- expand.grid(x,x,x)
  nbox <- nrow(origins) 
  RGB <- vector("numeric",nbox)
  for(i in seq_len(nbox)) {
    rgb <- runif_in_cube(n=1,d=3,O=as.numeric(origins[i,]),r=dx)
    RGB[i] <- rgb(rgb[1,1],rgb[1,2],rgb[1,3])
  }
  index <- sample(seq(1,nbox),ncolor)
  RGB[index]
} 

ตรวจสอบฟังก์ชั่นนี้โดย:

ncolor <- 20
barplot(rep(1,ncolor),col=get_distinct_hues(ncolor))          # approach 1
barplot(rep(1,ncolor),col=get_random_distinct_colors(ncolor)) # approach 2
barplot(rep(1,ncolor),col=get_random_grid_colors(ncolor))     # approach 3

อย่างไรก็ตามโปรดทราบว่าการกำหนดจานสีที่แตกต่างด้วยสีที่มนุษย์สังเกตเห็นนั้นไม่ใช่เรื่องง่าย วิธีใดข้างต้นที่สร้างชุดสีที่หลากหลายนั้นยังไม่ได้ทำการทดสอบ


0

คุณสามารถใช้แพ็คเกจสีเพื่อวัตถุประสงค์นี้ seedcolorsมันก็ต้องใช้จำนวนของสีและไม่กี่ ตัวอย่างเช่น:

# install.packages("Polychrome")
library(Polychrome)

# create your own color palette based on `seedcolors`
P36 = createPalette(36,  c("#ff0000", "#00ff00", "#0000ff"))
swatch(P36)

คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับแพคเกจนี้ที่https://www.jstatsoft.org/article/view/v090c01

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.