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 n
số màu đặc biệt NHẤT trong R? Cảm ơn.
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 n
số màu đặc biệt NHẤT trong R? Cảm ơn.
Câu trả lời:
Tôi tham gia tất cả các bảng màu định tính từ RColorBrewer
gó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))
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)]
pie(rep(1,n), col=sample(color, n))
với 200 màu n = 200
:
pie(rep(1,n), col=sample(color, n))
col
thành tên màu tương ứng không?
col
nghĩa là gì? các color
thiế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 grDevices
nhưng nhiều mã hex hơn)
col=sample(col_vector, n)
từ RColorBrewer
gói trong đoạn mã của bạn. Ví dụ: Cách tìm tên màu #B3E2CD, #E78AC3, #B3DE69
có 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.pal
hàm với tên màu của chúng.
RColorBrewer
bảng màu không bắt nguồn từ grDevices
mà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 RColorBrewer
bảng màu, thậm chí là định tính.
Dưới đây là một vài lựa chọn:
Hãy xem palette
chức năng:
palette(rainbow(6)) # six color rainbow
(palette(gray(seq(0,.9,len = 25)))) #grey scale
Và colorRampPalette
chức năng:
##Move from blue to red in four colours
colorRampPalette(c("blue", "red"))( 4)
Nhìn vào colorBrewer
gó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")
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)))
I want hue
là 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?
i want hue
có 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)
Bạn cũng có thể thử randomcoloR
gó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)
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)
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) ...
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ó viridis
gó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
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:
Bạn có thể sử dụng colorRampPalette
từ cơ sở hoặc RColorBrewer
gó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 RColorBrewer
bạ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 RColorBrewer
gói cho các bảng màu có sẵn khác. Hi vọng điêu nay co ich.
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.
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à
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")
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ử!
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
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.
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.
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 .