Saya merencanakan dataset kategori dan ingin menggunakan warna khusus untuk mewakili kategori yang berbeda. Diberi nomor n
, bagaimana saya bisa mendapatkan n
warna paling PALING dalam R? Terima kasih.
Saya merencanakan dataset kategori dan ingin menggunakan warna khusus untuk mewakili kategori yang berbeda. Diberi nomor n
, bagaimana saya bisa mendapatkan n
warna paling PALING dalam R? Terima kasih.
Jawaban:
Saya bergabung dengan semua palet kualitatif dari RColorBrewer
paket. Palet kualitatif masing-masing memberikan X warna paling khas. Tentu saja, menggabungkan mereka bergabung menjadi satu palet juga warna yang sama, tapi itu yang terbaik yang bisa saya dapatkan (74 warna).
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))
Solusi lain adalah: ambil semua warna R dari perangkat grafis dan sampel dari mereka. Saya menghapus nuansa abu-abu karena terlalu mirip. Ini memberi 433 warna
color = grDevices::colors()[grep('gr(a|e)y', grDevices::colors(), invert = T)]
pie(rep(1,n), col=sample(color, n))
dengan 200 warna n = 200
:
pie(rep(1,n), col=sample(color, n))
col
ke nama warna yang sesuai?
col
Anda maksud? yang color
dari perangkat grafis memiliki nama. Jika maksud Anda secara umum, tidak semua kode heks memiliki nama warna yang sesuai (hanya ada 433 warna grDevices
tetapi ada lebih banyak kode heks)
col=sample(col_vector, n)
dari RColorBrewer
paket dalam potongan kode Anda. Misalnya, Cara menemukan nama warna untuk #B3E2CD, #E78AC3, #B3DE69
tersedia dari sample(col_vector,3)
. Atau, Cara menemukan semua kode hex yang diberikan oleh brewer.pal
fungsi dengan nama warnanya.
RColorBrewer
palet tidak berasal dari grDevices
warna, yang memiliki nama yang dipetakan, tetapi hanya kode hex, setahu saya, Anda tidak dapat melakukan ini dengan RColorBrewer
palet, bahkan yang kualitatif.
Berikut ini beberapa opsi:
Lihatlah palette
fungsinya:
palette(rainbow(6)) # six color rainbow
(palette(gray(seq(0,.9,len = 25)))) #grey scale
Dan colorRampPalette
fungsinya:
##Move from blue to red in four colours
colorRampPalette(c("blue", "red"))( 4)
Lihatlah colorBrewer
paket (dan situs web ). Jika Anda ingin warna yang berbeda, maka pilih diverging di situs. Sebagai contoh,
library(colorBrewer)
brewer.pal(7, "BrBG")
Situs web saya ingin rona memberikan banyak palet bagus. Sekali lagi, cukup pilih palet yang Anda butuhkan. Misalnya, Anda bisa mendapatkan warna rgb dari situs dan membuat palet sendiri:
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
adalah situs web yang luar biasa. Inilah yang saya inginkan. Diberi nomor, cara menghasilkan palet dari jumlah warna. tetapi bisakah kita melakukannya di R secara otomatis?
i want hue
memiliki API yang memungkinkan untuk secara otomatis ditanyai (mungkin memang - saya tidak menghabiskan waktu lama mencari)
Anda juga dapat mencoba randomcoloR
paket :
library(randomcoloR)
n <- 20
palette <- distinctColorPalette(n)
Anda dapat melihat bahwa serangkaian warna yang sangat berbeda dipilih saat memvisualisasikan dalam diagram lingkaran (seperti yang disarankan oleh jawaban lain di sini):
pie(rep(1, n), col=palette)
Ditampilkan dalam diagram lingkaran dengan 50 warna:
n <- 50
palette <- distinctColorPalette(n)
pie(rep(1, n), col=palette)
unname(distinctColorPalette(n))
untuk membuat ini berfungsi dengan ggplot. Saya kira ggplot membutuhkan vektor yang tidak disebutkan namanya. col_vector <- unname(distinctColorPalette(n))
dan kemudian... + scale_color_manual(values=col_vector) ...
Bukan jawaban untuk pertanyaan OP tetapi perlu disebutkan bahwa ada viridis
paket yang memiliki palet warna yang bagus untuk data sekuensial. Mereka secara seragam seragam, buta warna dan ramah printer.
Untuk mendapatkan palet, cukup instal paket dan gunakan fungsi viridis_pal()
. Ada empat opsi "A", "B", "C" dan "D" untuk dipilih
install.packages("viridis")
library(viridis)
viridis_pal(option = "D")(n) # n = number of colors seeked
Ada juga pembicaraan luar biasa yang menjelaskan kompleksitas colormaps yang baik di YouTube:
Anda dapat menggunakan colorRampPalette
dari pangkalan atau RColorBrewer
paket:
Dengan colorRampPalette
, Anda dapat menentukan warna sebagai berikut:
colorRampPalette(c("red", "green"))(5)
# [1] "#FF0000" "#BF3F00" "#7F7F00" "#3FBF00" "#00FF00"
Anda juga dapat memberikan kode hex juga:
colorRampPalette(c("#3794bf", "#FFFFFF", "#df8640"))(5)
# [1] "#3794BF" "#9BC9DF" "#FFFFFF" "#EFC29F" "#DF8640"
# Note that the mid color is the mid value...
Dengan RColorBrewer
Anda dapat menggunakan warna dari palet yang sudah ada:
require(RColorBrewer)
brewer.pal(9, "Set1")
# [1] "#E41A1C" "#377EB8" "#4DAF4A" "#984EA3" "#FF7F00" "#FFFF33" "#A65628" "#F781BF"
# [9] "#999999"
Lihatlah RColorBrewer
paket untuk palet lain yang tersedia. Semoga ini membantu.
brewer.pal
. tetapi terbatas hingga 9 warna. Saya sebenarnya memiliki lebih dari 9 kategori. Alternatif pertama menghasilkan warna gradien, yang tidak berbeda seperti yang saya inginkan.
Saya akan merekomendasikan untuk menggunakan sumber eksternal untuk palet warna besar.
http://tools.medialab.sciences-po.fr/iwanthue/
memiliki layanan untuk menyusun berbagai ukuran palet sesuai dengan berbagai parameter dan
membahas masalah umum dari perspektif desainer grafis dan memberikan banyak contoh palet yang dapat digunakan.
Untuk menyusun palet dari nilai RGB Anda hanya perlu menyalin nilai dalam vektor seperti misalnya:
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")
Saya menemukan situs web yang menawarkan daftar 20 warna berbeda: 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')
Anda bisa mencoba!
n
warna yang berbeda, bukan satu set warna yang ditentukan. Coba perbarui jawaban Anda
Anda dapat menghasilkan serangkaian warna seperti ini:
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")
Warna-warna ini sejelas mungkin. Untuk warna-warna yang serupa, mereka membentuk gradien sehingga Anda dapat dengan mudah membedakannya.
Dalam pemahaman saya, mencari warna khusus terkait dengan pencarian efisien dari unit cube, di mana 3 dimensi dari kubus adalah tiga vektor sepanjang sumbu merah, hijau dan biru. Ini dapat disederhanakan untuk mencari dalam silinder (analogi HSV), di mana Anda memperbaiki Saturasi (S) dan Nilai (V) dan menemukan nilai Hue acak. Ini berfungsi dalam banyak kasus, dan lihat ini di sini:
https://martin.ankerl.com/2009/12/09/how-to-create-random-colors-programmatically/
Dalam 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)
}
Cara alternatif, adalah dengan menggunakan paket R "seragam" https://cran.r-project.org/web/packages/uniformly/index.html
dan fungsi sederhana ini dapat menghasilkan warna yang berbeda:
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])
}
Seseorang dapat memikirkan sedikit lebih banyak fungsi yang terlibat dengan pencarian-grid:
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]
}
periksa fungsi ini dengan:
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
Namun, perhatikan bahwa, mendefinisikan palet yang berbeda dengan warna yang dapat dilihat manusia tidaklah sederhana. Manakah dari pendekatan di atas menghasilkan set warna yang beragam belum diuji.
Anda dapat menggunakan paket Polikrom untuk tujuan ini. Itu hanya membutuhkan jumlah warna dan beberapa seedcolors
. Sebagai contoh:
# install.packages("Polychrome")
library(Polychrome)
# create your own color palette based on `seedcolors`
P36 = createPalette(36, c("#ff0000", "#00ff00", "#0000ff"))
swatch(P36)
Anda dapat mempelajari lebih lanjut tentang paket ini di https://www.jstatsoft.org/article/view/v090c01 .