Bagaimana cara menghasilkan sejumlah warna paling khas dalam R?

Jawaban:

108

Saya bergabung dengan semua palet kualitatif dari RColorBrewerpaket. 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))

colour_Brewer_qual_60

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

set 20 warna

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

dengan 200 warna n = 200:

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

set 200 warna

JelenaČuklina
sumber
Apakah ada kemungkinan untuk mengkonversi kode hex colke nama warna yang sesuai?
Prradep
@ Prapep yang colAnda maksud? yang colordari perangkat grafis memiliki nama. Jika maksud Anda secara umum, tidak semua kode heks memiliki nama warna yang sesuai (hanya ada 433 warna grDevicestetapi ada lebih banyak kode heks)
JelenaČuklina
Saya menyebutkan tentang col=sample(col_vector, n)dari RColorBrewerpaket dalam potongan kode Anda. Misalnya, Cara menemukan nama warna untuk #B3E2CD, #E78AC3, #B3DE69tersedia dari sample(col_vector,3). Atau, Cara menemukan semua kode hex yang diberikan oleh brewer.palfungsi dengan nama warnanya.
Prradep
2
@ Prradep, karena RColorBrewerpalet tidak berasal dari grDeviceswarna, yang memiliki nama yang dipetakan, tetapi hanya kode hex, setahu saya, Anda tidak dapat melakukan ini dengan RColorBrewerpalet, bahkan yang kualitatif.
JelenaČuklina
1
@ytu maka warnanya tidak bisa dibedakan. Jika benar-benar diperlukan, saya akan menyarankan mencari "pembuatan gradien" di R dan kemudian menggunakan pengambilan sampel warna secara acak. Tetapi pemetaan dari warna ke faktor tidak akan berhasil, persepsi manusia dapat menangani mungkin 20 - 40 warna, sisanya tidak jauh berbeda.
JelenaČuklina
70

Berikut ini beberapa opsi:

  1. Lihatlah palettefungsinya:

     palette(rainbow(6))     # six color rainbow
     (palette(gray(seq(0,.9,len = 25)))) #grey scale
  2. Dan colorRampPalettefungsinya:

     ##Move from blue to red in four colours
     colorRampPalette(c("blue", "red"))( 4) 
  3. Lihatlah colorBrewerpaket (dan situs web ). Jika Anda ingin warna yang berbeda, maka pilih diverging di situs. Sebagai contoh,

     library(colorBrewer)
     brewer.pal(7, "BrBG")
  4. 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)))
csgillespie
sumber
Terima kasih atas jawaban anda. Ini menghasilkan warna, tetapi beberapa tidak terlalu berbeda satu sama lain. mungkin saya seharusnya lebih menekankan hal itu dalam pertanyaan saya.
RNA
1
@RNAer Saya sudah memperbarui jawaban saya. Anda dapat menggunakan saran 3 dan 4 untuk mendapatkan palet yang berbeda .
csgillespie
1
I want hueadalah 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?
RNA
Itu luar biasa. Namun, ada banyak mesin di balik situs web itu. Saya tidak berpikir itu akan sepele untuk diterapkan kembali. Alangkah baiknya jika i want huememiliki API yang memungkinkan untuk secara otomatis ditanyai (mungkin memang - saya tidak menghabiskan waktu lama mencari)
Ben Bolker
8
@ BenBolker - Saya sudah membuat intisari untuk versi R i want hue, di sini . Efisiensi dapat ditingkatkan (misalnya dengan menyimpan sampel warna sebagai objek data), tetapi gagasan umum ada di sana. (Muat dengan devtools::source_gist('45b49da5e260a9fc1cd7'))
jbaums
36

Anda juga dapat mencoba randomcoloRpaket :

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)

masukkan deskripsi gambar di sini

Ditampilkan dalam diagram lingkaran dengan 50 warna:

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

masukkan deskripsi gambar di sini

Megatron
sumber
3
Terima kasih. Saya harus menggunakan 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) ...
Gaurav
19

Bukan jawaban untuk pertanyaan OP tetapi perlu disebutkan bahwa ada viridispaket 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

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

Ada juga pembicaraan luar biasa yang menjelaskan kompleksitas colormaps yang baik di YouTube:

Colormap Default yang Lebih Baik untuk Matplotlib | SciPy 2015 | Nathaniel Smith dan Stéfan van der Walt

Gordon Schücker
sumber
17
Ini tidak begitu cocok untuk warna-warna khas.
Christopher John
13

Anda dapat menggunakan colorRampPalettedari pangkalan atau RColorBrewerpaket:

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 RColorBrewerAnda 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 RColorBrewerpaket untuk palet lain yang tersedia. Semoga ini membantu.

Arun
sumber
1
Terima kasih. Saya suka opsi terakhir 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.
RNA
2
Anda tidak akan dapat memilih banyak warna "berbeda". Anda bisa mendapatkan maksimal 12 kurasa. Anda harus memeriksa colorbrewer2.org dan mendapatkan warnanya (ada 12 palet warna jika saya benar).
Arun
Mencari lebih dari 12 warna unik akan sulit - saya pikir ada diskusi tentang hal itu di halaman
colorbrewer
tidak apa-apa, selama mereka adalah warna "paling" khas yang tersedia, bahkan mereka menjadi kurang khas ketika jumlahnya naik.
RNA
3
Jika masalah Anda adalah warna yang mirip berdampingan ketika ditugaskan ke kategori yang berdekatan (seperti yang dilakukan palet pelangi), maka Anda bisa mengacak keluaran pelangi dengan sesuatu seperti: pelangi (n = 10) [sampel (10)]
David Roberts
11

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

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

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")
Roma
sumber
3

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!

Minstein
sumber
1
Ini tidak benar-benar menjawab pertanyaan, yaitu tentang menghasilkan n warna yang berbeda, bukan satu set warna yang ditentukan. Coba perbarui jawaban Anda
Michal
1

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.

Phoenix Mu
sumber
0

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.

hanya
sumber
0

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 .

Jot eN
sumber