आर में सबसे विशिष्ट रंगों की संख्या कैसे उत्पन्न करें?


130

मैं एक श्रेणीबद्ध डेटासेट की साजिश रच रहा हूं और विभिन्न श्रेणियों का प्रतिनिधित्व करने के लिए विशिष्ट रंगों का उपयोग करना चाहता हूं। एक संख्या को देखते हुए n, मैं nआर में कितने विशिष्ट रंगों की संख्या प्राप्त कर सकता हूं ? धन्यवाद।



जवाबों:


108

मैं 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))

colour_Brewer_qual_60

अन्य समाधान यह है: ग्राफिकल उपकरणों से सभी आर रंग लें और उनसे नमूना लें। मैंने धूसर रंगों को हटा दिया क्योंकि वे बहुत समान हैं। इससे 433 रंग मिलते हैं

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

20 रंगों का सेट

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

200 रंगों के साथ n = 200:

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

200 रंगों का सेट


क्या हेक्स कोड colको संबंधित रंग नामों में परिवर्तित करने की संभावना है ?
प्रदीप

@ प्रदीप colआपका मतलब क्या है? colorचित्रमय उपकरणों से नाम हैं। यदि आप सामान्य रूप से मतलब रखते हैं, तो सभी हेक्स कोड में समान रंग के नाम नहीं हैं (केवल 433 रंग हैं, grDevicesलेकिन कई और अधिक हेक्स कोड हैं)
जेलेनाउक्लीना

मैं के बारे में उल्लेख कर रहा हूँ col=sample(col_vector, n)से RColorBrewerअपने कोड स्निपेट में पैकेज। उदाहरण के लिए, #B3E2CD, #E78AC3, #B3DE69उपलब्ध रंगों के नाम कैसे खोजें sample(col_vector,3)। वैकल्पिक रूप से, brewer.palउनके रंग नामों के साथ फ़ंक्शन द्वारा दिए गए सभी हेक्स कोड को कैसे ढूंढें ।
प्रदीप

2
@ प्रदीप, जैसा कि RColorBrewerपैलेट grDevicesरंगों से व्युत्पन्न नहीं हैं, जिनके नाम मैप हैं, लेकिन सिर्फ हेक्स कोड हैं, मेरे ज्ञान के लिए, आप RColorBrewerपैलेट के साथ भी ऐसा नहीं कर सकते हैं , यहां तक ​​कि गुणात्मक भी।
जेलेनाउक्लीना

1
@ytu तो रंग भेद नहीं कर रहे हैं। यदि बिल्कुल आवश्यक हो, तो मैं आर में "ढाल निर्माण" की तलाश करने का सुझाव दूंगा और फिर रंगों के यादृच्छिक नमूने का उपयोग करूंगा। लेकिन रंगों से कारकों तक मानचित्रण काम नहीं करेगा, मानव धारणा शायद 20 - 40 रंगों को संभाल सकती है, बाकी इतना अलग नहीं है।
जेलेनाउक्लिना

70

यहाँ कुछ विकल्प दिए गए हैं:

  1. paletteसमारोह पर एक नजर :

     palette(rainbow(6))     # six color rainbow
     (palette(gray(seq(0,.9,len = 25)))) #grey scale
  2. और colorRampPaletteसमारोह:

     ##Move from blue to red in four colours
     colorRampPalette(c("blue", "red"))( 4) 
  3. को देखो colorBrewerपैकेज (और वेबसाइट )। यदि आप रंगों को बदलना चाहते हैं, तो साइट पर डायवर्जिंग का चयन करें । उदाहरण के लिए,

     library(colorBrewer)
     brewer.pal(7, "BrBG")
  4. मैं चाहता हूँ रंग वेब साइट अच्छा पट्टियाँ के बहुत सारे देता है। फिर से, केवल उस पैलेट का चयन करें जिसकी आपको आवश्यकता है। उदाहरण के लिए, आप साइट से आरजीबी रंग प्राप्त कर सकते हैं और अपना स्वयं का पैलेट बना सकते हैं:

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

आपके उत्तर के लिए धन्यवाद। यह रंग उत्पन्न करता है, लेकिन कुछ एक दूसरे के साथ बहुत विशिष्ट नहीं हैं। शायद मुझे अपने प्रश्नों में उस पर अधिक जोर देना चाहिए था।
आरएनए

1
@RNA मैंने अपना उत्तर अपडेट कर दिया है। आप डायवर्टिंग पैलेट प्राप्त करने के लिए सुझावों 3 और 4 का उपयोग कर सकते हैं ।
csgillespie

1
I want hueएक बहुत बढ़िया वेबसाइट है। यह वही है जो मैं चाहता हूं। एक संख्या को देखते हुए, रंगों की संख्या का एक पैलेट कैसे उत्पन्न किया जाए। लेकिन क्या हम इसे R में स्वचालित रूप से कर सकते हैं?
आरएनए

ये अदभुत है। हालाँकि, उस वेब साइट के पीछे बहुत सारी मशीनरी है। मुझे नहीं लगता कि इसे फिर से लागू करना तुच्छ होगा। यह अच्छा होगा यदि i want hueएक एपीआई था जो इसे स्वचालित रूप से क्वेरी करने की अनुमति देता है (शायद यह करता है - मैं लंबे समय तक नहीं देख रहा था)
बेन बोल्कर 7'13

8
@BenBolker - मैं की एक आर संस्करण के लिए एक सार कर दिया है i want hue, यहाँ । दक्षता में सुधार किया जा सकता है (जैसे डेटा वस्तुओं के रूप में रंगीन नमूनों को सहेजकर), लेकिन सामान्य विचार है। (लोड के साथ devtools::source_gist('45b49da5e260a9fc1cd7'))
16

36

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

यहाँ छवि विवरण दर्ज करें


3
धन्यवाद। मुझे unname(distinctColorPalette(n))इस काम को ggplot के साथ बनाने के लिए उपयोग करना था । मुझे लगता है कि ggplot को एक अनाम वेक्टर की आवश्यकता है। col_vector <- unname(distinctColorPalette(n))और फिर... + scale_color_manual(values=col_vector) ...
गौरव

19

ओपी के सवाल का जवाब नहीं है लेकिन यह ध्यान देने योग्य है कि वहाँ है viridis पैकेज है जिसमें अनुक्रमिक डेटा के लिए अच्छे रंग पट्टियाँ हैं। वे अवधारणात्मक रूप से एकसमान, रंगीनब्लेंड सुरक्षित और प्रिंटर के अनुकूल हैं।

पैलेट प्राप्त करने के लिए, बस पैकेज स्थापित करें और फ़ंक्शन का उपयोग करें viridis_pal()। चुनने के लिए चार विकल्प "ए", "बी", "सी" और "डी" हैं

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

यहाँ छवि विवरण दर्ज करें

यहाँ छवि विवरण दर्ज करें

यहाँ छवि विवरण दर्ज करें

YouTube पर अच्छे कॉलॉर्मैप की जटिलता की व्याख्या करने वाली एक उत्कृष्ट बात है:

एक बेहतर डिफ़ॉल्ट Colormap Matplotlib के लिए | SciPy 2015 | नथानिएल स्मिथ और स्टीफन वैन डेर वॉल्ट


17
विशिष्ट रंगों के लिए यह इतना उपयुक्त नहीं है।
क्रिस्टोफर जॉन

13

आप 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अन्य उपलब्ध पट्टियों के लिए पैकेज देखें । उम्मीद है की यह मदद करेगा।


1
धन्यवाद। मुझे आखिरी विकल्प पसंद है brewer.pal। लेकिन यह 9 रंगों तक सीमित है। मेरे पास वास्तव में 9 से अधिक श्रेणियां हैं। पहले विकल्प एक ढाल रंग उत्पन्न करते हैं, जो कि जितना मैं चाहता हूं उतना विशिष्ट नहीं है।
आरएनए

2
आप कई "अलग" रंगों का चयन करने में सक्षम नहीं होंगे। आप मान सकते हैं कि मैं अधिकतम 12 हूं। आपको colorbrewer2.org की जांच करनी चाहिए और रंगों को प्राप्त करना चाहिए (यदि मैं सही हूं तो 1 12 रंग पैलेट है)।
अरुण

12 से अधिक विशिष्ट कॉलआउट की तलाश करना मुश्किल होगा - मुझे लगता है कि कलरब्रेवर पेज पर इसके बारे में चर्चा है
अलेक्सां

यह ठीक है, जब तक कि वे "सबसे" विशिष्ट रंग उपलब्ध हैं, यहां तक ​​कि जब संख्या बढ़ती है, तो वे कम विशिष्ट होते जा रहे हैं।
आरएनए

3
यदि आपका मुद्दा समान रंगों के साथ-साथ है जब आसन्न श्रेणियों को सौंपा गया है (जैसा कि इंद्रधनुष पैलेट करेगा), तो आप बस इंद्रधनुष आउटपुट को कुछ के साथ यादृच्छिक कर सकते हैं जैसे: इंद्रधनुष (एन = 10) [नमूना (10)]
डेविड रॉबर्ट्स

11

मैं बड़े रंग पट्टियों के लिए एक बाहरी स्रोत का उपयोग करने के लिए पुनः आरंभ करूंगा।

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

विभिन्न मापदंडों के अनुसार पैलेट के किसी भी आकार की रचना करने के लिए एक सेवा है और

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

ग्राफिक्स डिजाइनरों के दृष्टिकोण से सामान्य समस्या पर चर्चा करता है और प्रयोग करने योग्य पैलेट के बहुत सारे उदाहरण देता है।

आरजीबी मूल्यों से एक पैलेट शामिल करने के लिए आपको बस एक वेक्टर में मानों को कॉपी करना होगा जैसे कि:

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

मुझे 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')

आप एक कोशिश कर सकते हैं!


1
यह वास्तव में इस सवाल का जवाब नहीं देता है, जो n विशिष्ट रंगों के निर्माण के बारे में है , न कि परिभाषित रंगों का एक सेट। अपने उत्तर को अपडेट करने का प्रयास करें
Michal

1

आप इस तरह रंगों का एक सेट उत्पन्न कर सकते हैं:

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

ये रंग यथासंभव अलग हैं। उन समान रंगों के लिए, वे एक ढाल बनाते हैं ताकि आप उनके बीच के अंतर को आसानी से बता सकें।


0

मेरी समझ में विशिष्ट रंगों की खोज एक यूनिट क्यूब से कुशलता से खोज करने से संबंधित है, जहां क्यूब के 3 आयाम लाल, हरे और नीले अक्षों के साथ तीन वैक्टर हैं। यह एक सिलेंडर (एचएसवी सादृश्य) में खोज करने के लिए सरल किया जा सकता है, जहां आप संतृप्ति (एस) और मूल्य (वी) को ठीक करते हैं और यादृच्छिक ह्यू मान पाते हैं। यह कई मामलों में काम करता है, और इसे यहाँ देखें:

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

आर में,

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

हालांकि, ध्यान दें कि, मानव बोधगम्य रंगों के साथ एक अलग पैलेट को परिभाषित करना सरल नहीं है। उपरोक्त दृष्टिकोण में से कौन सा विविध रंग सेट उत्पन्न करता है, इसका परीक्षण किया जाना बाकी है।


0

आप इस उद्देश्य के लिए पॉलिक्रोम पैकेज का उपयोग कर सकते हैं । इसके लिए बस रंगों की संख्या और कुछ की आवश्यकता होती है 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 पर अधिक जानकारी प्राप्त कर सकते हैं ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.