R에서 가장 독특한 색상을 생성하는 방법은 무엇입니까?


답변:


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

다른 해결책은 그래픽 장치에서 모든 R 색상을 가져 와서 샘플링합니다. 너무 비슷해서 회색 음영을 제거했습니다. 이 색상은 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 색 세트


16 진 코드 col를 해당 색상 이름 으로 변환 할 수 있습니까?
Prradep

@Prradep col무슨 뜻인가요? color그래픽 장치에서이 이름을 가지고있다. 일반적으로 모든 16 진 코드에 해당 색상 이름이있는 것은 아닙니다 (433 개의 색상 만 grDevices있지만 더 많은 16 진 코드가 있음)
JelenaČuklina

코드 스 니펫 col=sample(col_vector, n)RColorBrewer패키지에 대해 언급하고 있습니다 . 예를 들어에서 #B3E2CD, #E78AC3, #B3DE69사용할 수있는 색상 이름을 찾는 방법 은 다음과 같습니다 sample(col_vector,3). 또는 brewer.pal색상 이름을 가진 함수에 의해 제공된 모든 16 진 코드를 찾는 방법 .
Prradep

2
@Prradep, RColorBrewer팔레트는 grDevices색상에서 파생되지 않았 으며 이름이 매핑되었지만 16 진수 코드 일뿐이므로 RColorBrewer팔레트, 질적 팔레트 로도이 작업을 수행 할 수 없습니다 .
JelenaČuklina

1
@ytu 다음 색상을 구분할 수 없습니다. 절대적으로 필요한 경우 R에서 "그라데이션 생성"을 찾은 다음 무작위로 색상을 샘플링하는 것이 좋습니다. 그러나 색상에서 요인으로 매핑하는 것은 효과가 없으며 인간의 인식은 20-40 색상을 처리 할 수 ​​있으며 나머지는 그다지 다르지 않습니다.
JelenaČuklina

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. 내가 원하는 색상 웹 사이트는 좋은 팔레트를 많이 제공합니다. 다시, 필요한 팔레트를 선택하십시오. 예를 들어, 사이트에서 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)))

답변 주셔서 감사합니다. 색상을 생성하지만 일부는 서로 고유하지 않습니다. 어쩌면 나는 내 질문에서 그것에 대해 더 강조했을 것입니다.
RNA

1
@RNAer 나는 대답을 업데이트했다. 제안 3과 4를 사용하여 분기 팔레트 를 얻을 수 있습니다 .
csgillespie

1
I want hue멋진 웹 사이트입니다. 이것이 바로 내가 원하는 것입니다. 숫자가 주어지면 색상의 팔레트를 생성하는 방법. R에서 자동으로 할 수 있습니까?
RNA

대단해. 그러나 해당 웹 사이트 뒤에는 많은 기계가 있습니다. 나는 그것이 다시 구현하는 것이 사소한 것이라고 생각하지 않습니다. 있다면 좋을 것입니다 i want hue(- 나는 오랫동안 찾고 지출하지 않았다 어쩌면 않음)가 자동으로 조회 할 수있는 API했다
벤 Bolker을

8
@BenBolker - 난의 R 버전에 대한 요점을했습니다 i want hue, 여기 . 컬러 샘플을 데이터 객체로 저장하여 효율성을 향상시킬 수 있지만 일반적인 아이디어가 있습니다. (로로드 devtools::source_gist('45b49da5e260a9fc1cd7'))
jbaums

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

19

OP의 질문에 대한 답변은 아니지만 언급 할 가치가 있습니다. viridis 순차적 데이터에 적합한 색상 팔레트 패키지 있습니다. 그것들은 지각 적으로 균일하고 색맹 안전하며 프린터 친화적입니다.

팔레트를 얻으려면 패키지를 설치하고 함수를 사용하십시오 viridis_pal(). 선택할 수있는 옵션은 "A", "B", "C"및 "D"입니다.

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

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

YouTube에서 좋은 컬러 ​​맵의 복잡성을 설명하는 훌륭한 연설도 있습니다.

Matplotlib를위한 더 나은 기본 컬러 맵 | 사이 파이 2015 | 나다니엘 스미스와 스테판 반 데르 월트


17
독특한 색상에는 적합하지 않습니다.
Christopher John

13

colorRampPalette기본 또는 RColorBrewer패키지 에서 사용할 수 있습니다 .

을 사용하면 colorRampPalette다음과 같이 색상을 지정할 수 있습니다.

colorRampPalette(c("red", "green"))(5)
# [1] "#FF0000" "#BF3F00" "#7F7F00" "#3FBF00" "#00FF00"

16 진수 코드도 제공 할 수 있습니다.

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 개 이상의 범주가 있습니다. 첫 번째 대안은 그라디언트 색상을 생성하며, 이는 원하는만큼 독특하지 않습니다.
RNA

2
많은 "고유 한"색상을 선택할 수 없습니다. 내가 생각하는 최대 12를 얻을 수 있습니다. colorbrewer2.org를 확인 하고 색상을 가져와야 합니다 ( 정확한 경우 1 12 색상 팔레트가 있음).
Arun

12 가지가 넘는 독특한 콜 아웃을 찾는 것은 어려울 것입니다
컬러

사용 가능한 "가장 독특한"색상이라면 숫자가 올라갈 때 덜 두드러지게됩니다.
RNA

3
레인보우 팔레트에서와 같이 인접한 범주에 할당 할 때 비슷한 색상이 나란히 비슷한 경우 레인보우 출력을 다음과 같이 임의로 무작위로 지정할 수 있습니다. rainbow (n = 10) [sample (10)]
David Roberts

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

그래픽 디자이너 관점에서 일반적인 문제를 논의하고 사용 가능한 팔레트의 많은 예를 제공합니다.

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

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 차원이 빨강, 녹색 및 파랑 축을 따라 3 개의 벡터 인 단위 큐브에서 효율적으로 검색하는 것과 관련이 있습니다. 채도 (S)와 값 (V)을 고정하고 임의의 색조 값을 찾는 실린더 (HSV 유추)에서 검색하도록 단순화 할 수 있습니다. 많은 경우에 작동하며 여기를 참조하십시오.

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

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

그러나 사람이 인식 할 수있는 색상으로 고유 한 팔레트를 정의하는 것은 간단하지 않습니다. 위의 방법 중 다양한 색상 세트를 생성하는 방법은 아직 테스트되지 않았습니다.


0

이를 위해 Polychrome 패키지를 사용할 수 있습니다 . 그것은 단지 색깔의 수와 몇 가지를 요구합니다 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 에서 확인할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.