범주 형 데이터 집합을 플로팅하고 다른 범주를 나타내는 데 고유 한 색을 사용하려고합니다. 숫자가 주어지면 R에서 가장 많은 고유 색상을 n
어떻게 얻을 n
수 있습니까? 감사.
범주 형 데이터 집합을 플로팅하고 다른 범주를 나타내는 데 고유 한 색을 사용하려고합니다. 숫자가 주어지면 R에서 가장 많은 고유 색상을 n
어떻게 얻을 n
수 있습니까? 감사.
답변:
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
그래픽 장치에서이 이름을 가지고있다. 일반적으로 모든 16 진 코드에 해당 색상 이름이있는 것은 아닙니다 (433 개의 색상 만 grDevices
있지만 더 많은 16 진 코드가 있음)
col=sample(col_vector, n)
의 RColorBrewer
패키지에 대해 언급하고 있습니다 . 예를 들어에서 #B3E2CD, #E78AC3, #B3DE69
사용할 수있는 색상 이름을 찾는 방법 은 다음과 같습니다 sample(col_vector,3)
. 또는 brewer.pal
색상 이름을 가진 함수에 의해 제공된 모든 16 진 코드를 찾는 방법 .
RColorBrewer
팔레트는 grDevices
색상에서 파생되지 않았 으며 이름이 매핑되었지만 16 진수 코드 일뿐이므로 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) ...
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 | 나다니엘 스미스와 스테판 반 데르 월트
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
사용 가능한 다른 팔레트 는 패키지를 참조하십시오. 도움이 되었기를 바랍니다.
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 차원이 빨강, 녹색 및 파랑 축을 따라 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
그러나 사람이 인식 할 수있는 색상으로 고유 한 팔레트를 정의하는 것은 간단하지 않습니다. 위의 방법 중 다양한 색상 세트를 생성하는 방법은 아직 테스트되지 않았습니다.
이를 위해 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 에서 확인할 수 있습니다.