Làm thế nào để tạo ra một số màu đặc biệt nhất trong R?


130

Tôi đang vẽ một bộ dữ liệu phân loại và muốn sử dụng các màu đặc biệt để thể hiện các danh mục khác nhau. Cho một số n, làm thế nào tôi có thể có được nsố màu đặc biệt NHẤT trong R? Cảm ơn.



Câu trả lời:


108

Tôi tham gia tất cả các bảng màu định tính từ RColorBrewergói. Bảng màu định tính được cho là cung cấp X màu sắc đặc biệt nhất mỗi màu. Tất nhiên, trộn chúng tham gia vào một bảng màu cũng có màu tương tự, nhưng đó là màu tốt nhất tôi có thể có (74 màu).

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

Giải pháp khác là: lấy tất cả các màu R từ các thiết bị đồ họa và lấy mẫu từ chúng. Tôi loại bỏ các sắc thái của màu xám vì chúng quá giống nhau. Điều này cho 433 màu

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

bộ 20 màu

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

với 200 màu n = 200:

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

bộ 200 màu


Có khả năng chuyển đổi mã hex colthành tên màu tương ứng không?
Prradep

@Prradep colnghĩa là gì? các colorthiết bị đồ họa có tên. Nếu bạn nói chung, không phải tất cả các mã hex đều có tên màu tương ứng (chỉ có 433 màu trong grDevicesnhưng nhiều mã hex hơn)
JelenaČuklina

Tôi đang đề cập đến col=sample(col_vector, n)từ RColorBrewergói trong đoạn mã của bạn. Ví dụ: Cách tìm tên màu #B3E2CD, #E78AC3, #B3DE69có sẵn từ sample(col_vector,3). Ngoài ra, Cách tìm tất cả các mã hex được cung cấp bởi brewer.palhàm với tên màu của chúng.
Prradep

2
@Prradep, vì RColorBrewerbảng màu không bắt nguồn từ grDevicesmàu sắc, có tên được ánh xạ, nhưng chỉ là mã hex, theo hiểu biết của tôi, bạn không thể làm điều này với RColorBrewerbảng màu, thậm chí là định tính.
JelenaČuklina

1
@ytu thì màu sắc không phân biệt được. Nếu thực sự cần thiết, tôi sẽ đề nghị tìm kiếm "tạo độ dốc" trong R và sau đó sử dụng lấy mẫu ngẫu nhiên các màu. Nhưng ánh xạ từ màu sắc đến các yếu tố sẽ không hoạt động, nhận thức của con người có thể xử lý có thể 20 - 40 màu, phần còn lại không khác nhau nhiều.
JelenaČuklina

70

Dưới đây là một vài lựa chọn:

  1. Hãy xem palettechức năng:

     palette(rainbow(6))     # six color rainbow
     (palette(gray(seq(0,.9,len = 25)))) #grey scale
  2. colorRampPalettechức năng:

     ##Move from blue to red in four colours
     colorRampPalette(c("blue", "red"))( 4) 
  3. Nhìn vào colorBrewergói (và trang web ). Nếu bạn muốn phân kỳ màu sắc, sau đó chọn phân kỳ trên trang web. Ví dụ,

     library(colorBrewer)
     brewer.pal(7, "BrBG")
  4. Trang web tôi muốn màu sắc cho rất nhiều bảng màu đẹp. Một lần nữa, chỉ cần chọn bảng màu mà bạn cần. Ví dụ: bạn có thể lấy màu rgb từ trang web và tạo bảng màu của riêng mình:

     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)))

cảm ơn câu trả lời của bạn. Nó tạo ra màu sắc, nhưng một số không đặc biệt với nhau. có lẽ tôi nên nhấn mạnh nhiều hơn về điều đó trong câu hỏi của tôi.
RNA

1
@RNAer Tôi đã cập nhật câu trả lời của tôi. Bạn có thể sử dụng đề xuất 3 và 4 để có được bảng màu phân kỳ .
csgillespie

1
I want huelà một trang web tuyệt vời. Đây chính xác là những gì tôi muốn. Cho một số, làm thế nào để tạo một bảng màu của số lượng màu. Nhưng chúng ta có thể làm điều đó trong R tự động không?
RNA

Thật là tuyệt vời Tuy nhiên, có rất nhiều máy móc đằng sau trang web đó. Tôi không nghĩ việc thực hiện lại sẽ là chuyện nhỏ. Sẽ thật tuyệt nếu i want huecó một API cho phép nó được tự động truy vấn (có thể là như vậy - tôi đã không mất nhiều thời gian để tìm kiếm)
Ben Bolker

8
@BenBolker - Tôi đã thực hiện một ý chính cho một phiên bản R của i want hue, ở đây . Hiệu quả có thể được cải thiện (ví dụ bằng cách lưu các mẫu màu dưới dạng đối tượng dữ liệu), nhưng ý tưởng chung là có. (Tải với devtools::source_gist('45b49da5e260a9fc1cd7'))
jbaums

36

Bạn cũng có thể thử randomcoloRgói :

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

Bạn có thể thấy rằng một tập hợp các màu rất khác biệt được chọn khi hiển thị trong biểu đồ hình tròn (như được đề xuất bởi các câu trả lời khác ở đây):

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

nhập mô tả hình ảnh ở đây

Hiển thị trong biểu đồ hình tròn với 50 màu:

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

nhập mô tả hình ảnh ở đây


3
Cảm ơn. Tôi đã phải sử dụng unname(distinctColorPalette(n))để làm cho công việc này với ggplot. Tôi đoán ggplot cần một vector không tên. col_vector <- unname(distinctColorPalette(n))và sau đó... + scale_color_manual(values=col_vector) ...
Gaurav

19

Không phải là một câu trả lời cho câu hỏi của OP nhưng điều đáng nói là có viridisgói có bảng màu tốt cho dữ liệu tuần tự. Chúng đồng nhất về mặt nhận thức, màu sắc an toàn và thân thiện với máy in.

Để có được bảng màu, chỉ cần cài đặt gói và sử dụng chức năng viridis_pal(). Có bốn tùy chọn "A", "B", "C" và "D" để chọn

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

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

Ngoài ra còn có một bài nói chuyện tuyệt vời giải thích sự phức tạp của các bản đồ màu tốt trên YouTube:

Một Colormap mặc định tốt hơn cho Matplotlib | Khoa học viễn tưởng 2015 | Nathaniel Smith và Stéfan van der Walt


17
Điều này không quá phù hợp với màu sắc đặc biệt.
Christopher John

13

Bạn có thể sử dụng colorRampPalettetừ cơ sở hoặc RColorBrewergói:

Với colorRampPalette, bạn có thể chỉ định màu như sau:

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

Bạn cũng có thể cung cấp mã hex khác:

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

Với RColorBrewerbạn có thể sử dụng màu sắc từ các bảng màu có sẵn:

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

Nhìn vào RColorBrewergói cho các bảng màu có sẵn khác. Hi vọng điêu nay co ich.


1
Cảm ơn. Tôi thích lựa chọn cuối cùng brewer.pal. nhưng nó bị giới hạn tới 9 màu. Tôi thực sự có hơn 9 loại. Các lựa chọn thay thế đầu tiên tạo ra một màu gradient, không đặc biệt như tôi muốn.
RNA

2
bạn sẽ không thể chọn nhiều màu "khác biệt". Bạn có thể nhận được tối đa 12 tôi cho rằng. Bạn nên kiểm tra colorbrewer2.org và lấy màu (có 1 bảng màu 12 nếu tôi đúng).
Arun

Tìm kiếm hơn 12 colout đặc biệt sẽ rất khó khăn - Tôi nghĩ rằng có cuộc thảo luận về điều đó trên trang
colorbrewer

điều đó tốt, miễn là chúng là những màu đặc biệt "nhất" có sẵn, thậm chí chúng đang trở nên ít đặc biệt hơn khi số lượng tăng lên.
RNA

3
Nếu vấn đề của bạn là các màu tương tự cạnh nhau khi được gán cho các danh mục liền kề (như bảng màu cầu vồng sẽ làm), thì bạn có thể chỉ cần ngẫu nhiên hóa đầu ra cầu vồng với một cái gì đó như: cầu vồng (n = 10) [mẫu (10)]
David Roberts

11

Tôi sẽ khuyên bạn nên sử dụng một nguồn bên ngoài cho các bảng màu lớn.

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

có một dịch vụ để soạn bất kỳ kích thước nào của bảng màu theo các thông số khác nhau và

https://gpsondesign.stackexchange.com/questions/3682/where-can-i-find-a-large-palette-set-of-contrasting-colors-for-coloring-many-d/3815

thảo luận về vấn đề chung từ quan điểm của các nhà thiết kế đồ họa và đưa ra rất nhiều ví dụ về các bảng màu có thể sử dụng.

Để bao gồm một bảng màu từ các giá trị RGB, bạn chỉ cần sao chép các giá trị trong một vectơ như trong:

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

Tôi tìm thấy một trang web cung cấp danh sách 20 màu đặc biệt: https://sashat.me/2017/01/11/list-of-20-simple-distotype-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')

Bạn có thể thử!


1
Điều này không thực sự trả lời câu hỏi, đó là về việc tạo ra n các màu đặc biệt, không phải là một tập hợp các màu được xác định. Hãy thử cập nhật câu trả lời của bạn
Michal

1

Bạn có thể tạo một tập hợp các màu như thế này:

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")

Những màu sắc này là khác biệt nhất có thể. Đối với những màu tương tự, chúng tạo thành một gradient để bạn có thể dễ dàng nhận ra sự khác biệt giữa chúng.


0

Theo hiểu biết của tôi, việc tìm kiếm màu sắc đặc biệt có liên quan đến tìm kiếm hiệu quả từ một khối đơn vị, trong đó 3 chiều của khối là ba vectơ dọc theo trục đỏ, lục và lam. Điều này có thể được đơn giản hóa để tìm kiếm trong một hình trụ (tương tự HSV), trong đó bạn sửa Saturation (S) và Value (V) và tìm các giá trị Hue ngẫu nhiên. Nó hoạt động trong nhiều trường hợp, và xem điều này ở đây:

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

Trong 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)
}

Một cách khác, là sử dụng gói R "thống nhất" https://cran.r-project.org/web/packages/uniformly/index.html

và chức năng đơn giản này có thể tạo ra màu sắc đặc biệt:

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])
}

Người ta có thể nghĩ về chức năng liên quan nhiều hơn một chút bằng cách tìm kiếm theo lưới:

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]
} 

kiểm tra chức năng này bằng cách:

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

Tuy nhiên, lưu ý rằng, việc xác định một bảng màu riêng biệt với màu sắc dễ nhận biết của con người là không đơn giản. Phương pháp nào ở trên tạo ra bộ màu đa dạng vẫn chưa được thử nghiệm.


0

Bạn có thể sử dụng gói Polychrom cho mục đích này. Nó chỉ đòi hỏi số lượng màu sắc và một vài seedcolors. Ví dụ:

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

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

Bạn có thể tìm hiểu thêm về gói này tại https://www.jstatsoft.org/article/view/v090c01 .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.