Я будую категоричний набір даних і хочу використовувати відмінні кольори для представлення різних категорій. З огляду на число n
, як я можу отримати n
кількість МОСТО відмітних кольорів у R? Дякую.
Я будую категоричний набір даних і хочу використовувати відмінні кольори для представлення різних категорій. З огляду на число n
, як я можу отримати n
кількість МОСТО відмітних кольорів у R? Дякую.
Відповіді:
Я приєднався до всіх якісних палітри з 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))
Іншим рішенням є: візьміть усі кольори R з графічних пристроїв і зразок з них. Я зняла відтінки сірого, оскільки вони занадто схожі. Це дає 433 кольори
color = grDevices::colors()[grep('gr(a|e)y', grDevices::colors(), invert = T)]
pie(rep(1,n), col=sample(color, n))
з 200 кольорами n = 200
:
pie(rep(1,n), col=sample(color, n))
col
відповідні назви кольорів?
col
ти маєш на увазі? color
від графічних пристроїв має назву. Якщо ви маєте на увазі загалом, не всі шістнадцяткові коди мають відповідні назви кольорів (є лише 433 кольори, grDevices
але ще багато шістнадцяткових кодів)
col=sample(col_vector, n)
відRColorBrewer
пакету в вашому фрагменті коду. Наприклад, як знайти назви кольорів, #B3E2CD, #E78AC3, #B3DE69
доступних для sample(col_vector,3)
. Як варіант, як знайти всі шістнадцяткові коди, задані brewer.pal
функцією, з їх назвами кольорів.
RColorBrewer
палітри не походять від grDevices
кольорів, які мають назви, нанесені на карту, але це лише шістнадцяткові коди , наскільки мені відомо, ви не можете це зробити з RColorBrewer
палітрами, навіть якісними.
Ось кілька варіантів:
Погляньте на palette
функцію:
palette(rainbow(6)) # six color rainbow
(palette(gray(seq(0,.9,len = 25)))) #grey scale
І colorRampPalette
функція:
##Move from blue to red in four colours
colorRampPalette(c("blue", "red"))( 4)
Подивись на colorBrewer
пакет (та веб-сайт ). Якщо ви хочете, щоб розбігалися кольори, виберіть розходяться на сайті. Наприклад,
library(colorBrewer)
brewer.pal(7, "BrBG")
Я хочу , щоб відтінок веб - сайт дає багато хороших палітр. Знову ж таки, просто виберіть потрібну вам палітру. Наприклад, ви можете отримати кольори 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)))
I want hue
це приголомшливий веб-сайт. Це саме те, що я хочу. Дано число, як генерувати палітру кількості кольорів. але чи можемо ми зробити це в R автоматично?
i want hue
API, який дозволив йому автоматично запитуватись (можливо, це так - я не витрачав довго на пошуки)
Ви також можете спробувати 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)
unname(distinctColorPalette(n))
щоб зробити цю роботу з ggplot. Я думаю, що ggplot потребує безіменного вектора. col_vector <- unname(distinctColorPalette(n))
а потім... + scale_color_manual(values=col_vector) ...
Не відповідь на питання ОП, але варто зазначити, що є viridis
пакет, який має гарні кольорові палітри для послідовних даних. Вони сприймаються рівномірно, безпечно для кольорів і друкують.
Щоб отримати палітру, просто встановіть пакет і скористайтеся функцією viridis_pal()
. Можна вибрати чотири варіанти "A", "B", "C" і "D"
install.packages("viridis")
library(viridis)
viridis_pal(option = "D")(n) # n = number of colors seeked
Також є чудова розмова, що пояснює складність хороших кольорових карт на YouTube:
Ви можете використовувати 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
упаковку для інших доступних палітри. Сподіваюся, це допомагає.
brewer.pal
. але він обмежений до 9 кольорів. У мене насправді більше 9 категорій. Перші альтернативи генерують кольори градієнта, що не настільки виразно, як я хочу.
Я б рекомендував використовувати зовнішнє джерело для великих кольорових палітр.
http://tools.medialab.sciences-po.fr/iwanthue/
має сервіс для складання будь-якого розміру палітри відповідно до різних параметрів і
обговорює загальну проблему з точки зору графічних дизайнерів та наводить безліч прикладів корисної палітри.
Щоб скласти палітру зі значень 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")
Я знайшов веб-сайт, що пропонує список 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')
Ви можете спробувати!
n
відмінних кольорів, а не набору визначених кольорів. Спробуйте оновити свою відповідь
Ви можете створити такий набір кольорів:
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")
Ці кольори максимально виразні. Для таких схожих кольорів вони утворюють градієнт, щоб ви могли легко визначити відмінності між ними.
На мій погляд, пошук відмінних кольорів пов'язаний з ефективним пошуком з одиничного куба, де 3 розміри куба - це три вектори вздовж червоної, зеленої та синьої осей. Це можна спростити для пошуку в циліндрі (аналогія HSV), де ви фіксуєте насиченість (S) і значення (V) і знаходите випадкові значення відтінку. Він працює у багатьох випадках, і переконатися в цьому можна тут:
https://martin.ankerl.com/2009/12/09/how-to-create-random-colors-programmatic/
В 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
Однак зауважте, що визначити чітку палітру із сприйнятливими для людини кольорами не просто. Який із вищезазначених підходів генерує різноманітний набір кольорів, ще належить перевірити.
Для цієї мети можна використовувати пакет поліхрому . Просто потрібно кількість кольорів і кілька 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 .